Gereksinimler ve Ön Hazırlık
Bu sistemi kurmak için temel WordPress geliştirme ortamına ihtiyacınız vardır. Çalışmalarınıza başlamadan önce yerel bir geliştirme ortamı (LocalWP veya benzeri) kullanmanızı ve mutlaka bir alt tema (child theme) üzerinde çalışmanızı öneririz.
- WordPress 6.5 veya üzeri bir sürüm.
- PHP 8.2 veya üzeri (güncel güvenlik standartları için).
- Temel düzeyde JavaScript (Fetch API veya jQuery kullanımı).
- Veritabanı erişimi (phpMyAdmin veya WP-CLI).
İşleme başlamadan önce functions.php dosyanızın yedeğini almayı ve hata ayıklama modunu (WP_DEBUG) aktif etmeyi unutmayın.
Veritabanı Yapısı: Kullanıcı Meta Verilerini Kullanmak
WordPress'te kullanıcıya özel verileri saklamak için en verimli yöntem update_user_meta fonksiyonudur. Bu yöntem, her kullanıcı için ayrı bir satır oluşturmak yerine, kullanıcının profil verileriyle entegre bir dizi (array) yapısı kullanmamıza olanak tanır.
Aşağıdaki kod bloğu, kullanıcının favori listesine bir içerik ID'si eklemek için temel fonksiyonu tanımlar:
function add_to_favorites_list($post_id) {
if (!is_user_logged_in()) return false;
$user_id = get_current_user_id();
$favorites = get_user_meta($user_id, 'user_favorites', true);
if (!$favorites) $favorites = array();
if (!in_array($post_id, $favorites)) {
$favorites[] = $post_id;
update_user_meta($user_id, 'user_favorites', $favorites);
return true;
}
return false;
}
Bu fonksiyon, kullanıcının mevcut favori listesini çeker, ID'nin zaten ekli olup olmadığını kontrol eder ve ardından güncel listeyi veritabanına kaydeder.
AJAX ile Dinamik Favori İşlemleri
Kullanıcı "Favorilere Ekle" butonuna tıkladığında sayfanın yenilenmemesi için AJAX (Asynchronous JavaScript and XML) kullanmalıyız. Bu, kullanıcı deneyimi açısından kritik bir adımdır.
Öncelikle, WordPress'in AJAX yöneticisine isteği nasıl işleyeceğini bildiren PHP kodunu ekleyelim:
add_action('wp_ajax_toggle_favorite', 'handle_toggle_favorite');
function handle_toggle_favorite() {
check_ajax_referer('fav_nonce', 'nonce');
$post_id = intval($_POST['post_id']);
$user_id = get_current_user_id();
// İşlem mantığı burada yer alacak
wp_send_json_success(array('message' => 'İşlem başarılı'));
}
Burada check_ajax_referer kullanarak CSRF (Cross-Site Request Forgery) saldırılarına karşı güvenlik önlemi alıyoruz. Bu, isteğin sitenizden geldiğini doğrular.
JavaScript ile İsteği Göndermek
Önyüzde kullanıcının etkileşimini dinlemek ve sunucuya veri göndermek için modern JavaScript (Fetch API) kullanacağız. Aşağıdaki kod, tıklama olayını yakalar ve AJAX isteğini başlatır.
document.addEventListener('DOMContentLoaded', () => {
const favButtons = document.querySelectorAll('.fav-btn');
favButtons.forEach(btn => {
btn.addEventListener('click', async (e) => {
const postId = e.target.dataset.id;
const response = await fetch(ajaxurl, {
method: 'POST',
body: new URLSearchParams({
action: 'toggle_favorite',
post_id: postId,
nonce: fav_data.nonce
})
});
const result = await response.json();
if(result.success) alert('Favorilere eklendi!');
});
});
});
Bu kod bloğu, sayfadaki tüm favori butonlarını seçer ve her biri için bir dinleyici (event listener) atar. ajaxurl değişkeni WordPress tarafından otomatik olarak tanımlanır.
Güvenlik ve Performans Karşılaştırması
Favori sistemi oluştururken farklı yöntemleri değerlendirmeniz gerekebilir. Aşağıdaki tablo, yaygın yaklaşımları karşılaştırmaktadır:
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| User Meta | Hızlı, yerel WordPress fonksiyonu | Çok büyük listelerde performans sorunu |
| Custom Table | Yüksek performans, ölçeklenebilir | Daha karmaşık veritabanı yönetimi |
| Cookie/LocalStorage | Sunucu yükü yok | Cihazlar arası senkronizasyon yok |
Kritik Güvenlik Uyarısı: Kullanıcı verileriyle çalışırken her zaman
sanitize_text_fieldveyaintvalgibi temizleme fonksiyonlarını kullanın. Asla kullanıcıdan gelen veriyi doğrudan SQL sorgusuna veya veritabanı fonksiyonuna dahil etmeyin. Bu, SQL Injection açıklarına yol açabilir.
Favori Listesini Görüntüleme
Kullanıcının favorilerini bir sayfada listelemek için WP_Query sınıfını kullanabiliriz. Bu, kullanıcı meta verisinde saklanan ID'leri alıp, bu ID'lere ait içerikleri döngüye sokmamızı sağlar.
function get_user_favorites_posts() {
$user_id = get_current_user_id();
$fav_ids = get_user_meta($user_id, 'user_favorites', true);
if (!$fav_ids) return 'Henüz favoriniz yok.';
$query = new WP_Query(array(
'post__in' => $fav_ids,
'post_type' => 'post'
));
return $query;
}
Bu fonksiyon, favori ID'lerini bir dizi olarak alır ve post__in parametresi ile sadece bu ID'lere sahip içerikleri sorgular.
Sıkça Sorulan Sorular
Favori listesi veritabanını çok yorar mı?
Kullanıcı sayısı az olan sitelerde user_meta kullanımı herhangi bir performans sorunu yaratmaz. Ancak yüz binlerce kullanıcınız varsa, özel bir veritabanı tablosu oluşturmak daha verimli olacaktır.
Kullanıcı giriş yapmazsa ne olur?
Kullanıcı giriş yapmadığında is_user_logged_in() kontrolü ile işlemi engelleyebilir veya favorileri localStorage üzerinde tutarak geçici bir çözüm sunabilirsiniz.
Favori butonunu nasıl özelleştirebilirim?
Butonun durumunu (favori mi, değil mi) kontrol ederek CSS sınıfları (örneğin .is-active) ekleyebilir ve JavaScript ile bu sınıfı değiştirerek ikonun renk değiştirmesini sağlayabilirsiniz.
Bu sistem sayfayı yavaşlatır mı?
AJAX kullanımı, sayfanın tamamının yeniden yüklenmesini engellediği için kullanıcı deneyimini iyileştirir. Sunucu tarafında ise sadece ilgili veriyi çektiğimiz için oldukça hafiftir.
Mobil cihazlarda çalışır mı?
Evet, JavaScript ve AJAX tabanlı olduğu için tüm modern mobil tarayıcılarda sorunsuz çalışır.
İleri Seviye Optimizasyon: Favori Verilerini Önbelleğe Alma
Sisteminiz büyüdükçe ve kullanıcı sayınız arttıkça, her sayfa yüklenişinde get_user_meta fonksiyonunu veritabanından çekmek, özellikle çok fazla favorisi olan kullanıcılar için sorgu yükünü artırabilir. Bu durumu optimize etmek için WordPress'in Transients API yapısını kullanarak favori listelerini geçici olarak önbelleğe alabiliriz.
Aşağıdaki kod örneği, kullanıcının favori listesini veritabanından çekmek yerine, varsa önbellekten getirmeyi, yoksa veritabanından çekip önbelleğe kaydetmeyi sağlar:
function get_user_favorites_optimized($user_id) {
$transient_key = 'user_favs_' . $user_id;
$favorites = get_transient($transient_key);
if (false === $favorites) {
$favorites = get_user_meta($user_id, 'user_favorites', true);
set_transient($transient_key, $favorites, 12 * HOUR_IN_SECONDS);
}
return is_array($favorites) ? $favorites : [];
}
Bu yaklaşım, veritabanı üzerindeki okuma yükünü ciddi oranda azaltır. Ancak unutmayın; kullanıcı yeni bir favori eklediğinde veya çıkardığında, ilgili delete_transient($transient_key) fonksiyonunu çağırarak önbelleği temizlemeniz gerekir.
Hata Ayıklama ve Loglama Stratejileri
AJAX tabanlı sistemlerde en sık karşılaşılan sorunlar, sunucu tarafındaki 403 (Yetki Hatası) veya 500 (Sunucu Hatası) kodlarıdır. Geliştirme aşamasında bu hataları tespit etmek için WordPress'in hata ayıklama günlüğünü (debug log) aktif etmeniz kritiktir.
Geliştirici Konsolu ile İzleme
Tarayıcınızın "Network" sekmesini kullanarak AJAX isteğinin yanıtını inceleyebilirsiniz. Eğer sunucudan dönen yanıt beklediğiniz JSON verisi değil de bir PHP hata mesajı ise, wp-config.php dosyanızda şu ayarların açık olduğundan emin olun:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Bu ayarlar, hataları sitenizin ön yüzünde göstermek yerine wp-content/debug.log dosyasına yazar. Eğer AJAX işleminiz çalışmıyorsa, kodunuza şu basit loglama satırını ekleyerek verinin ulaşıp ulaşmadığını kontrol edebilirsiniz:
add_action('wp_ajax_toggle_favorite', function() {
$post_id = intval($_POST['post_id']);
if (!$post_id) {
error_log('Favori hatası: Post ID alınamadı.');
wp_send_json_error('Geçersiz ID');
}
// İşlemler devam eder...
});
Favori Listesi Verilerini Dışa Aktarma (Export)
Kullanıcılarınızın favori listelerini bir CSV dosyası olarak indirmelerini sağlamak, kullanıcı deneyimini bir üst seviyeye taşır. Bunun için admin-post.php yapısını kullanarak özel bir indirme rotası oluşturabilirsiniz.
| Yöntem | Avantajı | Zorluk Derecesi |
|---|---|---|
| WP_Query ile Çekme | Basit ve hızlı | Kolay |
| Transient Önbellekleme | Yüksek performans | Orta |
| Custom Database Table | Ölçeklenebilir | İleri |
Eğer favori listeniz binlerce öğeye ulaşıyorsa, user_meta yerine özel bir veritabanı tablosu (Custom Table) kullanmanız, veritabanı sorgularını daha hızlı optimize etmenize olanak tanır. Ancak küçük ve orta ölçekli projeler için user_meta yapısı, WordPress standartlarına en uygun ve yönetilebilir yöntemdir.
Sonuç
WordPress ile özel bir favori sistemi oluşturmak, sitenizin kullanıcı etkileşimini artırmanın en sağlam yoludur. Bu rehberde öğrendiğiniz update_user_meta, AJAX entegrasyonu ve WP_Query kullanımı, WordPress geliştirme dünyasındaki en temel ve güçlü araçlardır. Bir sonraki adım olarak, favori listelerini dışa aktarma (export) veya kullanıcılara favori içerikleriyle ilgili bildirim gönderme gibi özellikleri sisteminize eklemeyi deneyebilirsiniz.
Yasal Uyarı: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka güvenlik testlerini yapın ve kodların sitenizin mevcut yapısıyla uyumlu olduğundan emin olun. Yazılım güvenliği sorumluluğu geliştiriciye aittir.


Yorumlar (0)
Yorum Yaz