Ana içeriğe geç

Rentiva v4.37.1 — Bayi profil hotfix'i

· 4 dakikalık okuma
MaxHandMade
Maintainer

Aynı sabah yayınlanan v4.37.0 bayi profil sayfasında smoke testte yakalanan üç bulgu v4.37.1'de kapatıldı: her bayide puan/ rezervasyon farketmeksizin "Yeni Bayi" rozetine takılı kalan rozet, rakamı aslında rezervasyon-zamanı yıldız değerlendirme sayısı olan ama "X yorum" yazan yanıltıcı etiket, ve 3rd-party plugin'lerden import edilen yorumlarda kaybolan yıldızlar.

Aynı gün hotfix neden gerekli oldu

v4.37.0 bu sabah dokuz implementation faz boyunca yayınlandı, 78 yeni testle. PHPUnit yeşildi, PHPCS temiz, dispatch path'i uçtan uca çalışıyordu. Ama production'a giren üç bug, unit test'in kolayca yakalayamayacağı türdendi:

  • Bir wiring bug'ı — yanlış init bucket'ta registration — ki test fixture'ı bunun üstünü filter callback'i açıkça ekleyerek örtüyordu.
  • Bir semantic bug — çevrilebilir bir string'de yanlış kelime — makine-okunabilir hiçbir kontrol bunu flag'lemez.
  • Bir defansif eksiklik — sadece canonical meta key'i kontrol etmek, WC-standardı alternatifini değil — ki 3rd-party plugin yorumu import ettiği gün ısırır.

Browser smoke üçünü de 3 test bayisi seed'ledikten dakikalar sonra yakaladı. Fix matrisi yeterince küçük olduğu için aynı-gün patch doğru tercih.

B1 — Rozet "Yeni Bayi"de takılı kalmıştı

Rozet evaluator üç eşik kontrol ediyor: hesap yaşı, güvenilirlik puanı, ömür-boyu tamamlanmış rezervasyonlar. Tamamlanmış rezervasyon sayısı bir filter'dan geliyor:

$completed = (int) apply_filters(
'mhm_rentiva_vendor_completed_bookings_count',
0, // default
$user_id
);

Bu filter'ın production callback'i VendorProfileExtension::register() içinde register ediliyor. Plugin.php bu metodu initialize_admin_services() — yani admin-only init bucket'tan çağırıyor. Public isteklerde (is_admin() === false) bucket hiç çalışmıyor, callback kaydedilmiyor, count 0'a default'lanıyor. Her bayi gerçek rezervasyon geçmişi ne olursa olsun STATUS_NEW branch'ına düşüyor.

Bu Phase 9'da yakaladığımız aynı is_admin() bucket trap'i — VendorProfileSchema::register() başlangıçta admin-only bucket'a konulmuştu, browser smoke JSON-LD'nin emit edilmediğini yakalayınca context-agnostic bucket'a taşındı. VendorProfileExtension::register() admin bucket'ında durması doğru (admin-only profile screen hook'larını sahipleniyor), ama filter-callback yan etkisi bug'ı frontend'e sızdırdı.

Düzeltme: rozeti o wiring'e bağımlı olmaktan çıkarmak:

$default_completed = class_exists(ReliabilityScoreCalculator::class)
? ReliabilityScoreCalculator::count_completed_bookings($user_id, 9999)
: 0;

$completed = (int) apply_filters(
'mhm_rentiva_vendor_completed_bookings_count',
$default_completed,
$user_id
);

Filter callback'leri özel durumlarda (lifecycle ceza süspansiyonu, manuel admin override, vb.) sayıyı yine override edebilir. Default artık gerçek bir sayı, birinin wire etmesini bekleyen bir placeholder değil.

B2 — Hero etiketi "X yorum" yanlış kelimeydi

Bayi profili hero'su agregat rating verisini gösteriyor:

★★★★½ 4,8 ( 25 değerlendirme )

Bu 25, bayinin aktif araçları bazında _mhm_rentiva_rating_count toplamı — rezervasyon-zamanı yıldız değerlendirmeleri, müşteri kiralamayı tamamlayıp aracı puanladığında set ediliyor. Hero'nun altındaki Son Değerlendirmeler section'ı ayrı bir akış — aynı vehicle post'larındaki WP review yorumları. Bir bayi rahatlıkla 25 rezervasyon değerlendirmesine ve 4 yazılı yoruma sahip olabilir. Hero "25 yorum" diyordu, section 4 gösteriyordu, matematik tutmuyordu.

Düzeltmenin kolay yarısı: i18n string'i %d review / %d reviews yerine %d rating / %d ratings (Türkçe: %d değerlendirme). Aynı sayı, dürüst etiket.

Sorunun zor yarısı — hero rezervasyon-rating sayısı yerine WP yorum sayısını mı göstermeli? — ertelendi. Rezervasyon-rating ortalaması alıcı için daha kullanışlı bir metrik çünkü tamamlanmış işlemlere bağlı, görüşlere değil. Etiketi yeniden adlandırmak bu bilgiyi koruyor.

B3 — 3rd-party import'larda yorum yıldızları boş

VendorProfileProvider::collect_reviews() review başına render verisi kuruyor:

'rating' => (int) get_comment_meta($comment_id, 'mhm_rating', true),

mhm_rating Rentiva'nın canonical key'i, VehicleRatingForm ve ReviewEnforcer normalization hook'u tarafından set ediliyor. Rentiva'nın kendi formu üzerinden gönderilen yorumlar bu key'i güvenilir biçimde alıyor. Ama yorumları bir 3rd-party plugin'den import eden bir bayi — WC product reviews'in vehicle post'larına migration'ı, Site Reviews / Customer Reviews for WooCommerce, manuel DB seed — tipik olarak WC standardı rating key'ini yazıyor. Fallback olmadan, bu yorumlar profilde rating değeri DB'de duruyor olmasına rağmen boş yıldızlarla görünüyor.

Düzeltme tek-helper'lık değişiklik:

private static function resolve_review_rating(int $comment_id): int
{
$rating = (int) get_comment_meta($comment_id, 'mhm_rating', true);
if ($rating > 0) {
return $rating;
}
return (int) get_comment_meta($comment_id, 'rating', true);
}

Canonical varsa kazanır; WC-standardı yoksa devreye girer.

Doğrulama

Lokal DB'ye direkt seed edilmiş üç test bayisi:

BayiPuanRezervasyonOnay tarihiBeklenenSonuç
Akif Yıldız9220200 gün önceVerified✓ Doğrulanmış Bayi
Zeynep Demir8811335 gün önceVerified✓ Doğrulanmış Bayi
Mehmet Çelik45221 gün önceNewYeni Bayi

Üçü de her review item'da yıldız ratinglerini render ediyor; hero etiketi X değerlendirme (TR) / X ratings (EN) okunuyor.

PHPUnit 982 → 987'ye çıktı, iki yeni regression test class'ı ile (VendorBadgeDefaultFallbackTest 2 test, VendorProfileReviewRatingFallbackTest 3 test). Rozet fallback testi bilinçli olarak filter callback registration'ını ATLIYOR — v4.37.0'a karşı çalıştırılsa fail ederdi.

Linkler