Wordpress İle Özel Bir Kullanıcı Etkinlik Takip Sistemi Nasıl Yapılır?

Wordpress İle Özel Bir Kullanıcı Etkinlik Takip Sistemi Nasıl Yapılır?
Wordpress İle Özel Bir Kullanıcı Etkinlik Takip Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Kendi takip sisteminizi kurmadan önce WordPress çalışma ortamınızın güncel olduğundan emin olmalısınız. Sistemimiz, veritabanı işlemlerini yönetmek için WordPress'in yerleşik $wpdb sınıfını, etkinlikleri tetiklemek için ise AJAX (Asynchronous JavaScript and XML) yapısını kullanacaktır.

  • WordPress 6.5 veya üzeri sürüm.
  • PHP 8.2 veya üzeri (modern sözdizimi için önerilir).
  • Özel bir eklenti klasörü (wp-content/plugins/ozel-etkinlik-takip).
  • Veritabanı erişimi (yeni tablo oluşturma yetkisi).

Geliştirme sürecinde "WP_DEBUG" modunun açık olduğundan emin olun. Bu, kodunuzdaki hataları anında görmenizi sağlar. Ayrıca, güvenlik için her zaman nonce (number used once) kullanarak AJAX isteklerinin doğrulanması gerektiğini unutmayın.

Veritabanı Yapısını Hazırlama

Etkinlikleri kaydetmek için WordPress'in standart tablolarını kirletmek yerine, özel bir veritabanı tablosu oluşturmalıyız. Bu, verilerin daha hızlı sorgulanmasını ve temiz tutulmasını sağlar. Eklenti aktif edildiğinde çalışacak bir kurulum fonksiyonu yazacağız.


function etkinlik_takip_tablosunu_olustur() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'kullanici_etkinlikleri';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        user_id bigint(20) NOT NULL,
        etkinlik_turu varchar(100) NOT NULL,
        sayfa_url varchar(255) NOT NULL,
        zaman timestamp DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'etkinlik_takip_tablosunu_olustur');

Bu kod, eklenti etkinleştirildiğinde wp_kullanici_etkinlikleri adında bir tablo oluşturur. dbDelta fonksiyonu, tablonun zaten var olup olmadığını kontrol eder ve gerekirse yapıyı günceller, bu da veri kaybını önler.

JavaScript ile Etkinlikleri Yakalama

Kullanıcı etkileşimlerini tarayıcı tarafında yakalamak için JavaScript (modern ES6+) kullanacağız. Bir "tıklama" veya "sayfa görüntüleme" olayını sunucuya göndermek için fetch API'sini kullanmak en güncel yöntemdir.


document.addEventListener('DOMContentLoaded', () => {
    const logEtkinlik = (tur) => {
        fetch(ajax_obj.ajax_url, {
            method: 'POST',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: new URLSearchParams({
                action: 'etkinlik_kaydet',
                nonce: ajax_obj.nonce,
                tur: tur,
                url: window.location.href
            })
        });
    };

    document.querySelectorAll('.izlenecek-buton').forEach(btn => {
        btn.addEventListener('click', () => logEtkinlik('buton_tiklama'));
    });
});

Bu script, .izlenecek-buton sınıfına sahip tüm öğelere tıklama dinleyicisi ekler. Tıklama gerçekleştiğinde veriler, WordPress AJAX uç noktasına gönderilir. ajax_obj değişkeni, wp_localize_script ile PHP'den JavaScript'e aktarılmalıdır.

PHP ile AJAX İsteğini İşleme

Tarayıcıdan gelen veriyi karşılamak ve veritabanına yazmak için bir PHP fonksiyonuna ihtiyacımız var. Güvenlik için check_ajax_referer kullanarak isteğin doğruluğunu kontrol etmeliyiz.


add_action('wp_ajax_etkinlik_kaydet', 'etkinlik_kaydet_callback');
function etkinlik_kaydet_callback() {
    check_ajax_referer('etkinlik_nonce', 'nonce');
    global $wpdb;

    $user_id = get_current_user_id();
    $tur = sanitize_text_field($_POST['tur']);
    $url = esc_url_raw($_POST['url']);

    $wpdb->insert($wpdb->prefix . 'kullanici_etkinlikleri', [
        'user_id' => $user_id,
        'etkinlik_turu' => $tur,
        'sayfa_url' => $url
    ]);

    wp_send_json_success('Etkinlik kaydedildi.');
}

Burada sanitize_text_field ve esc_url_raw fonksiyonları, gelen veriyi temizleyerek SQL Injection ve XSS (Cross-Site Scripting) saldırılarını engeller. Bu, sistemin güvenliği için atılacak en kritik adımdır.

Yöntemlerin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Özel Veritabanı Tablosu Yüksek performans, veri kontrolü Ekstra bakım gerektirir
WordPress Meta Tablosu Kolay kurulum Büyük veride yavaşlar
Üçüncü Taraf Analiz Hazır raporlama Veri gizliliği riski

Verileri WordPress Yönetim Paneline Yansıtma

Topladığınız verileri görmek için yönetici panelinde özel bir sayfa oluşturmalısınız. add_menu_page fonksiyonu ile admin menüsüne "Etkinlik Raporları" sekmesi ekleyerek veritabanındaki kayıtları listeleyebilirsiniz.


add_action('admin_menu', 'etkinlik_menu_ekle');
function etkinlik_menu_ekle() {
    add_menu_page('Etkinlik Raporları', 'Etkinlikler', 'manage_options', 'etkinlik-takip', 'etkinlik_rapor_sayfasi');
}

function etkinlik_rapor_sayfasi() {
    global $wpdb;
    $results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}kullanici_etkinlikleri ORDER BY zaman DESC LIMIT 50");
    echo '';
    foreach ($results as $row) {
        echo "";
    }
    echo '
Kullanıcı IDTürZaman
{$row->user_id}{$row->etkinlik_turu}{$row->zaman}
'; }

Bu kod, en son gerçekleşen 50 etkinliği bir tablo halinde gösterir. Veriyi $wpdb->get_results ile çekip HTML tablosuna bastırmak, basit ama etkili bir raporlama yöntemidir.

Kritik Güvenlik Uyarısı: Veritabanı sorgularında asla doğrudan $_POST değişkenlerini kullanmayın. Her zaman $wpdb->prepare() kullanarak SQL sorgularınızı parametreleştirin. Aksi takdirde siteniz SQL Injection saldırılarına açık hale gelir.

Sıkça Sorulan Sorular

Bu sistem site hızını etkiler mi?

AJAX kullanımı ve veritabanı yazma işlemleri asenkron olduğu için kullanıcı deneyimini doğrudan etkilemez. Ancak çok yüksek trafikli sitelerde veritabanı yükünü azaltmak için verileri bir kuyruk sistemine (Redis vb.) almayı düşünebilirsiniz.

Veriler ne kadar süre saklanmalı?

Veritabanı şişmesini önlemek için belirli bir süreden (örneğin 30 gün) eski verileri silen bir "WP-Cron" görevi tanımlamanız önerilir.

Kullanıcı gizliliği için ne yapmalıyım?

Kullanıcıların IP adreslerini veya hassas bilgilerini kaydetmeyin. Eğer kaydediyorsanız, KVKK/GDPR uyumluluğu için kullanıcıdan onay almanız gerektiğini unutmayın.

Farklı etkinlikleri nasıl ayırt ederim?

JavaScript tarafında gönderdiğiniz tur değişkenini özelleştirerek (örneğin: "video_izleme", "dosya_indirme") veritabanında kolayca filtreleme yapabilirsiniz.

Bu kodları nereye eklemeliyim?

Kodlarınızı doğrudan temanızın functions.php dosyasına eklemek yerine, ayrı bir eklenti olarak yazmanız sitenizin yönetilebilirliği açısından daha doğrudur.

İleri Seviye Veri Görselleştirme: Chart.js Entegrasyonu

Topladığınız ham verileri WordPress yönetim panelinde bir tablo halinde göstermek başlangıç için yeterlidir; ancak kullanıcı eğilimlerini anlamak için görselleştirmek çok daha etkilidir. Chart.js kütüphanesini kullanarak, veritabanındaki etkinlikleri zaman serisi grafiğine dönüştürebilirsiniz.

Öncelikle, WordPress yönetim panelinde bir sayfa oluşturun ve verileri JSON formatında bu sayfaya aktarın. Ardından aşağıdaki yapı ile veriyi görselleştirin:




const ctx = document.getElementById('etkinlikGrafigi').getContext('2d');
const myChart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: ['Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma'],
        datasets: [{
            label: 'Günlük Etkinlik Sayısı',
            data: [12, 19, 3, 5, 2],
            backgroundColor: 'rgba(54, 162, 235, 0.2)',
            borderColor: 'rgba(54, 162, 235, 1)',
            borderWidth: 1
        }]
    }
});

Sistem Hatalarını İzleme ve Hata Ayıklama (Debugging)

Özel bir takip sistemi kurarken, AJAX isteklerinin başarısız olması veya veritabanı hataları gibi durumlarla karşılaşabilirsiniz. Bu tür sorunları hızlıca çözmek için WordPress'in hata ayıklama modunu aktif etmeniz ve özel loglama mekanizmaları kurmanız kritik öneme sahiptir.

AJAX Hatalarını Yakalama

JavaScript tarafında error callback fonksiyonunu kullanarak, sunucudan gelen hataları tarayıcı konsoluna yazdırabilirsiniz. Bu, geliştirme sürecinde hangi isteğin neden başarısız olduğunu anlamanızı sağlar:

$.ajax({
    url: ajaxurl,
    type: 'POST',
    data: { action: 'kaydet_etkinlik', veri: 'test' },
    success: function(response) {
        console.log('Başarılı:', response);
    },
    error: function(xhr, status, error) {
        console.error('Hata Detayı:', {
            durum: status,
            mesaj: error,
            yanit: xhr.responseText
        });
    }
});

Veritabanı Sorgularını İzleme

Eğer veriler veritabanına yazılmıyorsa, wp-config.php dosyanızda WP_DEBUG_LOG özelliğini aktif ederek wp-content/debug.log dosyasını kontrol edin. Ayrıca, SQL sorgularınızda hata olup olmadığını anlamak için $wpdb->last_error değişkenini kullanabilirsiniz:

global $wpdb;
$result = $wpdb->insert($table_name, $data);

if ($result === false) {
    error_log('Veritabanı Hatası: ' . $wpdb->last_error);
}

Performans Optimizasyonu İçin İpuçları

Sisteminizi ölçeklendirirken, her tıklamada veritabanına yazma işlemi yapmak sunucu yükünü artırabilir. Bu durumu yönetmek için şu stratejileri uygulayabilirsiniz:

  • Batch Processing (Toplu İşleme): Etkinlikleri tarayıcıda bir dizide toplayıp, belirli aralıklarla (örneğin 30 saniyede bir veya sayfa terk edilirken) tek bir AJAX isteği ile sunucuya gönderin.
  • Transient API Kullanımı: Çok sık okunan verileri WordPress Transient API ile önbelleğe alın, böylece her sayfa yüklenişinde veritabanına ağır sorgular atılmasını engelleyin.
  • Veritabanı İndeksleme: user_id ve event_type sütunlarına indeks ekleyerek, raporlama ekranındaki sorgu hızını ciddi oranda artırın.

Sonuç

WordPress ile özel bir kullanıcı etkinlik takip sistemi geliştirmek, sitenizin kullanıcı davranışlarını derinlemesine anlamanızı sağlar. Bu rehberde, veritabanı oluşturma, AJAX ile veri toplama ve bu verileri yönetim panelinde görselleştirme adımlarını tamamladınız. Bir sonraki adım olarak, toplanan bu verileri grafik kütüphaneleri (Chart.js gibi) kullanarak daha anlamlı raporlara dönüştürebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce güvenlik açıklarını (SQL Injection, XSS) tekrar kontrol etmeniz ve kodları test etmeniz önerilir. Yazılım güvenliği konusunda uzman görüşü almanız tavsiye edilir.
Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz