Gereksinimler ve Ön Hazırlık
Bu projeyi hayata geçirmek için WordPress altyapınızın güncel (2026 standartlarında 6.x+) olması gerekmektedir. İşlemleri doğrudan temanızın functions.php dosyası üzerinden veya daha temiz bir yönetim için özel bir eklenti oluşturarak yapabilirsiniz.
- PHP 8.2+: Modern sözdizimi ve performans için önerilen sürüm.
- WordPress 6.5+: REST API ve veritabanı fonksiyonlarının güncelliği için.
- Child Theme (Alt Tema): Kodlarınızın tema güncellemelerinde silinmemesi için mutlaka bir alt tema kullanın.
- Temel Bilgi: PHP, JavaScript (Fetch API) ve WordPress veritabanı (WPDB) yapısı hakkında temel düzeyde bilgi.
Adım 1: Kullanıcı Favorileri İçin Veritabanı Yapısını Belirleme
WordPress'te kullanıcı meta verileri (User Meta), favorileri saklamak için en pratik yöntemdir. Her kullanıcı için 'favori_yazilar' adında bir dizi oluşturacağız. Bu yöntem, veritabanını yormadan hızlı okuma/yazma işlemi yapmanızı sağlar.
// Kullanıcının favori listesini getiren yardımcı fonksiyon
function get_kullanici_favorileri($user_id) {
$favoriler = get_user_meta($user_id, 'favori_yazilar', true);
return is_array($favoriler) ? $favoriler : [];
}
Yukarıdaki kod, get_user_meta fonksiyonunu kullanarak kullanıcının favorilerini çeker. Eğer veri yoksa, hata almamak için boş bir dizi döndürürüz. Bu, veritabanı sorgularımızı optimize etmek için kritik bir adımdır.
Adım 2: AJAX ile Favori Ekleme ve Çıkarma İşlemi
Kullanıcı "Favorilere Ekle" butonuna tıkladığında sayfanın yenilenmemesi gerekir. Bunun için WordPress AJAX API'sini kullanacağız. wp_ajax_ öneki ile başlayan fonksiyonlar, giriş yapmış kullanıcılar için güvenli bir iletişim kanalı sağlar.
add_action('wp_ajax_favori_islem', 'favori_islem_fonksiyonu');
function favori_islem_fonksiyonu() {
check_ajax_referer('favori_nonce', 'security');
$user_id = get_current_user_id();
$post_id = intval($_POST['post_id']);
if (!$user_id) wp_send_json_error('Giriş yapmalısınız.');
$favoriler = get_kullanici_favorileri($user_id);
if (in_array($post_id, $favoriler)) {
$favoriler = array_diff($favoriler, [$post_id]);
$durum = 'silindi';
} else {
$favoriler[] = $post_id;
$durum = 'eklendi';
}
update_user_meta($user_id, 'favori_yazilar', $favoriler);
wp_send_json_success(['durum' => $durum]);
}
Bu kod bloğunda check_ajax_referer kullanarak CSRF (Cross-Site Request Forgery) saldırılarına karşı önlem aldık. intval ile gelen veriyi temizleyerek SQL injection riskini ortadan kaldırdık.
Adım 3: JavaScript ile İstek Gönderme
Şimdi, kullanıcının buton tıklamasını yakalayıp sunucuya gönderen JavaScript kodunu hazırlayalım. Modern fetch API kullanımı, 2026 standartlarına uygun ve daha okunabilirdir.
document.addEventListener('DOMContentLoaded', () => {
const favoriBtn = document.querySelector('.favori-btn');
favoriBtn.addEventListener('click', function() {
const post_id = this.dataset.postid;
fetch(ajaxurl, {
method: 'POST',
body: new URLSearchParams({
'action': 'favori_islem',
'post_id': post_id,
'security': favori_obj.nonce
})
})
.then(response => response.json())
.then(data => {
if(data.success) alert('İşlem başarılı: ' + data.data.durum);
});
});
});
Burada ajaxurl değişkenini WordPress'in wp_localize_script fonksiyonu ile tanımlamanız gerektiğini unutmayın. Bu, JavaScript dosyanıza WordPress içinden veri aktarmanın standart yoludur.
Adım 4: Favori Listesini Görüntüleme
Kullanıcının kendi favorilerini görebileceği bir sayfa oluşturmak için özel bir kısa kod (shortcode) tanımlayacağız. Bu kısa kod, favori ID'lerini alır ve WP_Query ile içerikleri ekrana basar.
add_shortcode('favorilerim_listesi', 'favorileri_goster');
function favorileri_goster() {
$user_id = get_current_user_id();
$favoriler = get_kullanici_favorileri($user_id);
if (empty($favoriler)) return 'Henüz favoriniz yok.';
$query = new WP_Query(['post__in' => $favoriler, 'post_type' => 'post']);
ob_start();
while ($query->have_posts()) {
$query->the_post();
echo ''.get_the_title().' ';
}
wp_reset_postdata();
return ob_get_clean();
}
Bu fonksiyon, ob_start() ve ob_get_clean() kullanarak çıktı tamponlaması yapar. Bu sayede verileri doğrudan ekrana basmak yerine bir değişkende toplayıp kısa kodun döndürülmesini sağlarız.
Yöntemlerin Karşılaştırılması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| User Meta | Hızlı, kolay kurulum | Çok büyük verilerde yavaşlayabilir |
| Custom Table | Yüksek performans, ölçeklenebilir | Karmaşık SQL sorguları gerektirir |
| Eklenti | Hızlı çözüm | Sitenizi ağırlaştırabilir |
Kritik Güvenlik Uyarısı: Üretim ortamında (production) kullanıcı verilerini işlerken her zaman
sanitize_text_fieldveyaintvalgibi temizleme fonksiyonlarını kullanın. Asla kullanıcıdan gelen veriyi doğrudan veritabanına sorgu olarak göndermeyin.
Sıkça Sorulan Sorular
Favori listesi veritabanını yavaşlatır mı?
Kullanıcı başına meta verisi saklamak, orta ölçekli sitelerde herhangi bir performans sorunu yaratmaz. Ancak milyonlarca kullanıcınız varsa özel bir veritabanı tablosu tercih etmelisiniz.
Giriş yapmayan kullanıcılar favori ekleyebilir mi?
Bu rehberde güvenlik nedeniyle sadece giriş yapmış kullanıcıları hedefledik. Giriş yapmayanlar için "Cookie" veya "Local Storage" kullanmanız gerekir ancak bu veriler cihaz değiştiğinde kaybolacaktır.
Favori butonunu nasıl stilize ederim?
Butonunuza .favori-btn sınıfını vererek CSS üzerinden background-image veya font-awesome ikonları ile kolayca özelleştirebilirsiniz.
Listeyi nasıl sıfırlayabilirim?
delete_user_meta($user_id, 'favori_yazilar') fonksiyonunu kullanarak kullanıcının tüm favorilerini tek seferde silebilirsiniz.
Bu kodlar tema değişince silinir mi?
Eğer kodları temanın functions.php dosyasına eklerseniz silinir. Bu yüzden "Code Snippets" eklentisini kullanmanız veya özel bir eklenti yazmanız önerilir.
İleri Düzey Optimizasyon ve Performans İpuçları
Favori sistemi büyüdükçe, veritabanı sorgularınızın performansı kullanıcı deneyimini doğrudan etkileyebilir. Özellikle binlerce kullanıcının aynı anda içerik favorilediği senaryolarda, wp_user_meta tablosu üzerindeki yükü azaltmak için bazı stratejiler izlemelisiniz.
Veritabanı Sorgularını Önbelleğe Alma (Caching)
Her sayfa yüklenişinde kullanıcının favori listesini veritabanından çekmek yerine, WordPress'in Transient API özelliğini kullanarak bu listeyi geçici olarak bellekte tutabilirsiniz. Bu, sunucu üzerindeki sorgu yükünü ciddi oranda düşürür.
function get_user_favorites_cached($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 $favorites;
}
Bu yaklaşım, kullanıcının favori listesini her 12 saatte bir güncelleyerek veritabanı erişimini optimize eder. Favori ekleme veya çıkarma işlemi yapıldığında ise delete_transient('user_favs_' . $user_id); komutuyla önbelleği temizleyerek güncel verinin çekilmesini sağlamalısınız.
Hata Ayıklama ve İzleme (Debugging)
Geliştirme sürecinde AJAX isteklerinin başarısız olması durumunda sorunu tespit etmek için tarayıcı konsolunu ve WordPress hata günlüklerini (debug log) aktif olarak kullanmalısınız. AJAX yanıtlarını kontrol etmek için aşağıdaki hata yakalama yapısını JavaScript dosyanıza ekleyebilirsiniz.
$.ajax({
url: ajax_object.ajax_url,
type: 'POST',
data: {
action: 'toggle_favorite',
post_id: postID
},
success: function(response) {
if(response.success) {
console.log('İşlem başarılı: ' + response.data);
} else {
console.error('İşlem hatası: ' + response.data);
}
},
error: function(xhr, status, error) {
console.error('AJAX İsteği başarısız: ' + error);
}
});
Sunucu Tarafı Hata Günlüklerini Aktif Etme
wp-config.php dosyanızda aşağıdaki ayarları yaparak, favori sistemiyle ilgili arka planda oluşan hataları wp-content/debug.log dosyasında görüntüleyebilirsiniz:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
Bu yapılandırma, kullanıcılarınızın görmediği ancak sistemin arka planında gerçekleşen PHP Notice veya Fatal Error hatalarını yakalamanıza yardımcı olur. Özellikle update_user_meta fonksiyonunun başarısız olduğu durumlarda bu günlükler hayat kurtarıcıdır.
| Sorun | Olası Neden | Çözüm |
|---|---|---|
| Buton tıklanmıyor | JavaScript çakışması | Konsolda "ReferenceError" olup olmadığını kontrol edin. |
| Favori kaydedilmiyor | Nonce doğrulaması hatası | wp_create_nonce ve check_ajax_referer değerlerini eşleştirin. |
| Veri güncellenmiyor | Veritabanı önbelleği | Transients verisini temizleyin. |
Sonuç
WordPress ile özel bir kullanıcı dinamik sık kullanılanlar listesi oluşturmak, sitenizi standart bir blogdan etkileşimli bir platforma dönüştürür. Yukarıdaki adımları takip ederek, kullanıcılarınıza içeriklerini kaydetme ve yönetme yetkisi verdiniz. Bir sonraki adım olarak, bu favori listesini kullanıcı profili sayfasına widget olarak eklemeyi veya favori ekleyen kullanıcılara bildirim göndermeyi deneyebilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Uygulamadan önce web sitenizin tam yedeğini almanız ve kodları canlı ortama almadan önce bir test (staging) ortamında denemeniz şiddetle tavsiye edilir.


Yorumlar (0)
Yorum Yaz