Ana içeriğe geç

MHM Rentiva v4.27.1: i18n Locale-Leak Hotfix — Araç Ayarları Etiketleri Artık İlk Kurulum Dilinde Donmuyor

· 3 dakikalık okuma
MaxHandMade
Maintainer

v4.27.0 WordPress.org gönderim hazırlığından birkaç saat sonra kritik bir bug yakalandı: İngilizce bir WordPress sitesinde Araç Ayarları sayfası Türkçe etiketler gösteriyordu. Eklenti global bir eklenti, İngilizce birincil dil. Bu hata submission-blocker seviyesinde. v4.27.1 bunu düzeltiyor.

🐛 Hata Senaryosu

Tipik tekrarlama:

  1. Eklenti Türkçe bir WordPress sitesinde kurulu, Araç Ayarları sayfası bir kez ziyaret edildi.
  2. Site İngilizce'ye çevrildi (veya Türkçe bir DB yedeği İngilizce siteye restore edildi).
  3. Admin paneli hâlâ Türkçe etiketler gösteriyor: Günlük Fiyat, Model Yılı, Plaka, Klima, Yedek Lastik...

Oysa kaynak koddaki her __( 'Daily Price', 'mhm-rentiva' ) çağrısı güncel WordPress yerel ayarına göre doğru İngilizce değerini döndürüyor. Peki neden admin UI Türkçe gösteriyordu?

🔍 Kök Neden

VehicleMeta::ensure_default_options() fonksiyonu, ilk admin page load'da şöyle bir işlem yapıyordu:

$default_details = self::get_default_details(); // __() çağrılarıyla CHEVİRİLMİŞ array
// ...
if (get_option('mhm_vehicle_details', array()) === array()) {
update_option('mhm_vehicle_details', $default_details); // 🔥 Türkçe değerleri DB'ye yazdı
}

get_default_details() içinde:

return array(
'price_per_day' => __('Daily Price', 'mhm-rentiva'), // Türkçe site → "Günlük Fiyat"
'year' => __('Model Year', 'mhm-rentiva'), // Türkçe site → "Model Yılı"
// ...
);

__() çağrıldığı anın yerel ayarına göre çeviri döner. İlk site Türkçe'yken bu "Günlük Fiyat" döndü ve wp_options'a yazıldı.

Sonrasında get_all_available_details() render akışında:

$details = self::get_default_details();              // canlı __() → İngilizce (site EN şimdi)
$stored = get_option('mhm_vehicle_details'); // DONMUŞ Türkçe
foreach ($stored as $key => $label) {
$details[$key] = $label; // Override: Türkçe kazanıyor
}

Donmuş çeviri daima canlı çeviriyi eziyordu.

🛠️ Çözüm

1. Otomatik persisti durdur

VehicleMeta::ensure_default_options() içindeki üç update_option('mhm_vehicle_*', $translated_defaults) çağrısı tamamen kaldırıldı. mhm_selected_* (sadece KEY listesi, çeviri içermez) seed etmeye devam ediyor.

2. Mevcut install'ları temizle

Yeni method VehicleMeta::migrate_remove_auto_populated_labels() — tek seferlik migrasyon, mhm_rentiva_v4271_labels_migrated flag ile korunuyor:

foreach (['mhm_vehicle_details', 'mhm_vehicle_features', 'mhm_vehicle_equipment'] as $key) {
$stored = get_option($key, null);
if (is_array($stored) && !empty($stored)) {
delete_option($key);
}
}

Migrasyon plugins_loaded hook'unda mevcut version-drift bloğu içinde tetikleniyor — admin, cron ve WP-CLI akışlarında hepsinde çalışıyor.

3. Kullanıcı custom alanları korunuyor

mhm_custom_details, mhm_custom_features, mhm_custom_equipment — kullanıcının "Özel Ekle" ile eklediği alanlar başka options'ta duruyor. Migrasyon bunlara dokunmuyor.

⚖️ Trade-off

"İsimleri Düzenle" (Edit Names) ile bir çekirdek alanı yeniden adlandırdıysan (örn. "Daily Price" → "Rental Rate"), upgrade sonrası bu rename'i tek sefer yeniden uygulaman gerekiyor. Bu nadir bir senaryo — ama bug her install'ı etkiliyordu. Takas adil.

🧪 Testler

tests/Migration/LocaleLeakLabelsMigrationTest.php4 yeni regresyon testi, 13 assertion:

  1. Sızmış etiket array'leri temizleniyor (Türkçe, İngilizce, karışık içeriklerde)
  2. Migrasyon idempotent — ikinci çağrı no-op, meşru post-migration rename'i ezmiyor
  3. Fresh install — legacy option yok, flag yine de set ediliyor (sonraki çağrılar atlanıyor)
  4. mhm_custom_* — kullanıcı custom alanlarına dokunulmuyor

✅ Doğrulama

KontrolSonuç
PHPCS release scope0 error, 0 warning
PHPUnit732/732 (+4 yeni), 6 skipped, 0 regresyon
Plugin Check (PCP)0 error, 3 trivial warning (.distignore-excluded)

📦 Kurulum

mhm-rentiva.4.27.1.zipEklentiler → Yeni Ekle → Eklenti Yükle, veya Rentiva Pro otomatik güncelleyicisi.

Gereksinimler: PHP 8.1+, WordPress 6.7+.

🔜 Sıradaki

  • v4.27.2: Arama Sonuçları UX iyileştirmeleri + Shortcode Review Backlog (birleşik patch)
  • v4.28.0: Popüler Rotalar shortcode/block/widget (yeni özellik)
  • v4.29.0: Vendor Report / Appeal System (yeni alt sistem)

🎓 Ders

Bu bug v4.27.0 WordPress.org submission readiness release'inden birkaç saat sonra yakalandı. Zero PHPCS / zero PCP doğrulama suite'i geçmişti ama runtime bir hatayı (mevcut DB state'in __() çıktılarını ezmesi) ne PHPCS ne PCP görebilirdi. Gerçek kullanıcı admin UI testi tek güvence. WordPress.org gönderiminden önce smoke test tur atmamız gerekiyordu — v4.27.1 ile bu pattern kazanıldı: test kaynağı çeviri katmanlarından geçen her UI için manuel doğrulama zorunlu.


GitHub Release: v4.27.1