Rentiva v4.37.0 — Bayi Genel Profil Sayfası
Her onaylı bayinin artık halka açık bir yüzü var. v4.37.0, /vendor/<slug>/ (Türkçe sitelerde /bayi/<slug>/) adresinde ayrı bir profil sayfası sunuyor — canonical bir shortcode, bir Gutenberg bloğu ve bir Elementor widget'ı, hepsi tek bir renderer'a bağlı. <head> içinde Schema.org LocalBusiness JSON-LD emit ediliyor; arama motorları ve sosyal önizlemeler artık bayiyi anasayfanın bir parçası olarak değil, bağımsız bir varlık olarak okuyabiliyor.
Neden
Rentiva'nın büyük bir kısmında bayiler platformun kendi listeleme ekranlarının içinde yaşıyordu. Müşteri belirli bir aracı bulabiliyordu, ama bir bayiye iniş yapma yolu yoktu — filo'yu kimin yönettiğini, güvenilirlik puanını ve doğrulama rozetini görmek, diğer araçlarına göz atmak, geçmiş yorumları okumak için bir sayfa yoktu. Arama motorlarının da indeksleyecek bir şeyi yoktu: canonical URL yok, schema yok, breadcrumb yok.
v4.37.0 bu açığı kapatıyor. Her bayi sabit bir URL'e, yapısal bir profile ve bayi bilgisini istediğin yere düşürmek için kullanabileceğin bir renderer'a sahip — anasayfa bloğu, Elementor şablonu, özel bir sayfaya yapıştırılan shortcode.
i18n duyarlı base URL
URL pattern, WooCommerce'in çevrilebilir /shop/, /product/ slug'larını izliyor:
- İngilizce site:
/vendor/<slug>/ - Türkçe site:
/bayi/<slug>/
Base segment _x('vendor', 'URL slug', 'mhm-rentiva') ile geliyor, site sahibi override için apply_filters('mhm_rentiva_vendor_profile_url_base', …) filtresinden geçiyor, ardından güvenlik için urldecode() ve sanitize_title() uygulanıyor. Herhangi bir locale yalnızca vendor URL slug bağlamını çevirir, rewrite rule bir sonraki flush_rewrite_rules() ile kendini yeniden kuruyor.
Bayinin URL slug'ı değiştiğinde (admin slug alanını düzenler veya otomatik üretici farklı bir collision suffix seçer), önceki slug bir slug-history listesine ekleniyor ve yeni canonical URL'e 301 redirect kaydediliyor. Eski linkler 404 vermez — yönlendirilir.
Tek canonical renderer
Üç render yolu, tek kaynak:
[rentiva_vendor_profile]shortcodemhm-rentiva/vendor-profileGutenberg bloğumhm_rentiva_vendor_profileElementor widget'ı
Block ve widget shortcode'a delege ediyor. Shortcode bir partials zincirine delege ediyor (vendor-profile-hero.php, vendor-profile-vehicles.php, vendor-profile-reviews.php, vendor-profile-location.php). Müşteri hangi yüzeyden gelirse gelsin — rewrite rule'un yönlendirdiği halka açık profil URL'i, özel bir sayfaya gömülü blok, veya builder sayfasındaki Elementor widget'ı — HTML birebir aynı.
Bu, Rentiva'nın 19 blok + 20 widget genelinde uyguladığı aynı Render Parity disiplini: blok/widget render mantığını asla kopyalamaz, delege eder.
SEO için Schema.org
Bir bayi profilinin <head>'i Schema.org LocalBusiness JSON-LD taşır:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Bayi görünen adı",
"url": "https://example.com/bayi/<slug>/",
"image": "https://example.com/.../avatar.jpg"
}
Yoast SEO ve Rank Math kendi canonical filter zincirlerini çalıştırıyor; v4.37.0 wpseo_canonical ve rank_math/frontend/canonical filter'larını PHP_INT_MAX-10 priority ile bağlıyor — bu sayede vendor profile URL'i, bu eklentilerin non-singular sayfalar için varsayılan olarak ayarladığı anasayfa canonical'ını eziyor.
Düşmanca bayi adları schema'yı da kıramaz — JSON encoder JSON_HEX_TAG kullanıyor, yani display_name içine </script> injection denemesi script elementinden kaçmak yerine hex-encoded oluyor. Ve url_for_user() boş string döndürürse (bayinin slug'ı henüz yok), schema build kısa devre yapıp hiçbir şey emit etmiyor — eksik URL'li geçersiz LocalBusiness çıkmıyor.
Bayi admin güncellemeleri
Bayi kullanıcı profil ekranında iki yeni alan görünüyor:
- Bayi avatarı — bir Media Library yükleyici. Seçilen ek,
LocalBusiness.imageve profil hero'da render edilen şey. Boşken kullanıcının e-postasının Gravatar'ına düşüyor. - Genel Profil URL Slug'ı — canlı collision kontrolü olan bir text field. Otomatik üretici diakritikleri kaldırıyor (
Yeni Satıcı→yeni-satici) ve collision'da numeric suffix ekliyor (yeni-satici-2).
Idempotent slug backfill upgrade'de bir kez çalışıyor. Mevcut bayiler görünen adlarından türetilmiş ASCII slug alıyor; migration bir version flag ile gate'lenmiş ve operatörün zaten ayarladığı bir slug'ı asla ezmiyor.
Doğrulanmış Bayi / Yeni Bayi rozetleri
Profil hero, admin'de yapılandırılabilir eşiklere göre iki rozetten birini gösteriyor:
- Doğrulanmış Bayi — bayi en az N tamamlanmış rezervasyona VE yapılandırılan tabandaki ya da üzerindeki güvenilirlik puanına sahip.
- Yeni Bayi — bayi son N gün içinde onaylandı.
İki eşik de MHM Rentiva → Ayarlar altında yaşıyor, mantıklı varsayılanlara sahip (30 tamamlanmış rezervasyon + 80 güvenilirlik puanı; yeni için 90 gün) ve rozetin render edildiği her yerde aynı VendorBadgeEligibility pure-logic sınıfı besliyor.
Neyin değiştiğini bilen cache invalidator
Bayi profil verileri user ID + cap suffix ile anahtarlanmış bir transient'te cache'leniyor. Yedi tetikleyici onu invalidate ediyor:
- Bayi user-meta değişikliği (display name, slug, avatar, bio, badge override, vb.)
- Rezervasyon kaydet (yeni tamamlanan rezervasyon güvenilirlik puanını kaydırabilir)
- Yorum durum değişikliği (yeni onaylanmış değerlendirme ortalama puanı etkiler)
- Araç lifecycle değişikliği (durdurulmuş araç bayinin araç listesinden çıkar)
- Profile update hook (
profile_update)
Cache key suffix maksimum araç ve değerlendirme version stamp'lerini encode ediyor; bu yüzden invalidator önceden tam suffix'i hesaplamak zorunda kalmadan SQL prefix-wildcard delete kullanıyor (DELETE FROM …_options WHERE option_name LIKE '_transient_mhm_rentiva_vendor_profile_<user_id>_%').
i18n temizliği
Implementasyonun Phase 10'u 19 Türkçe çeviriyi yeniledi:
- Dördü yeni dolduruldu (öncesinde İngilizce fallback render ediyordu): "Public Profile URL Slug", "Member %s", "No reviews yet — be the first to leave one.", "→ %s"
- On beş fuzzy marker temizlendi: "Vendor Avatar" → "Bayi Avatarı", "Verified Vendor" → "Doğrulanmış Bayi", "New Vendor" → "Yeni Bayi", "Recent Reviews" → "Son Değerlendirmeler", "View all vehicles →" → "Tüm araçları görüntüle →", ve on tane daha.
Tarayıcı smoke testi canlı profilde sıfır İngilizce fallback sızıntısı doğruladı.
Pro gate
Tüm özellik Mode::canUseVendorMarketplace arkasında — mevcut bayi admin panelini koruyan aynı gate. Lite kurulumlar rewrite rule görmez, admin alanları görmez, schema emisyonu görmez. Dev siteler wp-config.php'ye define('MHM_RENTIVA_DEV_PRO', true); ekleyerek lokal'de gate'i atlatabiliyor.
Sayılar
- PHPUnit: 904 → 982 (+78, dokuz implementation faz boyunca)
- Doğrulamalar: 3162
- PHPCS: 0 hata
- i18n: 19 TR çeviri yenilendi (4 yeni dolduruldu, 15 fuzzy temizlendi)
- Yeni PHP sınıfları:
VendorProfileUrlBase,VendorProfileRewrite,VendorProfileProvider,VendorProfileSchema,VendorProfileExtension,VendorProfileCacheInvalidator,VendorSlugManager,VendorSlugMigration,VendorBadgeEligibility,VendorProfileWidget,VendorProfileBlock - Render yüzeyleri: 1 shortcode + 1 blok + 1 Elementor widget'ı tek renderer'a delege ediyor
