MHM Rentiva v4.26.5: Bayi Paneli Kimlik Kartı ve Mesajlaşma Parite Fix'leri
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 (
#4F46E5arka plan,#eef2ffiç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:
- Mesaj listesi
- Konuşma (thread) görünümü
- 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.phpiç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">←</span>HTML entity + PowerShell script ile C1 byte stripping.- Türkçe
.podosyası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
- GitHub Release v4.26.5
- ZIP asset:
mhm-rentiva.4.26.5.zip(2.61 MB, 764 dosya)
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ı.
