Ana içeriğe geç

MHM Rentiva v4.26.5: Bayi Paneli Kimlik Kartı ve Mesajlaşma Parite Fix'leri

· 4 dakikalık okuma
MaxHandMade
Maintainer

v4.26.5, bayi paneli üzerinde uzun bir UX cilası seansının meyvelerini taşıyor: sol menünün alt kısmına premium bir kimlik kartı (Gravatar + son giriş), mesajlaşma formunda bayi rezervasyonlarının görünmemesi sorununun çözümü, mesaj listesi kartlarının premium yeniden tasarımı ve beraberinde bir dizi sessiz hata düzeltmesi.

👤 Bayi Paneli Kimlik Kartı

Bayi panelinin sol menüsünde daha önce yalnızca kullanıcı adı + "Çıkış Yap" linki vardı. Artık:

  • Gravatar fotoğrafı (40 px, yuvarlak, beyaz çerçeve, yumuşak gölge)
  • Kullanıcının görünen adı (ellipsis ile taşma kontrolü)
  • Son başarılı giriş tarihi ve saati (ör. Son giriş: 15/04/2026 04:57)
  • Çıkış Yap butonu kartın dışına çıktı, tek başına aksiyon oldu; hover durumunda kırmızıya dönüyor.
<?php
$last_login_raw = (string) get_user_meta($user->ID, 'last_login', true);
if ($last_login_raw !== '') {
$ts = strtotime($last_login_raw);
if ($ts) {
echo date_i18n(get_option('date_format') . ' H:i', $ts);
}
}
?>

last_login user meta — okunan ama yazılmayan anahtar

İlginç bir keşif: last_login user meta'sı GDPR/Privacy ve DataRetentionManager kodumuzda zaten okunuyordu — ama hiçbir yerde yazılmıyordu. Yani veri saklama süresi hesaplarında "bu kullanıcı N gündür giriş yapmadı" kararı hep boş değer üzerinden veriliyordu.

v4.26.5 bu boşluğu doldurdu: SessionManager::set_session_timeout() artık wp_login action'ının ikinci parametresini (WP_User $user) alıyor ve current_time('mysql') ile last_login'i güncelliyor.

add_action('wp_login', array(self::class, 'set_session_timeout'), 10, 2);

public static function set_session_timeout($user_login = '', $user = null): void
{
$user_id = ($user instanceof \WP_User) ? (int) $user->ID : get_current_user_id();
if (! $user_id) return;
update_user_meta($user_id, 'mhm_rentiva_last_activity', time());
update_user_meta($user_id, 'last_login', current_time('mysql'));
}

📥 Mesajlaşma: Bayiler Artık Kendi Rezervasyonlarını Görüyor

"Yeni Mesaj" formundaki İlgili Rezervasyon dropdown'u her zaman boş geliyordu — bayi açısından. REST endpoint sadece _mhm_customer_user_id meta'sını sorguluyordu, yani "benim yaptığım rezervasyonlar". Bayinin araçlarına başkalarının yaptığı rezervasyonlar görünmüyordu.

Çözüm: endpoint iki sorgu yapıyor ve sonuçları ID bazında birleştirip tekilleştirerek, post_date DESC sıralıyor:

// Customer-side: rezervasyonu yapan kullanıcı
$customer_query = new WP_Query([
'post_type' => 'vehicle_booking',
'meta_query' => [[
'key' => '_mhm_customer_user_id',
'value' => $user_id,
]],
]);

// Vendor-side: bayinin sahibi olduğu araçlara yapılan rezervasyonlar
$vendor_vehicle_ids = get_posts([
'post_type' => 'vehicle',
'author' => $user_id,
'posts_per_page' => -1,
'fields' => 'ids',
]);
if (!empty($vendor_vehicle_ids)) {
$vendor_query = new WP_Query([
'post_type' => 'vehicle_booking',
'meta_query' => [[
'key' => '_mhm_vehicle_id',
'value' => $vendor_vehicle_ids,
'compare' => 'IN',
]],
]);
}

🎨 Premium Mesaj Listesi Kartları

Mesaj listesi kartları düz beyaz kutulardan premium tasarıma geçti:

  • Gradyan arka plan (#ffffff → #fafbff)
  • Mor pill ID rozeti (#4F46E5 arka plan, #eef2ff içi)
  • Turuncu gradient "YENİ" etiketi (#f59e0b → #f97316, box-shadow amber glow)
  • Hover durumunda kartın sol kenarında indigo aksan bar belirip, kart 2 px yukarı kalkıyor
  • Okunmamış state için amber arka plan + sol aksan bar
  • Mobil breakpoint altında padding + tipografi otomatik uyarlanıyor

🗂️ .hidden — Eksik Olduğunu Fark Etmediğimiz Kural

Mesajlar sayfasının şablonunda üç görünüm var:

  1. Mesaj listesi
  2. Konuşma (thread) görünümü
  3. Yeni mesaj formu

Şablonda bu üçü başlangıçta class="hidden" ile gizlenmeye çalışılıyordu — ama .hidden CSS kuralı hiçbir yerde tanımlanmamıştı. Sonuç: üçü de aynı anda display: block ile render oluyordu. Kullanıcı aşağı scroll edince üst üste yığılmış panel karmaşası görüyordu.

Çözüm bir CSS utility:

.mhm-messages-section .hidden,
.mhm-messages-section .thread-reply.hidden,
.mhm-messages-section .new-message-form.hidden,
.mhm-messages-section .message-thread.hidden {
display: none !important;
}

Artık üç görünüm mutually exclusive: hangisi aktifse o görünüyor, diğerleri gizli.

🔁 Konuşma Tekrar Açıldığında Birikmeyen Butonlar

Bir thread kapatılıp tekrar açıldığında "Mesajı Kapat" butonu ve "Bu konuşma kapatıldı" uyarı afişi DOM'a tekrar append ediliyordu — stale elementler silinmeden. Sonuç: aynı threadi iki kez açarsanız iki tane "Mesajı Kapat" butonu görüyordunuz.

// Yeniden render öncesi stale elementleri kaldır
$('#message-thread .close-thread-btn').remove();
$('#message-thread .thread-closed-notice').remove();

🔣 Mojibake Kutusu ve Translation Fix'leri

  • templates/account/messages.php içindeki "İletilere dön" metninin önündeki ok () UTF-8 double-encoded gelmişti (↠gibi görünüyordu) ve bir stray C1 control byte (0xC2 0x90) şablonda kaldı. Çözüm: <span aria-hidden="true">&larr;</span> HTML entity + PowerShell script ile C1 byte stripping.
  • Türkçe .po dosyasında "Booking Association" etiketi "Rezervasyon Derneği" (Booking Society) olarak çevrilmişti 😄 — düzeltildi: "İlgili Rezervasyon".

📦 Filemtime Cache Busting

Bu seansta iki kez "tarayıcı cache'i eski CSS/JS'i tutuyor" döngüsüne girdik. Bundan sonra olmaması için asset enqueue'larında filemtime versiyonlama:

$customer_messages_css_ver = file_exists($path)
? MHM_RENTIVA_VERSION . '.' . filemtime($path)
: MHM_RENTIVA_VERSION;
wp_enqueue_style('mhm-customer-messages', $url, [], $customer_messages_css_ver);

Plugin versiyonu aynı kalsa da dosya her değiştiğinde ?ver=4.26.5.1744742822 gibi unique bir query string oluşuyor — tarayıcı eski dosyayı asla servislemiyor.

✅ Testler

720 tests, 2601 assertions, 6 skipped — tam yeşil. Regresyon yok.

İndirin

Sıradaki minor versiyon (v4.27.0) bayi rapor ve itiraz sistemine ayrılmış durumda — rezervasyon, ceza ve araç raporları için birleşik bir altyapı.