Wordpress İle Özel Bir Kullanıcı Aktivite Günlüğü Nasıl Yapılır?

Wordpress İle Özel Bir Kullanıcı Aktivite Günlüğü Nasıl Yapılır?
Wordpress İle Özel Bir Kullanıcı Aktivite Günlüğü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu 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 standartlarını destekler. Çalışmalarınızı doğrudan canlı sitede değil, yerel bir geliştirme ortamında (LocalWP veya XAMPP gibi) yapmanız önerilir.

  • PHP 8.1 veya üzeri bir sürüm.
  • WordPress yönetici paneline erişim.
  • Temanızın functions.php dosyası veya özel bir fonksiyon eklentisi.
  • Veritabanı işlemleri için temel SQL bilgisi.
Uyarı: Veritabanında değişiklik yapmadan önce mutlaka sitenizin tam yedeğini alın. Hatalı bir kod, sitenizin erişilemez hale gelmesine neden olabilir.

Özel Veritabanı Tablosu Oluşturma

Aktivite günlüklerini WordPress'in kendi wp_posts veya wp_comments tablolarında saklamak veritabanı karmaşasına yol açar. Bunun yerine, özel bir tablo oluşturmak en temiz yöntemdir. Aşağıdaki kod, eklenti veya tema aktif edildiğinde çalışacak şekilde tasarlanmıştır.


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

    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        user_id mediumint(9) NOT NULL,
        action_name varchar(255) NOT NULL,
        object_id mediumint(9) DEFAULT 0,
        created_at 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__, 'create_activity_log_table');

Bu kod bloğu, dbDelta fonksiyonunu kullanarak veritabanında wp_user_activity_log adında bir tablo oluşturur. dbDelta, tablonun zaten var olup olmadığını kontrol eder ve gerekirse güncellemeleri otomatik uygular.

Kullanıcı Aksiyonlarını Yakalama

WordPress'teki aksiyon kancaları (hooks), belirli bir olay gerçekleştiğinde kodunuzun tetiklenmesini sağlar. Örneğin, bir kullanıcı yazı yayınladığında veya profilini güncellediğinde bu kancaları kullanarak veriyi loglayabiliriz.


add_action('post_updated', 'log_post_update', 10, 3);

function log_post_update($post_ID, $post_after, $post_before) {
    global $wpdb;
    $user_id = get_current_user_id();
    $table_name = $wpdb->prefix . 'user_activity_log';

    $wpdb->insert($table_name, array(
        'user_id' => $user_id,
        'action_name' => 'post_updated',
        'object_id' => $post_ID
    ), array('%d', '%s', '%d'));
}

Yukarıdaki örnekte, bir gönderi güncellendiğinde post_updated kancası tetiklenir. $wpdb->insert metodu, verileri güvenli bir şekilde SQL injection riskine karşı koruyarak tabloya ekler. %d ve %s formatları, verinin türünü belirterek veritabanı güvenliğini sağlar.

Veri Güvenliği ve SQL Injection Koruması

Kullanıcı aktivite günlüğü oluştururken en büyük risk, veritabanı sorgularına dışarıdan müdahale edilmesidir. WordPress'in sunduğu $wpdb->prepare metodunu kullanmak, bu riskleri minimize etmek için zorunludur.


function get_user_logs($user_id) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'user_activity_log';
    
    // Güvenli sorgu hazırlama
    $results = $wpdb->get_results(
        $wpdb->prepare("SELECT * FROM $table_name WHERE user_id = %d ORDER BY created_at DESC", $user_id)
    );
    return $results;
}

Bu fonksiyon, belirli bir kullanıcıya ait logları çekerken prepare kullanarak SQL sorgusunu temizler. Kullanıcıdan alınan verileri doğrudan sorguya dahil etmek yerine bu yöntemi kullanmak, web uygulamanızın güvenliği için temel bir kuraldır.

Aktivite Günlüklerini Görüntüleme

Logları toplamak yeterli değildir; bunları WordPress yönetici panelinde okunabilir bir tablo olarak sunmanız gerekir. Bunun için WordPress'in WP_List_Table sınıfını kullanmak en profesyonel yaklaşımdır.


// Basit bir liste çıktısı örneği
function display_activity_logs() {
    global $wpdb;
    $logs = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}user_activity_log LIMIT 20");
    
    echo '';
    echo '';
    echo '';
    foreach ($logs as $log) {
        echo "";
    }
    echo '
Kullanıcı IDAksiyonTarih
{$log->user_id}{$log->action_name}{$log->created_at}
'; }

Bu kod, veritabanındaki son 20 kaydı yönetici panelinde bir HTML tablosu olarak görüntüler. Gerçek bir projede, bu verileri WP_List_Table sınıfı ile genişleterek sayfalandırma ve filtreleme özellikleri ekleyebilirsiniz.

Yöntem Karşılaştırma Tablosu

Yöntem Avantaj Dezavantaj
Özel Tablo Yüksek performans, düzenli veri Ek kodlama gerektirir
WP Options Tablosu Kurulumu çok kolay Büyük veride siteyi yavaşlatır
Dosyaya Yazma Veritabanını etkilemez Veri analizi ve sorgulama zordur
Kritik Uyarı: Yazılım geliştirme sürecinde, özellikle veritabanı işlemleri yaparken, SQL sorgularınızda her zaman $wpdb->prepare() kullanın. Ayrıca, üretim (production) ortamında hata ayıklama (debug) modunu kapatmayı unutmayın.

Sıkça Sorulan Sorular

Log tablosu sitenin hızını etkiler mi?

Doğru indeksleme yapıldığı sürece (id sütunu için primary key kullanımı gibi) ve veritabanı düzenli olarak temizlendiği sürece performans üzerinde hissedilir bir etkisi olmaz.

Eski logları nasıl otomatik silebilirim?

WordPress'in wp_schedule_event fonksiyonunu kullanarak, örneğin 30 günden eski kayıtları silen bir cron job (zamanlanmış görev) oluşturabilirsiniz.

Hangi kullanıcı aksiyonlarını izlemeliyim?

Güvenlik için wp_login, wp_logout, post_updated ve user_register gibi kancaları izlemek, şüpheli hareketleri tespit etmek için yeterlidir.

Bu günlükleri e-posta ile raporlayabilir miyim?

Evet, wp_mail fonksiyonunu kullanarak günlük veya haftalık olarak log verilerini yöneticiye e-posta olarak gönderebilirsiniz.

Loglama sistemi için dış bir veritabanı kullanabilir miyim?

WordPress'in yerel veritabanı ile çalışmak en uyumlu yöntemdir; ancak çok yüksek trafikli sitelerde dış bir loglama servisi (Elasticsearch gibi) tercih edilebilir.

Log Verilerini Görselleştirme: Chart.js Entegrasyonu

Topladığınız aktivite günlüklerini sadece bir tablo içerisinde listelemek yerine, görselleştirmek verideki eğilimleri (trendleri) anlamanızı kolaylaştırır. Örneğin, günün hangi saatlerinde en çok içerik düzenlemesi yapıldığını veya hangi kullanıcıların en aktif olduğunu bir grafik üzerinde görebilirsiniz.

Bu işlem için WordPress'in yerleşik wp_enqueue_script fonksiyonunu kullanarak Chart.js kütüphanesini yönetici panelinize dahil edebiliriz.

function enqueue_activity_charts() {
    if (isset($_GET['page']) && $_GET['page'] == 'activity-logs-page') {
        wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js');
    }
}
add_action('admin_enqueue_scripts', 'enqueue_activity_charts');

Grafiği oluşturmak için veritabanından çektiğiniz verileri JSON formatına dönüştürüp JavaScript tarafına aktarmanız gerekir. Aşağıdaki örnek, log tablosundaki son 7 günün aktivite sayılarını bir diziye dönüştürmenize yardımcı olur:

// PHP tarafında veri hazırlığı
$results = $wpdb->get_results("SELECT DATE(created_at) as date, COUNT(*) as count FROM {$wpdb->prefix}user_activity GROUP BY DATE(created_at) LIMIT 7");
$chart_data = json_encode($results);

// JavaScript tarafında kullanımı
echo "";
echo "
    const data = $chart_data;
    const ctx = document.getElementById('activityChart').getContext('2d');
    new Chart(ctx, {
        type: 'bar',
        data: {
            labels: data.map(item => item.date),
            datasets: [{ label: 'Günlük Aktivite', data: data.map(item => item.count) }]
        }
    });
";

İleri Seviye Hata Ayıklama (Debugging) Stratejileri

Loglama sisteminizde bir sorun oluştuğunda, sistemin kendisini de izlemek (self-monitoring) kritik öneme sahiptir. Eğer loglar veritabanına yazılmıyorsa, WordPress'in WP_DEBUG modunu kullanarak hataları yakalayabilirsiniz.

Sistemin düzgün çalışıp çalışmadığını kontrol etmek için şu hata ayıklama fonksiyonunu kullanabilirsiniz:

function log_system_debug($message) {
    if (defined('WP_DEBUG') && WP_DEBUG) {
        error_log('Aktivite Log Sistemi: ' . $message);
    }
}

// Kullanım örneği
if ($wpdb->last_error) {
    log_system_debug('Veritabanı hatası: ' . $wpdb->last_error);
}

Ayrıca, loglama fonksiyonlarınızın performansını ölçmek için microtime() fonksiyonunu kullanarak bir işlem süresi analizi yapabilirsiniz. Eğer bir aksiyonun kaydedilmesi 0.5 saniyeden uzun sürüyorsa, veritabanı indekslerinizin eksik olup olmadığını kontrol etmeniz önerilir.

İndeksleme Önerisi

Tablonuzdaki user_id ve created_at sütunlarına indeks eklemek, binlerce satır veriniz olduğunda sorgu hızınızı ciddi oranda artıracaktır:

$wpdb->query("CREATE INDEX idx_user_activity_date ON {$wpdb->prefix}user_activity (created_at)");
$wpdb->query("CREATE INDEX idx_user_activity_user ON {$wpdb->prefix}user_activity (user_id)");

Bu indeksler, özellikle yönetici panelinde tarih bazlı filtreleme yaparken sayfa yüklenme süresini milisaniyelere indirecektir.

Sonuç

WordPress üzerinde özel bir kullanıcı aktivite günlüğü oluşturmak, sitenizin kontrolünü elinizde tutmanızı sağlayan güçlü bir araçtır. Bu rehberde, veritabanı tablosu oluşturmadan kancaları kullanmaya, verileri güvenli bir şekilde sorgulamaktan yönetici panelinde görüntülemeye kadar tüm süreci ele aldık. Bir sonraki adım olarak, bu logları görselleştiren bir grafik kütüphanesi (örneğin Chart.js) entegre ederek verilerinizi daha anlamlı hale getirebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıllık yaşam tarzı editörlüğü deneyimimle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeye odaklanıyorum.

Yorumlar (0)

Yorum Yaz