Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. WordPress 6.x ve üzeri sürümler, modern PHP 8.2+ standartlarını desteklediği için güvenlik ve performans açısından bu sürümleri kullanmanız önerilir.
- Aktif bir WordPress kurulumu (Yerel sunucuda çalışmanız önerilir).
- Temel düzeyde PHP bilgisi.
- Modern bir tarayıcı (Chrome veya Firefox geliştirici araçları için).
- Veritabanı erişimi (wp_posts veya özel tablolar için yetki).
Veritabanı Yapısının Oluşturulması
Sohbet mesajlarını saklamak için WordPress'in standart wp_posts tablosunu kullanmak yerine, performans ve ölçeklenebilirlik adına özel bir veritabanı tablosu oluşturmak en doğru yaklaşımdır. Aşağıdaki kod bloğu, eklentiniz aktif edildiğinde çalışacak tablo oluşturma mantığını içerir.
function ozel_sohbet_tablosunu_olustur() {
global $wpdb;
$table_name = $wpdb->prefix . 'ozel_sohbet_mesajlar';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
kullanici_id mediumint(9) NOT NULL,
mesaj text NOT NULL,
zaman datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'ozel_sohbet_tablosunu_olustur');
Bu fonksiyon, eklenti etkinleştirildiğinde wp_ozel_sohbet_mesajlar adında bir tablo oluşturur. dbDelta fonksiyonu, tablonun mevcut olup olmadığını kontrol eder ve gerekli güncellemeleri otomatik yapar.
WordPress AJAX Uç Noktası (Endpoint) Hazırlama
WordPress'te AJAX isteklerini yönetmek için wp_ajax_ ve wp_ajax_nopriv_ kancalarını kullanırız. Bu kancalar, sunucuya gelen isteği yakalar ve belirttiğimiz fonksiyonu tetikler. Aşağıdaki örnekte, mesaj gönderme işlemini işleyen fonksiyonu tanımlıyoruz.
add_action('wp_ajax_mesaj_gonder', 'mesaj_gonder_handler');
add_action('wp_ajax_nopriv_mesaj_gonder', 'mesaj_gonder_handler');
function mesaj_gonder_handler() {
global $wpdb;
check_ajax_referer('sohbet_guvenlik_kodu', 'nonce');
$mesaj = sanitize_text_field($_POST['mesaj']);
$kullanici_id = get_current_user_id();
$wpdb->insert($wpdb->prefix . 'ozel_sohbet_mesajlar', [
'kullanici_id' => $kullanici_id,
'mesaj' => $mesaj,
'zaman' => current_time('mysql')
]);
wp_send_json_success('Mesaj başarıyla gönderildi.');
}
Burada check_ajax_referer ile CSRF (Siteler Arası İstek Sahteciliği) saldırılarını engelliyoruz. sanitize_text_field ise XSS (Siteler Arası Betik Çalıştırma) saldırılarına karşı veriyi temizler.
JavaScript ile AJAX İsteklerinin Yönetimi
Sohbet arayüzünde mesajların sayfayı yenilemeden gönderilmesi için JavaScript tarafında fetch API kullanacağız. Bu yöntem, geleneksel jQuery $.ajax yöntemine göre daha modern ve hızlıdır.
document.getElementById('sohbet-formu').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
formData.append('action', 'mesaj_gonder');
formData.append('nonce', sohbet_obj.nonce);
fetch(sohbet_obj.ajax_url, {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if(data.success) {
console.log('Mesaj iletildi');
}
});
});
Bu JavaScript kodu, formun varsayılan gönderimini engeller ve veriyi WordPress'in AJAX uç noktasına gönderir. sohbet_obj, wp_localize_script ile PHP'den aktardığımız değişkenleri içerir.
Mesajları Canlı Olarak Çekme
Sohbetin "canlı" olması için belirli aralıklarla (örneğin her 3 saniyede bir) veritabanından yeni mesajları çeken bir setInterval döngüsü kurmamız gerekir. Bu, kullanıcılara gerçek zamanlı bir deneyim sunar.
setInterval(function() {
fetch(sohbet_obj.ajax_url + '?action=mesajlari_getir')
.then(response => response.json())
.then(data => {
const sohbetKutusu = document.getElementById('sohbet-kutusu');
sohbetKutusu.innerHTML = data.data;
});
}, 3000);
Bu kod, her 3 saniyede bir sunucuya istek atar. Sunucu tarafında mesajlari_getir fonksiyonu ile veritabanından son 20 mesajı çekip HTML olarak döndürmeniz yeterlidir.
Karşılaştırma: Yöntemlerin Avantaj ve Dezavantajları
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| AJAX Polling | Basit kurulum, her sunucuda çalışır. | Sunucu yükünü artırır, gecikme olabilir. |
| WebSockets | Gerçek zamanlı, çok düşük gecikme. | Ek sunucu yapılandırması gerektirir. |
Güvenlik Uyarısı: Veritabanı sorgularınızda her zaman
$wpdb->prepare()kullanın. Kullanıcıdan gelen verileri asla doğrudan SQL sorgusuna dahil etmeyin; bu, SQL Injection açıklarına davetiye çıkarır.
Sıkça Sorulan Sorular
AJAX istekleri neden 403 hatası veriyor?
Genellikle nonce (güvenlik doğrulama kodu) eksikliği veya yanlış yapılandırılmasından kaynaklanır. wp_create_nonce fonksiyonunu kullandığınızdan ve JavaScript tarafına doğru aktardığınızdan emin olun.
Sohbet sistemi sunucuyu yorar mı?
Evet, çok fazla eşzamanlı kullanıcı varsa setInterval yöntemi sunucu yükünü artırabilir. Üretim ortamında mesajları önbelleğe almayı veya WebSocket teknolojilerine geçmeyi düşünebilirsiniz.
Mesajlar neden anında görünmüyor?
setInterval süresini kontrol edin. Eğer süre çok uzunsa (örneğin 10 saniye), kullanıcılar mesajları geç görecektir. İdeal süre 2 ile 5 saniye arasındadır.
Veritabanı tablosunu nasıl temizlerim?
Eklenti silindiğinde tabloyu kaldırmak için register_uninstall_hook fonksiyonunu kullanarak bir temizleme betiği yazmalısınız.
Bu sistemi özel mesajlaşma için kullanabilir miyim?
Evet, ancak veritabanı tablonuza alici_id sütunu ekleyerek sorgularınızı sadece ilgili kullanıcıları kapsayacak şekilde filtrelemeniz gerekir.
Sistem Performansını Optimize Etme ve Ölçeklendirme
Ajax tabanlı canlı sohbet sistemleri, kullanıcı sayısı arttıkça veritabanı sorgu yükünü ciddi oranda artırabilir. Her 3 saniyede bir yapılan istek, sunucunuzda yoğun bir trafik oluşturur. Bu durumu yönetmek için veritabanı indeksleme ve sorgu önbellekleme stratejilerini uygulamak hayati önem taşır.
Veritabanı İndeksleme ile Hız Artışı
Mesaj tablonuzdaki sorguların hızlanması için gonderen_id, alici_id ve tarih sütunlarına indeks eklemelisiniz. İndeksleme, veritabanının tüm tabloyu taramak yerine doğrudan ilgili satırlara erişmesini sağlar.
// SQL sorgusu ile indeks ekleme
$wpdb->query("CREATE INDEX idx_mesajlar_tarih ON {$wpdb->prefix}chat_messages (tarih)");
$wpdb->query("CREATE INDEX idx_mesajlar_alici ON {$wpdb->prefix}chat_messages (alici_id)");
Transient API Kullanımı
Sohbetin genel odası gibi herkesin gördüğü mesajlar için WordPress Transient API kullanarak veritabanı yükünü azaltabilirsiniz. Mesajları her seferinde veritabanından çekmek yerine, 30 saniyelik bir önbellek süresi tanımlayarak sunucu kaynaklarını koruyabilirsiniz.
function get_cached_chat_messages() {
$messages = get_transient('chat_messages_cache');
if (false === $messages) {
$messages = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}chat_messages ORDER BY tarih DESC LIMIT 20");
set_transient('chat_messages_cache', $messages, 30);
}
return $messages;
}
Gelişmiş Hata Ayıklama ve Loglama
Canlı bir sistemde AJAX hatalarını yakalamak zordur. Kullanıcı tarafında gerçekleşen hataları sunucuya raporlamak için basit bir hata kayıt mekanizması kurabilirsiniz.
JavaScript Hata Yakalayıcı
Ajax isteği başarısız olduğunda, hatayı konsola yazdırmanın yanı sıra bir log dosyasına kaydederek sorunun kaynağını (sunucu hatası, zaman aşımı vb.) tespit edebilirsiniz.
$.ajax({
url: ajaxurl,
type: 'POST',
data: { action: 'chat_send_message', message: msg },
error: function(xhr, status, error) {
console.error("AJAX Hatası: " + error);
// Hata detayını sunucuya göndererek loglanmasını sağlayabilirsiniz
$.post(ajaxurl, { action: 'log_chat_error', error: error });
}
});
Sunucu Tarafı Loglama
WordPress'in hata ayıklama modunu kullanarak sohbet işlemlerini izleyebilirsiniz. wp-config.php dosyanızda WP_DEBUG_LOG özelliğini aktif ederek, sohbet fonksiyonlarınızdaki hataları wp-content/debug.log dosyasında görebilirsiniz.
// Hata oluştuğunda loglama
if ($wpdb->last_error) {
error_log('Sohbet Sistemi Hatası: ' . $wpdb->last_error);
}
Bu yöntemler, özellikle yüksek trafikli WordPress sitelerinde sohbet sisteminizin kararlı çalışmasını sağlar. Sisteminizi yayına almadan önce mutlaka farklı tarayıcılar ve mobil cihazlar üzerinde yük testi yapmayı unutmayın.
Sonuç
WordPress ile özel bir Ajax canlı sohbet sistemi oluşturmak, platformun esnekliğini anlamak için harika bir projedir. Bu rehberde veritabanı oluşturma, güvenli AJAX istekleri, veri sanitizasyonu ve canlı veri çekme konularını ele aldık. Bir sonraki adım olarak, bu sisteme kullanıcıların çevrimiçi/çevrimdışı durumlarını göstermek için veritabanına 'son_gorulme' sütunu ekleyerek geliştirebilirsiniz.


Yorumlar (0)
Yorum Yaz