Rentiva v4.38.0 — Vendor Directory Page
A public, Pro-gated vendor catalogue lands in Rentiva. Customers can now discover all your active vendors in one place — filter by city, badge status, and minimum rating; sort by reputation, recency, or alphabetically; click any card to land on the vendor's public profile (introduced in v4.37.0). This release closes the marketplace discovery loop.
What's new
/vendors/directory page (TR/bayiler/) — single-page catalogue, server-rendered, no-JS friendly, SEO-first.- Filter set — city dropdown (combined from vendor headquarters + vehicle pickup locations), badge toggle (Verified / New), minimum rating (3+ / 4+ / 5).
- Default sort — Highest rated first, with newest member as tie-breaker. Newest and alphabetical sort options also available.
- Trio renderer —
[rentiva_vendor_directory]shortcode, Gutenberg block (mhm-rentiva/vendor-directory), Elementor widget. All three delegate to the same canonical render viado_shortcode()— no dual pipeline. - SEO — Schema.org
ItemList+BreadcrumbListJSON-LD with automatic SEO plugin probe (Yoast / Rank Math / AIOSEO / SEOPress / The SEO Framework / SmartCrawl). Plugin emits its own breadcrumb only when no SEO plugin is active. Filter args are reflected in the schema (canonical/render parity for crawlers). - 30-min transient cache — fast page loads, prefix-wildcard SQL invalidation when vendor data changes (status, city, reliability score, vehicle save, comment status, lifecycle, profile update). Bio and avatar changes intentionally don't invalidate (deliberate scope reduction — directory cards don't render those, would cause spurious flushes).
Pro Gate
The Vendor Directory is a Pro feature (vendor_marketplace flag). Lite users see a WordPress 404 on /vendors/ (dispatch-time gate) and any block/widget/manual shortcode usage returns empty (render-time gate). Upgrade prompts live on /pricing and the existing pricing-table shortcode.
Compact card design
Each vendor card shows: avatar (SVG initials fallback inherited from v4.37.2), display name, city, vehicle count (singular/plural), badge label (✓ Doğrulanmış Bayi / Yeni Bayi), rating bar with count, "Profili görüntüle →" CTA. The whole card is clickable (Popular Routes v4.34.1 pattern parity).
Mobile-first responsive grid
- Desktop (≥1024px): 4-col
- Tablet (≥600px): 2-col
- Phone (
<600px): 1-col stack with native HTML5<details>filter sheet (no-JS friendly)
The 600px breakpoint matches v4.37.2 B10 (phone-landscape 568px collapses cleanly). All CSS classes are scoped under .mhm-vendor-directory-* namespace — zero risk of theme/plugin generic class collision (.label, .card, .filter-bar, .pagination all forbidden per v4.37.2 B7 lesson).
i18n
_x('vendors', 'URL slug', 'mhm-rentiva') translates to bayiler in TR. Filter override mhm_rentiva_vendor_directory_url_base lets site owners set custom slugs (e.g., dealers, firmalar). Defensive ASCII sanitize + empty fallback. Locale change auto-flushes rewrite rules.
~25 new EN source strings, all TR-translated. Plus 5 new filter hooks for developers:
mhm_rentiva_vendor_directory_url_basemhm_rentiva_vendor_directory_per_pagemhm_rentiva_vendor_directory_empty_messagemhm_rentiva_vendor_directory_page_titlemhm_rentiva_vendor_directory_meta_descriptionmhm_rentiva_vendor_directory_seo_disable(global kill switch)
Behind the scenes
Three reviewer-caught bugs were closed before this release:
- Phase 3 spec drift (KRITIK):
VendorProfileProvider::aggregate_rating_for_vendor()did not exist (Profile had a privateaggregate_rating()withaveragekey, notavg). The directory's test seam masked the bug — production rating filter, sort, and card data would have silently returned 0.0. New public wrapper added (additive, no internal Profile change). - Phase 7 dispatch gap (KRITIK):
template_includefilter was missing — the page wrapper would never serve. Closed in Phase 9 wiring. - Phase 10 UI bug: Browser smoke test caught a
<details>collapse bug — filter dropdowns rendered in DOM but invisible (width: 0px) on desktop because the native UA stylesheet hides children of a closed<details>. Fixed with<details open>initial state.
Compatibility
- WordPress 6.7+
- WooCommerce 8.0+ (existing vendor marketplace requirement)
- Elementor 3.20+ (optional, only if you use the widget)
- All 6 major SEO plugins coexist cleanly via class/constant probe — your existing SEO setup is preserved
Tests & metrics
- 1044 PHPUnit tests (1007 baseline + 37 new directory tests) —
OK, 3289 assertions, 7 skipped - 0 PHPCS errors full project (CI parity gate)
- 8-checkpoint Chrome DevTools MCP browser smoke green at desktop (1280px) and mobile (390px)
