Rentiva v4.38.1 — Audit-driven yama
v4.38.0'ın üzerine küçük ama önemli bir yama. Vendor Directory yayınından sonra v4.37.0 → v4.38.0 zincirine /wp-conductor post-merge audit'i çalıştırdık — iki gerçek bulgu ve yeni test kapsamının ortaya çıkardığı uyuyan bir üretim defekti çıktı. v4.38.1 hepsini kapatıyor; altı release'lik deploy paketini temiz şekilde göndermek için.
Ne değişti
🔴 YÜKSEK — Admin slug düzenlemede çakışma
WordPress admin'den bir bayinin profil slug'ını düzenlediğinizde, save yolu slug'ı VendorSlugManager::change_slug() üzerinden geçirmek yerine doğrudan update_user_meta() ile yazıyordu. v4.37.0 Phase 1.3'ten kalan bir // later TODO'su.
Pratik etki: İki admin (veya admin + kendi profilini düzenleyen bayi) aynı raw slug'ı farklı bayilere verirse ikisi de başarılı olur. VendorProfileProvider::lookup_by_slug() ilk eşleşeni döndürür → ikinci bayinin public profil URL'si sessizce yanlış bayiyi render ederdi — ücretli Pro müşterileri için, bir marketplace'te, kalıcı olarak.
Save yolu artık change_slug() üzerinden geçiyor; sanitize + çakışma suffix'i (-2, -3...) + history sanitize'i tek atomik adımda yapıyor.
🟡 ORTA — Directory araç sayısı ile Profile tutarsızlığı
VendorDirectoryProvider::count_active_vehicles_for() _mhm_vehicle_lifecycle_status'ten bağımsız olarak her publish aracı sayıyordu. Profile tarafındaki collect_vehicles() ise lifecycle='active' filtresi uyguluyor. Sonuç: 2 aktif + 3 paused araçlı bir bayi dizin kartında "5 araç" gösterirken profilde "2 araç" görünüyordu. Marketplace veri tutarsızlığı = güven kaybı.
Count sorgusuna aynı meta_query lifecycle filtresi eklendi.
🐛 Uyuyan üretim defekti — pagination strict-type TypeError
Bu yamadaki yeni kombinasyon testleri v4.38.0'ın mevcut testlerinin hiç çalıştırmadığı bir şeyi yakaladı: dizin pagination partial'ı str_replace()'in birinci argümanına $big = 999999999 (int) geçiyordu. PHP 8.1+ strict types TypeError fırlatır.
Mevcut testler hiçbir zaman per_page=12'yi aşacak kadar bayi seed'lemiyordu, bu yüzden defekt uyuyordu. PHP 8.x üretim siteleri 13. aktif bayi sonuç setini ilk sayfayı geçtiği anda dizin sayfasını çökertirdi. Açıkça (string)'e cast yapıldı — WP core'un kendi callers'ında kullandığı pattern'le aynı.
Bu, v4.38.0'ı tek başına yayınlamamanın en güçlü argümanı.
📌 Phase 5/6/7 paper-cut'ları
v4.38.0 audit'inin önceden ertelenmiş olarak belgelediği üç küçük parite düzeltmesi:
- VendorDirectorySeo register guard — bir SEO eklentisi (Yoast / Rank Math / AIOSEO / SEOPress / The SEO Framework / SmartCrawl) sözleşmeyi sahipleniyorsa veya
mhm_rentiva_vendor_directory_seo_disablefiltresi true ise erken dönüş.VendorProfileSeo'nun register guard'ı ile parite. Ayrıcabuild_meta_description($default, $vendor_count, $vehicle_count)için 3-arg filter imzasını DocBlock'la belgeledim. - VendorDirectoryCacheInvalidator — iki parite guard'ı: user_meta hook'larında
!is_string($meta_key)kısa devre (meta_key'in array geldiği nadir WP edge case'i —VendorProfileCacheInvalidator'da zaten vardı) ve lifecycle hook'unda$new_status === $old_statusno-op erken dönüşü (aynı sınıftakion_comment_statusno-op'u ile parite). 30dk dizin önbelleğini boşa düşüren gereksiz flush'ları önler. - Pagination/sort kombinasyon testleri +
.currentscope — pagination overflow, city filtresi ile alpha sort ve sayfa 2 paged query string'i kapsayan üç yeni test..currentpagination class'ının.mhm-vendor-directory-paginationscope'u içinde kaldığını doğrular; tema.currentkuralları artık stil hijack edemez.
Pipeline gate'leri
- PHPUnit: 1044 → 1058 test, 3289 → 3320 assertion, 7 atlanan, 0 fail
- PHPCS: 0 hata (tüm proje, CI paritesi)
- Bağımsız kod incelemesi:
merge'e hazır, KRİTİK/YÜKSEK bulgu yok
Deploy notu
v4.38.1'i v4.37.0 + v4.37.1 + v4.37.2 + v4.37.3 + v4.38.0 zinciriyle birlikte yayınlayın — tek mhmrentiva.com deploy'unda altı release. Ayrı bir upgrade yolu gerekmez.
