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. Aşağıdaki araçlar ve sürüm bilgileri, 2026 yılı WordPress standartları için temel gereksinimlerdir:
- WordPress Sürümü: 6.5 veya üzeri.
- PHP Sürümü: 8.2 veya üzeri (Performans ve güvenlik güncellemeleri için kritik).
- Tema: Kendi geliştirdiğiniz bir tema veya bir çocuk tema (Child Theme). Ana tema dosyalarında değişiklik yapmanız durumunda güncellemelerle kodlarınız silinecektir.
- Veritabanı: MySQL 8.0 veya MariaDB 10.6+.
Kodlarınızı ekleyeceğiniz yer, aktif temanızın functions.php dosyasıdır. Ayrıca, ön yüzdeki etkileşimler için bir JavaScript dosyasına ve stil düzenlemeleri için bir CSS dosyasına ihtiyacımız olacak.
Veritabanı Yapısı ve Meta Verilerin Yönetimi
WordPress'te özel bir oylama sistemi kurarken, oyları saklamak için en verimli yöntem post_meta kullanmaktır. Her yazı için "oy_sayisi" ve "toplam_puan" şeklinde iki meta anahtarı tutacağız. Bu yöntem, veritabanını yormadan hızlı okuma ve yazma sağlar.
Aşağıdaki kod bloğu, bir içeriğe ilk kez oy verildiğinde veya mevcut oylar güncellendiğinde veriyi nasıl işleyeceğimizi gösterir. update_post_meta fonksiyonu, WordPress'in veritabanı işlemlerini güvenli bir şekilde yönetmesini sağlar.
// Oylama verisini güncelleyen fonksiyon
function kaydet_oylama_verisi($post_id, $puan) {
if (!is_numeric($puan) || $puan < 1 || $puan > 5) return false;
$mevcut_puan = get_post_meta($post_id, 'toplam_puan', true);
$mevcut_oy_sayisi = get_post_meta($post_id, 'oy_sayisi', true);
$yeni_puan = (int)$mevcut_puan + (int)$puan;
$yeni_oy_sayisi = (int)$mevcut_oy_sayisi + 1;
update_post_meta($post_id, 'toplam_puan', $yeni_puan);
update_post_meta($post_id, 'oy_sayisi', $yeni_oy_sayisi);
return $yeni_puan / $yeni_oy_sayisi;
}
WordPress REST API ile Güvenli İletişim
Eski yöntem olan admin-ajax.php kullanımı yerine, modern WordPress geliştirmede REST API kullanımı önerilir. REST API, daha temiz bir URL yapısı ve daha iyi hata yönetimi sunar. Aşağıdaki kod, istemciden gelen oyu kabul eden bir API rotası oluşturur.
add_action('rest_api_init', function () {
register_rest_route('oylama/v1', '/gonder/', array(
'methods' => 'POST',
'callback' => 'rest_oylama_islem',
'permission_callback' => '__return_true' // Burada nonce kontrolü eklenmelidir
));
});
function rest_oylama_islem($request) {
$post_id = $request['post_id'];
$puan = $request['puan'];
// Güvenlik: Nonce kontrolü ve veri sanitizasyonu yapılmalı
return kaydet_oylama_verisi($post_id, $puan);
}
Ön Yüz: JavaScript ve Fetch API Entegrasyonu
Kullanıcı bir yıldıza tıkladığında, sayfa yenilenmeden verinin sunucuya gönderilmesi gerekir. JavaScript'in fetch fonksiyonu, bu işlemi asenkron olarak gerçekleştirir. Bu sayede kullanıcı deneyimi (UX) kesintisiz devam eder.
// oylama.js dosyası
document.querySelectorAll('.oy-butonu').forEach(button => {
button.addEventListener('click', function() {
const puan = this.dataset.puan;
const post_id = document.querySelector('#post_id').value;
fetch('/wp-json/oylama/v1/gonder/', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ post_id, puan })
})
.then(response => response.json())
.then(data => alert('Oyunuz kaydedildi! Ortalama: ' + data));
});
});
Kritik Güvenlik Uyarısı: REST API üzerinden gelen isteklerde mutlaka wp_verify_nonce kullanarak CSRF (Siteler Arası İstek Sahteciliği) saldırılarını engelleyin. Ayrıca, kullanıcıların aynı içeriğe defalarca oy vermesini önlemek için IP tabanlı veya çerez (cookie) tabanlı bir kısıtlama eklemeyi unutmayın.
Oylama Sistemi Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Post Meta (Önerilen) | Hızlı, basit, yerel veritabanı kullanımı. | Çok yüksek trafikli sitelerde veritabanı yükü. |
| Özel Veritabanı Tablosu | Daha ölçeklenebilir, detaylı raporlama. | Daha karmaşık kurulum ve sorgulama. |
| Üçüncü Taraf Eklenti | Hızlı kurulum, hazır arayüz. | Sitenin yavaşlaması, güvenlik riskleri. |
Hata Ayıklama ve Optimizasyon İpuçları
Sisteminizi geliştirirken en sık karşılaşılan hata, veritabanı önbellekleme (caching) sorunlarıdır. Eğer bir caching eklentisi kullanıyorsanız, oylama sonuçlarının anlık güncellenmediğini görebilirsiniz. Bu durumda, oylama sonuçlarını dinamik olarak yüklemek için JavaScript ile DOM manipülasyonu yapmanız en sağlıklı yoldur.
Hata ayıklama sürecinde WP_DEBUG modunu aktif ederek hataları takip edin. Ayrıca, veritabanına kaydedilen meta değerlerinin doğru türde (integer) olduğundan emin olmak için intval() fonksiyonunu mutlaka kullanın.
// Veri sanitizasyonu örneği
$post_id = intval($request['post_id']);
$puan = intval($request['puan']);
if ($post_id 5) {
return new WP_Error('gecersiz_veri', 'Lütfen geçerli bir puan girin', array('status' => 400));
}
Sıkça Sorulan Sorular
Bir kullanıcı birden fazla oy verebilir mi?
Yukarıda paylaştığımız temel yapıda herhangi bir kısıtlama yoktur. Bunu engellemek için kullanıcının tarayıcısına bir çerez (cookie) atayabilir veya veritabanında kullanıcı ID'si ile bir kayıt tutabilirsiniz.
Oylama sonuçlarını nasıl sıralayabilirim?
WP_Query kullanarak meta_key parametresi üzerinden toplam_puan verisine göre içeriklerinizi sıralayabilirsiniz.
Bu sistem siteyi yavaşlatır mı?
Hayır, WordPress'in yerel post_meta yapısı oldukça optimize edilmiştir. Ancak çok yoğun trafik alan bir siteniz varsa, veritabanı sorgularını azaltmak için sonuçları geçici (transient) olarak önbelleğe alabilirsiniz.
Mobil uyumlu bir oylama arayüzü nasıl yapılır?
CSS'de flexbox veya grid kullanarak yıldız ikonlarını mobil cihazlarda dokunmatik dostu olacak şekilde büyüterek kolayca uyumlu hale getirebilirsiniz.
Veritabanı güvenliği için ne yapmalıyım?
Her zaman verileri sanitize edin ve sadece yetkili kullanıcıların veya doğrulanmış isteklerin veri değiştirebilmesini sağlayın. SQL injection riskine karşı her zaman WordPress'in sunduğu $wpdb veya meta fonksiyonlarını kullanın.
Oylama Verilerini Chart.js ile Yönetici Panelinde Görselleştirme
Kullanıcı etkileşimlerini takip etmek, içerik stratejinizi belirlemek için kritik bir veridir. Oylama sonuçlarını ham veriler yerine grafiksel olarak görüntülemek, hangi içeriklerin daha fazla ilgi gördüğünü anlık olarak anlamanızı sağlar. WordPress yönetici paneline özel bir sayfa ekleyerek Chart.js kütüphanesi ile bu verileri görselleştirebiliriz.
Yönetici Paneli İçin Veri Sağlayıcı
Öncelikle, veritabanındaki oylama meta verilerini çeken ve JSON formatında sunan bir fonksiyonu yönetici paneli kancasına bağlamamız gerekir. Aşağıdaki kod, oyları yüksekten düşüğe doğru sıralayarak bir veri seti hazırlar.
function get_voting_stats_for_chart() {
$args = array(
'post_type' => 'post',
'meta_key' => 'post_vote_count',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'posts_per_page' => 10
);
$query = new WP_Query($args);
$data = [];
while ($query->have_posts()) {
$query->the_post();
$data[] = [
'title' => get_the_title(),
'votes' => get_post_meta(get_the_ID(), 'post_vote_count', true)
];
}
wp_reset_postdata();
return $data;
}
Chart.js Entegrasyonu
Yönetici paneli sayfanıza bir canvas elementi ekledikten sonra, verileri JavaScript tarafında işleyerek grafiği oluşturabilirsiniz. Bu yöntem, veritabanı sorgularınızı doğrudan görsel bir arayüze dönüştürür.
const ctx = document.getElementById('voteChart').getContext('2d');
const voteChart = new Chart(ctx, {
type: 'bar',
data: {
labels: chartData.map(item => item.title),
datasets: [{
label: 'Toplam Oy Sayısı',
data: chartData.map(item => item.votes),
backgroundColor: 'rgba(54, 162, 235, 0.2)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
}]
},
options: { scales: { y: { beginAtZero: true } } }
});
İleri Seviye Performans ve Önbellekleme Stratejileri
Oylama sistemleri, özellikle trafik yoğunluğu yüksek sitelerde veritabanına sürekli UPDATE sorgusu gönderdiği için performans darboğazlarına neden olabilir. Bu durumu yönetmek için "Transient API" kullanımını veya veritabanı yazma kuyruklarını değerlendirmelisiniz.
Transient API ile Veri Okuma
Oylama sonuçlarını her sayfa yüklenişinde veritabanından çekmek yerine, WordPress Transient API kullanarak sonuçları belirli bir süre (örneğin 1 saat) önbelleğe alabilirsiniz. Bu, veritabanı üzerindeki yükü ciddi oranda azaltacaktır.
function get_cached_vote_count($post_id) {
$transient_key = 'post_votes_' . $post_id;
$votes = get_transient($transient_key);
if (false === $votes) {
$votes = get_post_meta($post_id, 'post_vote_count', true);
set_transient($transient_key, $votes, HOUR_IN_SECONDS);
}
return $votes;
}
Önemli İpucu: Kullanıcı her oy verdiğinde, ilgili post ID'sine ait transient verisini delete_transient() fonksiyonu ile temizlemeyi unutmayın. Böylece kullanıcılar güncel oy sayılarını anlık olarak görebilirken, genel okuma işlemleri önbellekten hızlıca servis edilir.
Not: Çok yüksek trafikli sitelerde, oyları doğrudan veritabanına yazmak yerine Redis gibi bir in-memory veri deposu kullanmak ve verileri periyodik olarak (cron job ile) veritabanına senkronize etmek en sağlıklı ölçeklendirme yöntemidir.
Sonuç
WordPress ile özel bir içerik oylama sistemi oluşturmak, sitenizin kullanıcı etkileşimini artırmak ve veriye dayalı kararlar almanızı sağlamak için mükemmel bir yöntemdir. Bu rehberde öğrendiğiniz REST API entegrasyonu, veritabanı yönetimi ve asenkron veri işleme teknikleri, WordPress geliştirme yetkinliğinizi bir üst seviyeye taşıyacaktır. Bir sonraki adım olarak, oylama sonuçlarını bir grafik kütüphanesi (örneğin Chart.js) kullanarak yönetici panelinde görselleştirmeyi deneyebilirsiniz.
Sorumluluk Reddi: Bu rehberde paylaşılan kodlar eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka bir staging (test) ortamında test edin ve güvenlik denetimlerini (nonce, yetkilendirme) tamamlayın. Kodların yanlış uygulanmasından doğabilecek veri kayıplarından yazar sorumlu değildir.


Yorumlar (0)
Yorum Yaz