Gereksinimler ve Ön Hazırlık
Bu sistemi kurmadan önce çalışma ortamınızın hazır olduğundan emin olmalısınız. WordPress üzerinde özel bir kayıt sistemi oluşturmak için aşağıdaki araçlara ve bilgilere ihtiyacınız vardır:
- PHP 8.2 veya üzeri: Modern sözdizimi ve güvenlik güncellemeleri için gereklidir.
- WordPress 6.5 veya üzeri: Güncel veritabanı fonksiyonları için zorunludur.
- Veritabanı Erişimi: Özel tablolar oluşturmak için
$wpdbsınıfına hakimiyet. - FTP/SFTP veya Dosya Yöneticisi: Kodlarınızı temanızın
functions.phpdosyasına veya özel bir eklentiye eklemek için.
Başlamadan önce mutlaka sitenizin tam yedeğini almanız gerektiğini unutmayın. Veritabanı üzerinde yapılan hatalı işlemler sitenizin çalışmamasına neden olabilir.
Özel Denetim Tablosunu Veritabanında Oluşturma
Kullanıcı hareketlerini saklamak için WordPress'in standart tablolarını kullanmak yerine, veritabanı performansını korumak adına özel bir tablo oluşturmalıyız. Bu işlem, WordPress'in dbDelta fonksiyonu ile gerçekleştirilir.
function ozel_denetim_tablosunu_olustur() {
global $wpdb;
$table_name = $wpdb->prefix . 'kullanici_denetim_loglari';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id mediumint(9) NOT NULL,
eylem varchar(255) NOT NULL,
tarih datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
ip_adresi varchar(45) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'ozel_denetim_tablosunu_olustur');
Yukarıdaki kod, eklenti veya tema aktif edildiğinde wp_kullanici_denetim_loglari adında bir tablo oluşturur. dbDelta fonksiyonu, tablonun mevcut olup olmadığını kontrol eder ve gerekirse günceller.
Kullanıcı Eylemlerini Yakalama ve Kaydetme
WordPress'in "Action Hook" yapısını kullanarak kullanıcıların giriş yapması, yazı yayınlaması veya profil güncellemesi gibi eylemleri yakalayabiliriz. Örneğin, bir kullanıcı giriş yaptığında bunu nasıl kaydedeceğimize bakalım.
add_action('wp_login', 'denetim_giris_kaydi', 10, 2);
function denetim_giris_kaydi($user_login, $user) {
global $wpdb;
$table_name = $wpdb->prefix . 'kullanici_denetim_loglari';
$wpdb->insert(
$table_name,
array(
'user_id' => $user->ID,
'eylem' => 'Kullanıcı giriş yaptı: ' . $user_login,
'tarih' => current_time('mysql'),
'ip_adresi' => $_SERVER['REMOTE_ADDR']
),
array('%d', '%s', '%s', '%s')
);
}
Burada wp_login kancasını kullanarak giriş anını dinliyoruz. $wpdb->insert metodu, SQL Injection saldırılarına karşı verileri güvenli bir şekilde veritabanına işler. Üçüncü parametre olan dizi, verilerin veri tiplerini belirterek güvenliği artırır.
Kritik Güvenlik Uyarısı: Kullanıcı IP adreslerini kaydederken KVKK (Kişisel Verilerin Korunması Kanunu) ve GDPR uyumluluğunu göz önünde bulundurmalısınız. IP adresleri kişisel veri sayılabilir; bu verileri anonimleştirmek veya kullanıcıyı bilgilendirmek yasal bir zorunluluk olabilir.
Yönetici Panelinde Denetim Kayıtlarını Listeleme
Topladığınız verilerin bir anlam ifade etmesi için onları WordPress yönetici panelinde bir tablo halinde görüntülemelisiniz. Bunun için add_menu_page fonksiyonu ile özel bir sayfa oluşturabiliriz.
add_action('admin_menu', 'denetim_menusu_ekle');
function denetim_menusu_ekle() {
add_menu_page('Denetim Kayıtları', 'Denetim Logları', 'manage_options', 'denetim-loglari', 'denetim_sayfasi_icerigi');
}
function denetim_sayfasi_icerigi() {
global $wpdb;
$table_name = $wpdb->prefix . 'kullanici_denetim_loglari';
$loglar = $wpdb->get_results("SELECT * FROM $table_name ORDER BY tarih DESC LIMIT 50");
echo 'Kullanıcı Denetim Kayıtları
';
echo 'Kullanıcı ID Eylem Tarih ';
foreach ($loglar as $log) {
echo ''.$log->user_id.' '.$log->eylem.' '.$log->tarih.' ';
}
echo '
';
}
Bu kod, veritabanından son 50 kaydı çeker ve WordPress'in CSS sınıflarını kullanarak yönetici panelinde şık bir tablo oluşturur. manage_options yetkisi, bu sayfayı sadece yöneticilerin görmesini sağlar.
Yöntem Karşılaştırması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Özel Tablo | Yüksek performans, esneklik. | Kodlama bilgisi gerektirir. |
| Eklenti Kullanımı | Hızlı kurulum, kolay yönetim. | Sistemi yavaşlatabilir, güvenlik riski. |
Yaygın Hatalar ve Debug İpuçları
Sistemi geliştirirken karşılaşabileceğiniz en yaygın hata, $wpdb nesnesinin tanımlanmamasıdır. Her fonksiyon içerisinde global $wpdb; satırını eklediğinizden emin olun. Ayrıca, veritabanı sorgularınızda hata alıyorsanız $wpdb->show_errors(); fonksiyonunu kullanarak hataları ekrana yazdırabilirsiniz.
Bir diğer önemli nokta ise performans. Eğer siteniz çok yüksek trafik alıyorsa, log tablosu hızla büyüyecektir. Belirli aralıklarla eski kayıtları silen bir "Cron Job" (zamanlanmış görev) oluşturmayı düşünmelisiniz.
Sıkça Sorulan Sorular
Log tablosu veritabanını çok yavaşlatır mı?
Log tablosuna indeksleme eklediğiniz sürece yavaşlatmaz. Tablo oluşturma sorgusuna INDEX eklemeyi unutmayın.
Kullanıcıların hangi sayfaları gezdiğini de kaydedebilir miyim?
Evet, template_redirect kancasını kullanarak her sayfa görüntülenmesinde kayıt oluşturabilirsiniz. Ancak bu, veritabanı boyutunu çok hızlı artıracaktır.
Bu sistemi eklenti olarak nasıl paketlerim?
Kodlarınızı wp-content/plugins/denetim-sistemi/denetim-sistemi.php dosyasına yerleştirip başına gerekli yorum satırlarını (Plugin Name, Description) ekleyerek paketleyebilirsiniz.
SQL Injection saldırılarına karşı nasıl önlem alırım?
Her zaman $wpdb->prepare() metodunu kullanın. Kullanıcıdan gelen verileri asla doğrudan sorguya eklemeyin.
Logları dışa aktarabilir miyim?
Evet, fputcsv PHP fonksiyonunu kullanarak veritabanındaki verileri bir CSV dosyasına yazdırabilir ve yönetici panelinden indirme bağlantısı verebilirsiniz.
Log Verilerini Otomatik Olarak Temizleme (Log Rotasyonu)
Denetim kayıtlarınız zamanla veritabanınızda ciddi bir yer kaplayabilir. Özellikle yüksek trafikli sitelerde, wp_audit_logs tablonuzun milyonlarca satıra ulaşması sorgu performansını düşürür. Bu durumu engellemek için WordPress'in WP-Cron yapısını kullanarak belirli bir süreden eski kayıtları otomatik silen bir mekanizma kurmalısınız.
Aşağıdaki kod bloğu, 30 günden eski kayıtları her gün otomatik olarak veritabanından temizler:
// Log temizleme fonksiyonu
function audit_log_cleanup_cron() {
global $wpdb;
$table_name = $wpdb->prefix . 'audit_logs';
$thirty_days_ago = date('Y-m-d H:i:s', strtotime('-30 days'));
$wpdb->query(
$wpdb->prepare(
"DELETE FROM $table_name WHERE created_at < %s",
$thirty_days_ago
)
);
}
// Cron zamanlamasını kaydet
if (!wp_next_scheduled('daily_audit_log_cleanup')) {
wp_schedule_event(time(), 'daily', 'daily_audit_log_cleanup');
}
add_action('daily_audit_log_cleanup', 'audit_log_cleanup_cron');
Dış Servislere Log Gönderimi (Webhook Entegrasyonu)
Güvenlik loglarınızı sadece kendi veritabanınızda tutmak, bir saldırganın veritabanına erişip logları silmesi durumunda sizi savunmasız bırakır. Bu nedenle, kritik eylemleri (yönetici girişi, eklenti aktivasyonu gibi) eş zamanlı olarak harici bir log yönetim sistemine (Elasticsearch, Papertrail veya Slack Webhook) göndermek en iyi uygulamadır.
Örneğin, bir yönetici girişi gerçekleştiğinde Slack kanalınıza bildirim göndermek için şu yapıyı kullanabilirsiniz:
add_action('wp_login', 'send_audit_to_slack', 10, 2);
function send_audit_to_slack($user_login, $user) {
$webhook_url = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL';
$message = "Güvenlik Uyarısı: " . $user_login . " kullanıcısı giriş yaptı.";
$payload = json_encode(['text' => $message]);
wp_remote_post($webhook_url, [
'method' => 'POST',
'headers' => ['Content-Type' => 'application/json'],
'body' => $payload,
]);
}
Performans Optimizasyonu İçin İpuçları
- Asenkron İşlemler: Log kaydetme işlemini
wp_remote_postgibi dış servis çağrılarıyla yapıyorsanız, kullanıcı deneyimini yavaşlatmamak için bu işlemleriwp_schedule_single_eventile arka plana atın. - İndeksleme: Veritabanı tablonuzda
user_idvecreated_atsütunlarına mutlaka indeks ekleyin. Bu, yönetici panelinde tarih bazlı filtreleme yaparken sorgu hızını 10 kat artıracaktır. - Sorgu Sınırlandırma: Yönetici panelindeki listeleme sayfasında
OFFSETveLIMITkullanarak verileri sayfalara bölün; tüm logları tek bir sorguda çekmek bellek (memory) limitlerini zorlayabilir.
Sonuç
WordPress ile özel bir kullanıcı denetim kayıt sistemi oluşturmak, sitenizin güvenliğini ve kullanıcı hareketliliğini takip etmeniz için en profesyonel yoldur. Bu rehberde; tablo oluşturma, eylem yakalama ve verileri listeleme süreçlerini adım adım öğrendiniz. Bir sonraki adım olarak, bu logları bir CSV dosyasına aktaran bir dışa aktarma özelliği ekleyerek sisteminizi daha işlevsel hale getirebilirsiniz.
Sorumluluk Reddi: Bu rehberde paylaşılan kodlar eğitim amaçlıdır. Canlı bir web sitesinde kullanmadan önce mutlaka bir geliştirme ortamında test edin. Kodların güvenliğinden ve veritabanı yedeklerinden kullanıcı sorumludur.

Yorumlar (0)
Yorum Yaz