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.

Written before 6.0.0

This post is the record of a release that shipped before 6.0.0, which renamed the plugin's post types, taxonomies, options, meta keys and hooks. The identifiers below are the names those versions actually used, and they are kept that way on purpose. For the current names — and a conversion table — see the 6.0.7 release post.

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 v4.38.0.