Gereksinimler ve Ön Hazırlık
Bu sistemi kurmadan önce WordPress altyapınızın güncel olduğundan emin olmalısınız. En az PHP 8.2 sürümü ve WordPress 6.5+ sürümü önerilmektedir. Çalışmalarınızı doğrudan canlı sitenizde değil, bir yerel geliştirme ortamında (LocalWP veya Docker gibi) yapmanız güvenlik açısından en iyi pratiktir.
- PHP 8.2+: Daha hızlı ve güvenli kod yürütme.
- WordPress 6.5+: Güncel Ajax API desteği.
- Tarayıcı Konsolu: Hataları ayıklamak için Chrome veya Firefox Geliştirici Araçları.
- Kod Editörü: VS Code gibi modern bir editör.
Adım 1: Bildirim Verilerini Saklamak İçin Veritabanı Yapısı
Bildirimleri tutmak için özel bir tablo oluşturabilir veya WordPress'in wp_posts tablosunu "bildirim" özel içerik türüyle (CPT) kullanabilirsiniz. Ancak performans için özel bir tablo her zaman daha hızlı sonuç verir. Aşağıdaki kod, eklenti aktif edildiğinde bildirim tablosunu oluşturur.
function bildirim_sistemi_tablosunu_olustur() {
global $wpdb;
$table_name = $wpdb->prefix . 'ozel_bildirimler';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
mesaj text NOT NULL,
okundu tinyint(1) DEFAULT 0,
tarih datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'bildirim_sistemi_tablosunu_olustur');
Bu kod, veritabanında wp_ozel_bildirimler adında bir tablo oluşturur. dbDelta fonksiyonu, tablonun mevcut olup olmadığını kontrol eder ve gerekirse günceller.
Adım 2: JavaScript ile Ajax İsteği Gönderme
Sunucuya periyodik olarak istek göndermek için JavaScript kullanacağız. setInterval fonksiyonu ile belirli aralıklarla (örneğin 30 saniyede bir) sunucuyu sorgulayacağız. Bu işlem, kullanıcının sayfayı yenilemeden bildirim almasını sağlar.
document.addEventListener('DOMContentLoaded', function() {
function bildirimleriGetir() {
fetch(ajax_object.ajax_url, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'action=yeni_bildirimleri_kontrol_et&nonce=' + ajax_object.nonce
})
.then(response => response.json())
.then(data => {
if (data.success) {
console.log('Yeni bildirim:', data.data);
// Bildirimi ekrana basma işlemleri burada yapılacak
}
});
}
// Her 30 saniyede bir kontrol et
setInterval(bildirimleriGetir, 30000);
});
Burada fetch API'sini kullanarak WordPress'in admin-ajax.php dosyasına istek gönderiyoruz. nonce kullanımı, CSRF (Cross-Site Request Forgery) saldırılarını engellemek için zorunludur.
Adım 3: PHP Tarafında Ajax İsteğini Karşılama
JavaScript'ten gelen isteği karşılamak için wp_ajax_ kancalarını kullanmalıyız. Bu fonksiyon, veritabanından okunmamış bildirimleri çeker ve JSON formatında geri döner.
add_action('wp_ajax_yeni_bildirimleri_kontrol_et', 'yeni_bildirimleri_kontrol_et_callback');
function yeni_bildirimleri_kontrol_et_callback() {
check_ajax_referer('bildirim_nonce', 'nonce');
global $wpdb;
$user_id = get_current_user_id();
$table = $wpdb->prefix . 'ozel_bildirimler';
$bildirimler = $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table WHERE user_id = %d AND okundu = 0",
$user_id
));
wp_send_json_success($bildirimler);
}
Bu kod bloğu, sadece giriş yapmış kullanıcılara özel bildirimleri getirir. $wpdb->prepare kullanımı, SQL Injection saldırılarını önlemek için hayati önem taşır.
Adım 4: Güvenlik ve Performans Karşılaştırması
Canlı bir sistemde bildirim yönetimi için farklı yöntemlerin avantajlarını ve dezavantajlarını anlamak önemlidir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Ajax Polling | Kolay kurulum, tüm sunucularda çalışır. | Sunucu yükünü artırabilir. |
| WebSockets | Gerçek zamanlı, düşük gecikme. | Sunucu yapılandırması zordur. |
| Server-Sent Events | Tek yönlü akış için idealdir. | Eski tarayıcı desteği sınırlıdır. |
Kritik Güvenlik Uyarısı: Bildirim verilerini döndürürken her zaman
is_user_logged_in()kontrolü yapın. Ayrıca, veritabanından gelen verileri ekrana basmadan önceesc_html()veyawp_kses_post()fonksiyonları ile temizlediğinizden emin olun. Aksi takdirde XSS (Cross-Site Scripting) açıkları oluşabilir.
Adım 5: Bildirimleri Kullanıcıya Gösterme
Veriyi aldık, şimdi bunu kullanıcıya şık bir şekilde göstermeliyiz. JavaScript tarafında gelen veriyi bir HTML öğesine ekleyelim.
function bildirimiEkranaBas(bildirim) {
const bildirimAlani = document.getElementById('bildirim-kutusu');
const yeniBildirim = document.createElement('div');
yeniBildirim.className = 'bildirim-item';
yeniBildirim.innerText = bildirim.mesaj;
bildirimAlani.appendChild(yeniBildirim);
}
Bu fonksiyon, gelen her yeni bildirimi mevcut bildirim listesinin sonuna ekler. CSS ile bu öğelere animasyon ekleyerek kullanıcı deneyimini iyileştirebilirsiniz.
Adım 6: Hata Ayıklama ve Yaygın Hatalar
Sistemi geliştirirken en sık karşılaşılan sorunlar genellikle Ajax URL'sinin yanlış tanımlanması veya Nonce hatasıdır. Tarayıcınızın "Network" sekmesini kontrol ederek admin-ajax.php dosyasının 200 OK yanıtı döndürdüğünden emin olun.
// Hata ayıklama için örnek loglama
if (empty($bildirimler)) {
error_log('Bildirim bulunamadı veya sorgu hatası.');
}
Eğer bildirimler gelmiyorsa, WP_DEBUG modunu aktif ederek PHP hatalarını wp-content/debug.log dosyasından takip edebilirsiniz.
Sıkça Sorulan Sorular
Ajax Polling sunucuyu yorar mı?
Evet, çok fazla eşzamanlı kullanıcı varsa sunucu yükü artabilir. Bu durumda 30 saniye yerine 60 saniye gibi daha uzun aralıklar kullanabilir veya Redis gibi nesne önbellekleme sistemlerinden faydalanabilirsiniz.
Neden WebSockets kullanmıyoruz?
WebSockets, WordPress'in standart paylaşımlı hosting ortamlarında genellikle desteklenmez veya ek sunucu yapılandırması gerektirir. Ajax, her ortamda sorunsuz çalışır.
Bildirimler neden anlık gelmiyor?
İstek aralığınız (interval) çok uzun olabilir veya tarayıcınızın önbelleği (cache) eski veriyi tutuyor olabilir. fetch isteğine cache: 'no-cache' parametresini ekleyerek bunu çözebilirsiniz.
Nonce nedir ve neden gereklidir?
Nonce (Number used once), formların veya Ajax isteklerinin güvenli bir kaynaktan geldiğini doğrulamak için kullanılan tek kullanımlık bir güvenlik jetonudur. Güvenlik için zorunludur.
Veritabanı tablosunu silmek gerekirse ne yapmalıyım?
Eklentiyi kaldırırken register_deactivation_hook kullanarak tabloyu silebilirsiniz. Ancak bu işlem verilerin kalıcı olarak silinmesine neden olur, dikkatli olunmalıdır.
Yasal Uyarı: Bu rehberdeki kodlar eğitim amaçlıdır. Uygulamanızın güvenliğinden ve veritabanı işlemlerinden geliştirici sorumludur. Kritik verilerle çalışırken profesyonel güvenlik denetimi yaptırmanız önerilir.
Bildirim Sistemini Ölçeklendirmek İçin İleri İpuçları
Sisteminizi daha profesyonel bir seviyeye taşımak ve yüksek trafikli sitelerde performans kaybını önlemek için bazı mimari iyileştirmeler yapmanız gerekir. Özellikle veritabanı sorgularını optimize etmek, sunucu üzerindeki yükü doğrudan azaltır.
Veritabanı Sorgularını Optimize Etme
Bildirimleri çekerken wpdb kullanarak tüm tabloyu taramak yerine, sadece okunmamış bildirimleri getiren ve indekslenmiş bir sorgu kullanmalısınız. Bildirim tablonuzda user_id ve is_read sütunlarına indeks eklemek, binlerce satırda bile milisaniyeler içinde sonuç almanızı sağlar.
// Veritabanı tablosuna indeks ekleme (Eklenti aktivasyonunda çalıştırılmalı)
global $wpdb;
$table_name = $wpdb->prefix . 'custom_notifications';
$wpdb->query("ALTER TABLE $table_name ADD INDEX (user_id, is_read)");
Bildirimleri "Okundu" Olarak İşaretleme
Kullanıcı bildirime tıkladığında veya bildirim panelini açtığında, veritabanındaki durumu güncellemek için ikinci bir Ajax isteği tetiklemelisiniz. Bu, kullanıcı deneyimi açısından bildirimlerin tekrar tekrar görünmesini engeller.
// JavaScript tarafı: Okundu olarak işaretle
function markAsRead(notificationId) {
jQuery.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'mark_notification_read',
id: notificationId,
nonce: my_ajax_obj.nonce
},
success: function(response) {
console.log('Bildirim okundu olarak işaretlendi.');
}
});
}
Sistem Testleri ve Dağıtım (Deployment)
Geliştirdiğiniz sistemi canlıya almadan önce farklı senaryolarda test etmeniz, beklenmedik hataları önler. Özellikle "Race Condition" (yarış durumu) olarak adlandırılan, aynı anda birden fazla isteğin veritabanını kilitlemesi durumuna karşı dikkatli olmalısınız.
Test Senaryoları Listesi
- Boş Durum: Kullanıcının hiç bildirimi olmadığında sistemin hata verip vermediği.
- Yüksek Frekans: Ajax isteği aralığını 1 saniyeye düşürerek sunucunun CPU kullanımını izleme.
- Yetkilendirme: Giriş yapmamış bir kullanıcının Ajax uç noktasına erişip erişemediği (Nonce kontrolü).
- Mobil Uyumluluk: Bildirim kutusunun küçük ekranlarda taşma yapıp yapmadığı.
Performans İzleme
Sistemin sunucunuza olan etkisini ölçmek için Query Monitor eklentisini kullanabilirsiniz. Bu eklenti, Ajax isteklerinizin ne kadar sürede tamamlandığını ve veritabanında kaç sorgu çalıştırdığını detaylıca gösterir. Eğer sorgu süresi 0.5 saniyenin üzerine çıkıyorsa, veritabanı indekslerinizi tekrar gözden geçirmeniz gerekir.
Profesyonel İpucu: Eğer sitenizde yoğun bir trafik varsa, bildirim verilerini her seferinde veritabanından çekmek yerine WordPress Transients API kullanarak geçici olarak önbelleğe alabilirsiniz. Bu, veritabanı yükünü %80 oranında azaltabilir.
Sonuç
WordPress ile özel bir Ajax canlı bildirim sistemi geliştirmek, sitenizin etkileşim düzeyini ciddi oranda artırır. Bu rehberde, veritabanı oluşturmadan Ajax isteklerinin yönetimine kadar uçtan uca bir süreci inceledik. Bir sonraki adım olarak, bildirimleri "okundu" olarak işaretleyen bir sistem ekleyebilir veya bildirimleri tarayıcı bildirimleri (Push Notifications) ile birleştirebilirsiniz.


Yorumlar (0)
Yorum Yaz