Skip to main content

Rentiva v4.38.0 — Vendor Directory Page

· 4 min read
MaxHandMade
Maintainer

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 via do_shortcode() — no dual pipeline.
  • SEO — Schema.org ItemList + BreadcrumbList JSON-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_base
  • mhm_rentiva_vendor_directory_per_page
  • mhm_rentiva_vendor_directory_empty_message
  • mhm_rentiva_vendor_directory_page_title
  • mhm_rentiva_vendor_directory_meta_description
  • mhm_rentiva_vendor_directory_seo_disable (global kill switch)

Behind the scenes

Three reviewer-caught bugs were closed before this release:

  1. Phase 3 spec drift (KRITIK): VendorProfileProvider::aggregate_rating_for_vendor() did not exist (Profile had a private aggregate_rating() with average key, not avg). 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).
  2. Phase 7 dispatch gap (KRITIK): template_include filter was missing — the page wrapper would never serve. Closed in Phase 9 wiring.
  3. 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)

Get the release

Download v4.38.0 ZIP from GitHub.