Gereksinimler ve Ön Hazırlık
Özel bir loglama sistemi geliştirmeden önce çalışma ortamınızın hazır olduğundan emin olmalısınız. Aşağıdaki araçlar ve sürüm gereksinimleri, sistemin 2026 standartlarına uygun çalışması için zorunludur:
- WordPress 6.5 veya üzeri bir sürüm.
- PHP 8.2 veya daha güncel bir sürüm (Performans ve güvenlik iyileştirmeleri için).
- Veritabanı erişimi (phpMyAdmin veya WP-CLI üzerinden tablo oluşturma yetkisi).
- Kod düzenleyici (VS Code veya benzeri bir editör).
- Bir "Child Theme" (Alt tema) veya özel bir fonksiyon eklentisi (Kodlarınızı ana tema dosyalarına yazmak, tema güncellemelerinde kodlarınızın silinmesine neden olur).
Adım 1: Log Verileri İçin Özel Veritabanı Tablosu Oluşturma
Log kayıtlarını WordPress'in standart wp_options veya wp_posts tablolarında tutmak, veritabanı performansını olumsuz etkiler. Bunun yerine, özel bir tablo oluşturarak verileri ayrıştırmalıyız. Aşağıdaki kod, eklenti veya tema aktif edildiğinde çalışacak şekilde tasarlanmıştır.
function create_custom_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'custom_user_logs';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
action_name varchar(100) NOT NULL,
object_id bigint(20) DEFAULT NULL,
log_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
ip_address varchar(45) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
Bu kod bloğu, dbDelta fonksiyonunu kullanarak veritabanı şemasını günceller. $wpdb->prefix kullanımı, tablo isminin sitenizin veritabanı önekiyle (örneğin wp_) otomatik uyumlu olmasını sağlar.
Adım 2: Etkinlik Kayıt Fonksiyonunu Yazma
Veritabanına log eklemek için her seferinde SQL sorgusu yazmak yerine, merkezi bir fonksiyon oluşturmalıyız. Bu fonksiyon, verileri güvenli bir şekilde $wpdb->insert metodu ile kaydeder.
function log_user_activity($action, $object_id = null) {
global $wpdb;
$table_name = $wpdb->prefix . 'custom_user_logs';
$user_id = get_current_user_id();
$ip_address = $_SERVER['REMOTE_ADDR'];
$wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'action_name' => sanitize_text_field($action),
'object_id' => intval($object_id),
'ip_address' => sanitize_text_field($ip_address)
),
array('%d', '%s', '%d', '%s')
);
}
Burada sanitize_text_field ve intval kullanarak SQL Injection saldırılarına karşı temel güvenlik önlemlerimizi alıyoruz. %d ve %s format belirleyicileri, veritabanı sorgusunun tip güvenliğini sağlar.
Adım 3: WordPress Kancaları (Hooks) İle Olayları İzleme
Sistemin çalışması için WordPress'in sunduğu kancaları kullanmalıyız. Örneğin, bir yazı güncellendiğinde veya kullanıcı giriş yaptığında bu fonksiyonları tetikleyeceğiz.
// Kullanıcı giriş yaptığında logla
add_action('wp_login', 'log_user_login', 10, 2);
function log_user_login($user_login, $user) {
log_user_activity('user_login', $user->ID);
}
// Yazı güncellendiğinde logla
add_action('post_updated', 'log_post_update', 10, 3);
function log_post_update($post_ID, $post_after, $post_before) {
log_user_activity('post_updated', $post_ID);
}
Bu örnekte wp_login ve post_updated kancalarını kullanarak iki farklı senaryoyu yakaladık. İhtiyacınıza göre user_register, comment_post gibi diğer kancaları da kolayca ekleyebilirsiniz.
Loglama Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Özel Tablo | Yüksek performans, kolay sorgulama | Ekstra veritabanı alanı tüketimi |
| Dosya (Log.txt) | Veritabanını yormaz | Okuma ve analiz etme zorluğu |
| Eklenti Kullanımı | Hızlı kurulum, hazır arayüz | Güvenlik riski ve kaynak tüketimi |
Adım 4: Güvenlik ve Veri Sanitizasyonu
Kritik Güvenlik Uyarısı: Kullanıcı verilerini (IP adresi, kullanıcı ID'si) işlerken her zaman veri doğrulama (validation) ve temizleme (sanitization) işlemlerini uygulayın. Ham veriyi asla doğrudan veritabanına göndermeyin. Üretim ortamında log tablolarının çok büyümesini engellemek için belirli bir süre sonra eski kayıtları silen bir "Cron Job" (zamanlanmış görev) oluşturmayı unutmayın.
Veri temizliği için WordPress'in sanitize_* fonksiyonlarını kullanmak, XSS (Cross-Site Scripting) saldırılarını engellemek için hayati önem taşır. Yukarıdaki örneklerde kullandığımız sanitize_text_field, girişi temizleyerek kötü niyetli kodların çalışmasını engeller.
Adım 5: Logları Yönetim Panelinde Görüntüleme
Logları sadece veritabanında tutmak yeterli değildir; bunları WordPress admin panelinde görebilmek için bir sayfa oluşturmalıyız.
add_action('admin_menu', 'add_log_viewer_page');
function add_log_viewer_page() {
add_menu_page('Kullanıcı Logları', 'Loglar', 'manage_options', 'user-logs', 'render_log_page');
}
function render_log_page() {
global $wpdb;
$logs = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}custom_user_logs ORDER BY log_date DESC LIMIT 50");
echo 'Son 50 Etkinlik
';
foreach ($logs as $log) {
echo '' . esc_html($log->action_name) . ' ' . esc_html($log->log_date) . ' ';
}
echo '
';
}
esc_html fonksiyonu, veritabanından gelen verileri ekrana basarken HTML etiketlerini etkisiz hale getirir. Bu, admin panelinizde oluşabilecek güvenlik açıklarını kapatmak için standart bir uygulamadır.
Sıkça Sorulan Sorular
Log tablosu ne kadar sürede temizlenmeli?
Sitenizin trafik yoğunluğuna bağlı olarak 30 veya 90 günlük periyotlarla eski logları temizlemeniz önerilir. Aksi takdirde veritabanınız gereksiz yere şişecektir.
Bu sistem site hızını etkiler mi?
Veri ekleme işlemi (INSERT) çok hızlıdır. Ancak çok yüksek trafikli sitelerde (günde 100.000+ ziyaretçi) loglama işlemini arka plan kuyruğuna (Action Scheduler) almanız gerekebilir.
Özel loglama sistemi neden eklentiden daha iyidir?
Hazır eklentiler genellikle ihtiyacınız olmayan birçok özelliği barındırır ve gereksiz kod yükü oluşturur. Kendi sisteminizi yazmak, sadece ihtiyacınız olan veriyi en yalın haliyle tutmanızı sağlar.
Loglarımı dışarı aktarabilir miyim?
Evet, render_log_page fonksiyonuna bir "CSV olarak dışa aktar" butonu ekleyerek verileri kolayca Excel veya benzeri programlara aktarabilirsiniz.
Hangi kullanıcı rollerini loglamalıyım?
Güvenlik açısından özellikle 'administrator' ve 'editor' rollerinin gerçekleştirdiği tüm işlemleri loglamanız önerilir. 'Subscriber' (abone) rolleri için ise sadece giriş-çıkış hareketleri yeterli olabilir.
İleri Seviye Optimizasyon: Log Verilerini Arşivleme ve Performans Yönetimi
Loglama sisteminiz büyüdükçe, veritabanınızdaki wp_user_activity_logs tablosu milyonlarca satıra ulaşabilir. Bu durum, admin panelindeki sorguların yavaşlamasına ve genel site performansının düşmesine neden olur. Veritabanı performansını korumak için "Log Rotasyonu" stratejisi uygulamak kritik öneme sahiptir.
Otomatik Temizleme (Cron Job) ile Veri Yönetimi
WordPress'in yerleşik WP-Cron sistemini kullanarak, belirli bir süreden eski olan logları otomatik olarak silen bir fonksiyon oluşturabilirsiniz. Aşağıdaki kod, 30 günden eski logları veritabanından kalıcı olarak temizler:
if ( ! wp_next_scheduled( 'cleanup_old_activity_logs' ) ) {
wp_schedule_event( time(), 'daily', 'cleanup_old_activity_logs' );
}
add_action( 'cleanup_old_activity_logs', 'perform_log_cleanup' );
function perform_log_cleanup() {
global $wpdb;
$table_name = $wpdb->prefix . 'user_activity_logs';
$threshold = date( 'Y-m-d H:i:s', strtotime( '-30 days' ) );
$wpdb->query( $wpdb->prepare(
"DELETE FROM $table_name WHERE created_at < %s",
$threshold
) );
}
Hata Ayıklama ve Log İzleme Senaryoları
Sisteminizi kurduktan sonra, logların doğru çalışıp çalışmadığını doğrulamak için bir "Debug Mode" (Hata Ayıklama Modu) geliştirmeniz önerilir. Bu sayede, loglama fonksiyonu tetiklendiğinde veritabanına yazılan veriyi anlık olarak görebilirsiniz.
Örnek Senaryo: Kritik İşlem Takibi
Özellikle e-ticaret sitelerinde, kullanıcıların "Sepeti Boşalt" veya "Kupon Uygula" gibi işlemleri kritik öneme sahiptir. Bu tür özel olayları yakalamak için do_action kancasını manuel olarak tetikleyebilirsiniz:
// Sepet temizlendiğinde logla
add_action( 'woocommerce_cart_emptied', 'log_cart_emptied_event' );
function log_cart_emptied_event() {
$user_id = get_current_user_id();
$details = 'Kullanıcı sepetini tamamen boşalttı.';
// Daha önce oluşturduğumuz log_user_activity fonksiyonunu çağırıyoruz
log_user_activity( $user_id, 'cart_empty', $details );
}
Loglama Sistemini Test Etme
Sisteminizi canlıya almadan önce şu senaryoları mutlaka test etmelisiniz:
- Rol Bazlı Test: Yönetici, editör ve abone hesapları ile giriş yapıp her birinin log tablosuna doğru şekilde işlendiğini kontrol edin.
- Veri Bütünlüğü: IP adresi ve User-Agent bilgilerinin doğru alınıp alınmadığını
$_SERVERdeğişkenleri üzerinden doğrulayın. - Hata Yönetimi: Veritabanı bağlantısı koptuğunda sistemin sitenin genel çalışmasını durdurmadığından emin olun (try-catch blokları kullanın).
İpucu: Eğer yüksek trafikli bir siteniz varsa, logları doğrudan veritabanına yazmak yerine, geçici olarak bir Redis veya Memcached önbelleğine alıp, belirli aralıklarla (batch) veritabanına aktarmak (asenkron işlem) sunucu yükünü ciddi oranda azaltacaktır.
Sonuç
WordPress ile özel bir kullanıcı etkinlik loglama sistemi kurmak, sitenizin güvenliğini ve izlenebilirliğini artırmanın en profesyonel yoludur. Bu rehberde, veritabanı tablosu oluşturmaktan admin panelinde görüntülemeye kadar tüm süreci ele aldık. Bir sonraki adım olarak, bu logları belirli bir hata oluştuğunda e-posta ile bildiren bir sistem (Notification System) geliştirmeyi deneyebilirsiniz.
Sorumluluk Reddi: Bu rehberde paylaşılan kod örnekleri eğitim amaçlıdır. Canlı sitenizde uygulamadan önce mutlaka bir "staging" (test) ortamında denemeli ve veritabanı yedeğinizi almalısınız. Kodların yanlış kullanımı veritabanı hatalarına yol açabilir.


Yorumlar (0)
Yorum Yaz