Ana içeriğe geç

MHM Rentiva v4.26.4: Parite Denetimi Fix'leri ve Transfer Widget UX Cilası

· 3 dakikalık okuma
MaxHandMade
Maintainer

v4.26.4, tüm 18 core "kısa kod ↔ Gutenberg bloğu ↔ Elementor widget'ı" üçlüsü üzerinde yapılan ayar paritesi denetiminde ortaya çıkan üç sessiz sorunu gideriyor: Arama Sonuçları bloğuna kopya-yapıştır ile sızmış üç hayalet attribute, Birleşik Arama bloğundaki duplicate genişlik attribute'ları ve Transfer Arama Elementor widget'ında otomatik üretilmiş ham etiketli control'ler. Üçü de kullanıcının gözünden kaçan ama panelde anlamsız görünen UX çürümeleriydi.

🔍 Parite Denetimi Neden Gerekli?

MHM Rentiva'nın "Render Parity Rule" kuralına göre her blok, render zamanında do_shortcode() ile karşılık gelen kısa koda delege eder. Yani blokların kendi mantığı yoktur — sadece kısa koda argüman geçiren ince bir kabuktur. Elementor widget'ları da aynı prensiple çalışır.

Bu mimari güçlü bir garanti sağlar: kısa kodda çalışan her şey blokta ve widget'ta da çalışır. Ama tersi de doğru olmalı — kısa kodun bilmediği bir attribute, blokta veya widget'ta da olmamalı. Aksi halde kullanıcı panel arayüzünde bir toggle açar, bir şey yazar, render'da hiçbir değişiklik olmaz. Hata yok, uyarı yok, sessiz no-op.

Bu v4.26.4'te giderilen üç sorun da tam olarak bu sınıftan:

🐛 1. Arama Sonuçları Bloğu — Hayalet Attribute Sızıntısı

assets/blocks/search-results/block.json dosyasına, zamanında transfer-search bloğundan kopya-yapıştır ile türetildiği sırada üç attribute sızmıştı:

  • button_text
  • show_pickup
  • show_dropoff

Arama Sonuçları bloğunda buton yok, pickup/dropoff alanları yok — bu attribute'lar anlamsız. Ama Gutenberg inspector panelinde görünüyorlardı, otomatik üretilen Elementor widget'ına da geçiyorlardı. Kullanıcı açar, değer girer, render'da hiçbir şey olmaz.

Çözüm: block.json'dan üçü de silindi. Otomatik parite mekanizması (register_parity_controls_from_block) block.json'u kaynak kabul ettiği için widget'tan da otomatik düştüler.

🐛 2. Birleşik Arama Bloğu — Duplicate Genişlik Attribute'ları

assets/blocks/unified-search/block.json'da iki duplicate attribute vardı:

"min_width": { ... },
"max_width": { ... }

CAM (Canonical Attribute Mapper) pipeline'ı snake_case ayraçlarını kaldırır ve kanonik isimler minwidth / maxwidth olarak render'a ulaşır. min_width / max_width ayrı birer alan olarak DB'ye yazılıyor, ama render aşamasında aynı değere map'leniyordu — iki kontrol aynı şeyi yapıyor, biri de render'da hiçbir zaman okunmuyordu.

Çözüm: Snake_case varyantlar silindi. Tek kanonik minwidth / maxwidth kaldı.

🎨 3. Transfer Arama Widget'ı — Ham Etiketli Control'ler

Base Elementor widget sınıfımızda register_parity_controls_from_block() adlı bir metod var. Bu metod, block.json'daki attribute'ları tarayıp widget'ta manuel tanımlanmamış olanlar için otomatik Elementor control'leri üretir. Amacı: yeni bir block.json attribute'u eklendiğinde Elementor widget'ının geride kalmamasını sağlamak. Bir güvenlik ağı.

Ama güvenlik ağı tasarım aracı değil. Otomatik üretilen control'ler ham attribute name'leri label olarak kullanır: showPickup → "ShowPickup", buttonText → "ButtonText". Placeholder yok, doğru default yok, ayrı bir bölümde gösteriliyor. Transfer Search widget'ında tam olarak bu oluyordu.

Çözüm: Üç user-facing attribute için manuel add_control() çağrıları eklendi:

$this->add_control('buttonText', [
'label' => __('Button Text', 'mhm-rentiva'),
'type' => Controls_Manager::TEXT,
'default' => '',
'placeholder' => __('Search Transfers', 'mhm-rentiva'),
]);
$this->add_control('showPickup', [
'label' => __('Show Pickup Location', 'mhm-rentiva'),
'type' => Controls_Manager::SWITCHER,
'return_value' => 'yes',
'default' => 'yes',
]);
$this->add_control('showDropoff', [
'label' => __('Show Dropoff Location', 'mhm-rentiva'),
'type' => Controls_Manager::SWITCHER,
'return_value' => 'yes',
'default' => 'yes',
]);

register_parity_controls_from_block() manuel tanımlı control'leri otomatik olarak atlar (in_array($attr_name, $existing_controls)), dolayısıyla duplicate çıkmaz. Ama artık panel ismini doğru, placeholder'lı, mantıklı default'larla gösteriyor.

📖 Çıkarılan Ders

Otomatik parite mekanizması güvenlik ağıdır, UI değil. Her user-facing attribute manuel add_control() ile tanımlanmalı: doğru label, placeholder, default. Otomatik mekanizma gelecekte eklenecek attribute'lar için arka planda bekleyen regresyon kalkanı olarak kalır.

🧪 Testler

720 test · 2470 assertion · 6 skipped — tam yeşil.

📦 Kurulum

GitHub Releases üzerinden mhm-rentiva.4.26.4.zip dosyasını indirin ve WordPress Eklentiler → Yeni Ekle → Eklenti Yükle ekranından yükleyin.