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 6.x ve üzeri sürümler, PHP 8.2+ ve MySQL 8.0+ kullanımı, modern güvenlik standartları ve performans için zorunludur.
- WordPress Kurulumu: Yerel geliştirme ortamınızda (LocalWP veya benzeri) temiz bir kurulum.
- Child Theme veya Özel Eklenti: Kodlarınızı doğrudan ana temanın
functions.phpdosyasına yazmak yerine, projenize özel bir eklenti oluşturmanız, sistemin taşınabilirliği ve güncellenebilirliği açısından kritiktir. - Kod Editörü: VS Code veya PHPStorm gibi modern bir IDE.
- Veritabanı Erişimi: WP-CLI veya phpMyAdmin üzerinden veritabanı tablolarını inceleyebilme yetisi.
Özel Soru ve Cevap İçerik Türlerini Tanımlama
WordPress'in standart "Yazılar" (Posts) yapısı, soru-cevap sistemi için yeterli değildir. Bu nedenle register_post_type fonksiyonunu kullanarak "Soru" (Question) ve "Cevap" (Answer) adında iki ayrı özel içerik türü oluşturacağız.
function register_qa_post_types() {
register_post_type('soru', [
'labels' => ['name' => 'Sorular', 'singular_name' => 'Soru'],
'public' => true,
'has_archive' => true,
'supports' => ['title', 'editor', 'author', 'comments'],
'rewrite' => ['slug' => 'sorular'],
'show_in_rest' => true, // Gutenberg desteği için
]);
register_post_type('cevap', [
'labels' => ['name' => 'Cevaplar', 'singular_name' => 'Cevap'],
'public' => false, // Cevaplar doğrudan listelenmeyecek
'show_ui' => true,
'supports' => ['editor', 'author'],
]);
}
add_action('init', 'register_qa_post_types');
Bu kod bloğu, sistemimizin temel yapı taşlarını oluşturur. show_in_rest parametresini true yaparak, modern WordPress editörü olan Gutenberg ile tam uyumlu çalışmasını sağlıyoruz.
Dinamik Soru Formu Oluşturma
Kullanıcıların ön yüzden soru sormalarını sağlamak için bir form oluşturmalıyız. Bu formda güvenlik için mutlaka bir nonce (number used once) kullanmalıyız. Bu, formun sizin sitenizden gönderildiğini doğrular.
function qa_render_question_form() {
if (!is_user_logged_in()) return 'Soru sormak için giriş yapmalısınız.';
ob_start();
?>
Soru ve Cevap Sistemi İçin Performans Optimizasyonu
Dinamik bir soru-cevap sistemi, özellikle kullanıcı trafiği arttığında veritabanı sorgularını yoğunlaştırabilir. WordPress'in WP_Query yapısını doğrudan kullanmak yerine, verileri önbelleğe alarak sunucu yükünü ciddi oranda düşürebilirsiniz. Transients API, bu noktada en büyük yardımcınızdır.
Aşağıdaki örnekte, en son sorulan 10 soruyu veritabanından çekmek yerine 1 saat boyunca önbellekte tutan bir yapı kuruyoruz:
function get_cached_latest_questions() {
$questions = get_transient('latest_qa_questions');
if (false === $questions) {
$questions = new WP_Query([
'post_type' => 'soru',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC'
]);
set_transient('latest_qa_questions', $questions, HOUR_IN_SECONDS);
}
return $questions;
}
Ayrıca, büyük ölçekli sistemlerde wp_posts tablosunun şişmesini engellemek için özel içerik türlerinizde "Auto-Draft" özelliğini devre dışı bırakmayı ve gereksiz revizyonları sınırlandırmayı unutmayın. wp-config.php dosyanıza define('WP_POST_REVISIONS', 3); satırını ekleyerek revizyon sayısını kontrol altına alabilirsiniz.
Sistem Hata Ayıklama ve Loglama Stratejileri
Kullanıcıların gönderdiği form verileri bazen beklenmedik hatalara yol açabilir. Form gönderimlerinde oluşabilecek hataları takip etmek için WordPress'in yerleşik debug log sistemini kullanmak, geliştirme sürecinde hayat kurtarıcıdır.
Form işleme fonksiyonunuzun içerisine yerleştireceğiniz bir hata yakalama mekanizması ile süreci şu şekilde izleyebilirsiniz:
function handle_question_submission() {
if (!isset($_POST['qa_nonce']) || !wp_verify_nonce($_POST['qa_nonce'], 'submit_question')) {
error_log('Soru gönderimi sırasında nonce doğrulaması başarısız oldu.');
wp_die('Güvenlik doğrulaması başarısız.');
}
$post_id = wp_insert_post([
'post_title' => sanitize_text_field($_POST['title']),
'post_content' => sanitize_textarea_field($_POST['content']),
'post_type' => 'soru',
'post_status' => 'publish'
]);
if (is_wp_error($post_id)) {
error_log('Soru veritabanına kaydedilemedi: ' . $post_id->get_error_message());
}
}
İleri İpucu: Eğer sisteminizde çok fazla etkileşim olacağını öngörüyorsanız, cevaplar ve sorular arasındaki ilişkiyi yönetmek için wp_postmeta tablosu yerine özel bir veritabanı tablosu oluşturmayı düşünebilirsiniz. Bu, özellikle karmaşık "cevap oylama" veya "en iyi cevap seçme" gibi özellikler eklediğinizde sorgu performansını dramatik şekilde artıracaktır.
- Veri Sanitizasyonu: Kullanıcıdan gelen her veriyi
sanitize_text_field veya esc_html ile temizlediğinizden emin olun.
- Yetkilendirme:
current_user_can('publish_posts') gibi kontrollerle, sadece kayıtlı kullanıcıların işlem yapmasını sağlayın.
- Bildirimler: Soruya cevap geldiğinde yazara e-posta göndermek için
wp_mail() fonksiyonunu bir hook (kanca) ile tetikleyebilirsiniz.

Yorumlar (0)
Yorum Yaz