Ana içeriğe geç

Rentiva v4.37.0 — Bayi Genel Profil Sayfası

· 5 dakikalık okuma
MaxHandMade
Maintainer

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.

6.0.0 öncesinde yazıldı

Bu yazı, 6.0.0'dan önce çıkmış bir sürümün kaydıdır; 6.0.0 eklentinin içerik tiplerini, taksonomilerini, ayarlarını, meta anahtarlarını ve hook'larını yeniden adlandırdı. Aşağıdaki tanımlayıcılar o sürümlerin gerçekten kullandığı adlardır ve bilerek öyle bırakılmıştır. Güncel adlar ve dönüşüm tablosu için 6.0.7 sürüm yazısına bakın.

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] shortcode
  • mhm-rentiva/vendor-profile Gutenberg bloğu
  • mhm_rentiva_vendor_profile Elementor 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.image ve 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

Linkler​

  • GitHub release v4.37.0
  • Pull request #4