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.

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.

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​

  • GitHub release v4.37.1
  • Pull request #5