Wordpress İle Özel Bir Kullanıcı Puanlama Sistemi Nasıl Yapılır?

Wordpress İle Özel Bir Kullanıcı Puanlama Sistemi Nasıl Yapılır?
Wordpress İle Özel Bir Kullanıcı Puanlama Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. WordPress'in 6.x ve üzeri sürümlerinde, PHP 8.2+ kullanımı performans ve güvenlik açısından kritik öneme sahiptir.

  • PHP 8.2+: Modern sözdizimi ve güvenlik güncellemeleri için gereklidir.
  • Çocuk Tema (Child Theme): Kodlarınızı doğrudan ana temanın functions.php dosyasına yazmak yerine, her zaman bir çocuk tema kullanın.
  • Veritabanı Erişimi: WordPress veritabanı tablolarını yönetmek için $wpdb sınıfına aşina olmalısınız.
  • Kod Editörü: VS Code gibi hata ayıklama (debug) desteği olan bir editör önerilir.

Uyarı: Canlı bir sitede değişiklik yapmadan önce mutlaka veritabanı ve dosya yedeği alın. Hatalı bir SQL sorgusu sitenizin erişilemez hale gelmesine neden olabilir.

Veritabanı Yapısının Kurulması

Puanları saklamak için WordPress'in standart wp_postmeta tablosunu kullanabiliriz, ancak daha ölçeklenebilir bir sistem için özel bir tablo oluşturmak her zaman daha performanslıdır. İlk adımda, puanları tutacak tablomuzu oluşturuyoruz.


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

    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        post_id mediumint(9) NOT NULL,
        user_id mediumint(9) NOT NULL,
        puan tinyint(1) NOT NULL,
        tarih datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'puanlama_sistemi_tablosunu_olustur');

Bu kod, eklentiniz veya temanız etkinleştirildiğinde wp_kullanici_puanlari adında yeni bir tablo oluşturur. dbDelta fonksiyonu, tablonun zaten var olup olmadığını kontrol eder ve gerekirse güncellemeleri güvenli bir şekilde uygular.

AJAX ile Puan Gönderme İşlemi

Kullanıcı bir puana tıkladığında, sayfanın yenilenmemesi için AJAX (Asynchronous JavaScript and XML) kullanmalıyız. Öncelikle JavaScript tarafında isteği hazırlayalım.


// script.js dosyanız
document.querySelectorAll('.puan-butonu').forEach(button => {
    button.addEventListener('click', function() {
        const puan = this.dataset.puan;
        const post_id = this.dataset.postid;

        fetch(ajax_object.ajax_url, {
            method: 'POST',
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            body: `action=puan_kaydet&puan=${puan}&post_id=${post_id}&nonce=${ajax_object.nonce}`
        })
        .then(response => response.json())
        .then(data => alert(data.mesaj));
    });
});

Bu JavaScript kodu, kullanıcının seçtiği puanı ve gönderi ID'sini alır, ardından WordPress'in AJAX işleyicisine gönderir. nonce kullanımı, CSRF (Cross-Site Request Forgery) saldırılarını önlemek için zorunludur.

Sunucu Tarafında Puanı İşleme ve Güvenlik

Gönderilen veriyi functions.php içerisinde yakalayıp veritabanına güvenli bir şekilde kaydetmemiz gerekir. Burada $wpdb->prepare kullanarak SQL Injection riskini tamamen ortadan kaldırıyoruz.


add_action('wp_ajax_puan_kaydet', 'puan_kaydet_fonksiyonu');

function puan_kaydet_fonksiyonu() {
    check_ajax_referer('puanlama_nonce', 'nonce');
    
    global $wpdb;
    $post_id = intval($_POST['post_id']);
    $puan = intval($_POST['puan']);
    $user_id = get_current_user_id();

    if ($user_id == 0) wp_send_json_error('Lütfen giriş yapın.');

    $wpdb->insert($wpdb->prefix . 'kullanici_puanlari', [
        'post_id' => $post_id,
        'user_id' => $user_id,
        'puan' => $puan,
        'tarih' => current_time('mysql')
    ]);

    wp_send_json_success(['mesaj' => 'Puanınız kaydedildi!']);
}

Burada intval() fonksiyonu ile gelen verilerin tam sayı olduğundan emin olduk. Ayrıca check_ajax_referer ile isteğin kaynağını doğruladık. Bu, sistemin en kritik güvenlik katmanıdır.

Puanları Görüntüleme ve Hesaplama

Kaydedilen puanları içerik sayfasında göstermek için bir ortalama hesaplama fonksiyonuna ihtiyacımız var.


function puan_ortalamasi_getir($post_id) {
    global $wpdb;
    $table = $wpdb->prefix . 'kullanici_puanlari';
    return $wpdb->get_var($wpdb->prepare(
        "SELECT AVG(puan) FROM $table WHERE post_id = %d", 
        $post_id
    ));
}

Bu fonksiyon, ilgili gönderi için veritabanındaki tüm puanların aritmetik ortalamasını döndürür. Bu değeri sayfanın herhangi bir yerinde echo puan_ortalamasi_getir(get_the_ID()); şeklinde çağırabilirsiniz.

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

Yöntem Avantaj Dezavantaj
Özel Veritabanı Tablosu Yüksek performans, ölçeklenebilir Daha fazla kod yükü
Post Meta (wp_postmeta) Hızlı entegrasyon, basit Büyük veride yavaşlama

Güvenlik Sorumluluk Reddi: Bu kodlar temel bir yapı sunar. Üretim ortamında (production) kullanmadan önce her zaman girdi temizleme (sanitization) ve çıktı kaçırma (escaping) işlemlerini esc_html() veya sanitize_text_field() gibi WordPress fonksiyonları ile derinleştirin.

Sıkça Sorulan Sorular

Puanlama sistemini sadece kayıtlı kullanıcılara nasıl açarım?

Yukarıdaki puan_kaydet_fonksiyonu içerisinde if ($user_id == 0) kontrolü ile giriş yapmamış kullanıcıların işlem yapmasını engelleyebilirsiniz.

Kullanıcıların birden fazla puan vermesini nasıl engellerim?

Puan kaydetmeden önce $wpdb->get_row ile kullanıcının o gönderiye daha önce puan verip vermediğini kontrol eden bir sorgu eklemelisiniz.

Sistem çok yavaşlarsa ne yapmalıyım?

Puan ortalamalarını her seferinde hesaplamak yerine, bir "transient" (geçici veri) kullanarak sonucu 1 saatliğine önbelleğe alabilirsiniz.

Mobil uyumluluk için ne yapmalıyım?

JavaScript tarafında touchstart ve click olaylarını dinleyerek butonların dokunmatik ekranlarda daha hassas çalışmasını sağlayabilirsiniz.

CSS ile puanları yıldız şeklinde nasıl gösteririm?

Font Awesome gibi bir kütüphane kullanarak, puan değerine göre yıldızların doluluk oranını CSS width özelliği ile ayarlayabilirsiniz.

Puanlama Sisteminde Veri Analitiği ve Raporlama

Sisteminize eklediğiniz puanlama verilerini sadece kullanıcıya göstermekle kalmayıp, bu verileri bir yönetim paneli raporuna dönüştürmek, içerik stratejinizi belirlemenize yardımcı olur. Hangi içeriklerin daha fazla ilgi gördüğünü analiz etmek için wp_postmeta tablosundaki verileri çekerek basit bir istatistiksel tablo oluşturabilirsiniz.

Aşağıdaki kod bloğu, en yüksek puana sahip ilk 5 içeriği listeleyen bir fonksiyon örneğidir:

function get_top_rated_posts($limit = 5) {
    global $wpdb;
    $results = $wpdb->get_results("
        SELECT post_id, meta_value as rating 
        FROM {$wpdb->postmeta} 
        WHERE meta_key = 'user_rating' 
        ORDER BY CAST(meta_value AS DECIMAL) DESC 
        LIMIT $limit
    ");

    echo '
    '; foreach ($results as $row) { echo '
  • ' . get_the_title($row->post_id) . ' - Puan: ' . $row->rating . '
  • '; } echo '
'; }

Sistem Testi ve Hata Ayıklama (Debugging)

Özel bir puanlama sistemi geliştirirken, AJAX isteklerinin başarısız olduğu durumları yönetmek kritik öneme sahiptir. Kullanıcı puan verdiğinde veritabanına yazılmaması durumunda, hatanın kaynağını tespit etmek için WordPress'in hata ayıklama modunu aktif etmelisiniz.

Hata Ayıklama İpuçları:

  • WP_DEBUG: wp-config.php dosyanızda define('WP_DEBUG', true); satırını aktif ederek sunucu tarafındaki hataları wp-content/debug.log dosyasında görebilirsiniz.
  • Network Tab: Tarayıcınızın "Geliştirici Araçları" (F12) kısmındaki "Network" sekmesini kullanarak, AJAX isteğinin 200 OK yanıtı dönüp dönmediğini kontrol edin.
  • JSON Yanıtı: AJAX isteğinden gelen yanıtın geçerli bir JSON formatında olduğundan emin olun. wp_send_json_success() veya wp_send_json_error() fonksiyonlarını kullanmak, hata ayıklamayı kolaylaştırır.

Eğer puanlama işlemi sırasında bir hata oluşursa, kullanıcıya geri bildirim vermek için JavaScript tarafında şu yapıyı kullanabilirsiniz:

$.ajax({
    url: ajax_object.ajax_url,
    type: 'POST',
    data: { action: 'save_rating', post_id: postID, rating: score },
    success: function(response) {
        if(response.success) {
            alert('Puanınız kaydedildi!');
        } else {
            console.error('Hata: ' + response.data);
        }
    },
    error: function(xhr, status, error) {
        console.error('AJAX İsteği başarısız: ' + error);
    }
});

İleri Seviye Optimizasyon: Veritabanı Yükünü Azaltma

Siteniz yüksek trafik aldığında, her puanlama isteğinde postmeta tablosuna yazmak performans sorunlarına yol açabilir. Bu durumda, puanları doğrudan veritabanına yazmak yerine bir "Transient API" veya Redis gibi bir önbellekleme katmanı kullanmayı düşünebilirsiniz.

Profesyonel İpucu: Çok yoğun sitelerde, puanları anlık olarak veritabanına işlemek yerine, puanları bir kuyruk sistemine (queue) alıp belirli aralıklarla (cron job) toplu olarak güncellemek sunucu kaynaklarını ciddi oranda rahatlatır.

Sonuç

WordPress ile özel bir kullanıcı puanlama sistemi oluşturmak, sitenizin kullanıcı deneyimini zenginleştiren ve etkileşimi artıran güçlü bir yöntemdir. Bu makalede veritabanı oluşturma, AJAX ile veri iletimi, güvenlik önlemleri ve veri hesaplama süreçlerini adım adım ele aldık. Bir sonraki adım olarak, bu puanları WP_Query sorgularında kullanarak "En Yüksek Puanlı İçerikler" listesi oluşturan bir widget tasarlayabilirsiniz. Kodlarınızı her zaman güncel tutun ve güvenlik açıklarına karşı düzenli kontroller yapmayı ihmal etmeyin.

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

On yıllık içerik üretim deneyimiyle karmaşık süreçleri herkesin anlayabileceği pratik rehberlere dönüştürüyorum. Günlük yaşamı kolaylaştıran çözümler üzerine uzmanlaşmış bir editörüm.

Yorumlar (0)

Yorum Yaz