Wordpress İle Özel Bir Kullanıcı Denetimli İçerik Onay Sistemi Nasıl Yapılır?

Wordpress İle Özel Bir Kullanıcı Denetimli İçerik Onay Sistemi Nasıl Yapılır?
Wordpress İle Özel Bir Kullanıcı Denetimli İçerik Onay Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu sistemi kurmak için herhangi bir harici eklentiye ihtiyacınız yoktur; WordPress'in kendi çekirdek fonksiyonlarını kullanacağız. Ancak, sistemin kararlı çalışması için aşağıdaki gereksinimlerin karşılanması önemlidir:

  • WordPress 6.5 veya üzeri bir sürüm (güncel güvenlik yamaları için).
  • PHP 8.2 veya üzeri (performans ve tip güvenliği için).
  • Temanızın functions.php dosyasına erişim veya özel bir "mu-plugin" (must-use plugin) oluşturma yetkisi.
  • Veritabanı üzerinde işlem yapacağımız için mutlaka düzenli bir yedekleme.
Uyarı: Kodları doğrudan canlı sitenizde denemeden önce mutlaka bir "staging" (test) ortamında test edin. Yanlış bir kanca kullanımı, içeriklerin görünmez olmasına veya sitenizin hata vermesine neden olabilir.

Adım 1: Özel İçerik Durumu Tanımlama

WordPress'in varsayılan durumları (yayınlandı, taslak, incelemede) dışında, kendi onay sürecimiz için "Onay Bekliyor" veya "Editör Onayı Gerekiyor" gibi özel bir durum tanımlamamız gerekir. Bu, içeriklerin yönetim panelinde kolayca filtrelenmesini sağlar.


function ozel_icerik_durumu_kayit() {
    register_post_status( 'bekleyen_onay', array(
        'label'                     => _x( 'Onay Bekliyor', 'post' ),
        'public'                    => false,
        'exclude_from_search'       => true,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Onay Bekliyor (%s)', 'Onay Bekliyor (%s)' ),
    ) );
}
add_action( 'init', 'ozel_icerik_durumu_kayit' );

Yukarıdaki kod, WordPress'e yeni bir durum tanıtır. public => false ifadesi, bu durumdaki yazıların ön yüzde ziyaretçiler tarafından görülmemesini sağlar.

Adım 2: Yayınlama Butonunu Özelleştirme

Yazarların yazılarını doğrudan yayınlamasını engellemek için "Yayınla" butonunu "Onaya Gönder" şeklinde değiştirmemiz gerekir. Bu, kullanıcı psikolojisi açısından içeriğin henüz nihai olmadığını hissettirir.


function onay_butonu_metni_degistir( $translation, $text, $domain ) {
    global $post;
    if ( $post && $post->post_type == 'post' && $text == 'Publish' ) {
        return 'Onaya Gönder';
    }
    return $translation;
}
add_filter( 'gettext', 'onay_butonu_metni_degistir', 10, 3 );

Bu filtre, WordPress çeviri sistemine müdahale ederek "Publish" metnini "Onaya Gönder" ile değiştirir. Bu sayede yazar, içeriği sisteme gönderirken bir onay sürecine girdiğini anlar.

Adım 3: İçerik Durumunu Otomatik Değiştirme

Kullanıcı "Onaya Gönder" butonuna bastığında, yazının durumunun otomatik olarak bekleyen_onay statüsüne geçmesi gerekir. Aksi takdirde, WordPress varsayılan olarak "Yayınlandı" statüsünü atayacaktır.


function icerik_durumunu_otomatik_ata( $data, $postarr ) {
    if ( $data['post_status'] == 'publish' && !current_user_can( 'publish_posts' ) ) {
        $data['post_status'] = 'bekleyen_onay';
    }
    return $data;
}
add_filter( 'wp_insert_post_data', 'icerik_durumunu_otomatik_ata', 99, 2 );

Bu fonksiyon, kullanıcı eğer "yayınlama" yetkisine sahip değilse (örneğin sadece yazar rolü), içeriği otomatik olarak bizim tanımladığımız özel duruma çeker. current_user_can kontrolü burada kritik bir güvenlik katmanıdır.

Adım 4: Onay Süreci İçin Bildirim Mekanizması

İçerik onay beklediğinde editörlere bildirim gitmesi gerekir. WordPress'in wp_mail fonksiyonunu kullanarak, durum değişikliği gerçekleştiğinde ilgili yetkililere e-posta gönderebiliriz.


function onay_bekleyen_bildirimi( $new_status, $old_status, $post ) {
    if ( $new_status == 'bekleyen_onay' && $old_status != 'bekleyen_onay' ) {
        $to = 'editor@siteadiniz.com';
        $subject = 'Yeni İçerik Onay Bekliyor: ' . $post->post_title;
        $message = 'Bir yazar yeni bir içerik gönderdi. Lütfen kontrol edin: ' . get_edit_post_link( $post->ID );
        wp_mail( $to, $subject, $message );
    }
}
add_action( 'transition_post_status', 'onay_bekleyen_bildirimi', 10, 3 );

Bu kod, transition_post_status kancasını kullanarak durum değişimlerini dinler. Eğer yeni durum bekleyen_onay ise, editöre otomatik bir e-posta gönderilir.

Karşılaştırmalı Onay Yöntemleri

Yöntem Avantajı Dezavantajı
Özel Post Durumu Tam kontrol ve esneklik sağlar. Kodlama bilgisi gerektirir.
Eklenti Kullanımı Hızlı kurulum ve arayüz desteği. Siteyi yavaşlatabilir ve bağımlılık yaratır.
Kullanıcı Rolü Kısıtlaması Güvenlik odaklıdır. İş akışını kısıtlayabilir.

Adım 5: Güvenlik ve Yetkilendirme Kontrolleri

Sistemin güvenliği için sadece yetkili kişilerin "Onay Bekliyor" durumundaki içerikleri yayınlayabilmesi gerekir. map_meta_cap filtresi ile yayınlama yetkisini sadece editör ve yönetici rolleriyle kısıtlayabiliriz.


function onay_yetkisi_denetimi( $caps, $cap, $user_id, $args ) {
    if ( $cap == 'publish_post' ) {
        $post = get_post( $args[0] );
        if ( $post->post_status == 'bekleyen_onay' && !user_can( $user_id, 'editor' ) ) {
            $caps[] = 'do_not_allow';
        }
    }
    return $caps;
}
add_filter( 'map_meta_cap', 'onay_yetkisi_denetimi', 10, 4 );

Bu fonksiyon, bir yazı yayınlanmaya çalışıldığında kullanıcının rolünü kontrol eder. Eğer kullanıcı editör değilse ve yazı onay bekliyorsa, yayınlama işlemini engeller.

Güvenlik Sorumluluk Reddi: Yukarıdaki kodlar, WordPress'in standart güvenlik protokolleri ile uyumludur. Ancak, herhangi bir özel kod geliştirmede, SQL injection veya XSS açıklarına karşı verilerinizi her zaman sanitize_text_field veya esc_html gibi fonksiyonlarla temizlediğinizden emin olun.

Sıkça Sorulan Sorular

1. Bu sistem tüm yazı tipleri için geçerli mi?

Evet, post_type kontrolünü kaldırarak veya genişleterek özel yazı tipleri (Custom Post Types) için de aynı mantığı uygulayabilirsiniz.

2. Kullanıcılar onay bekleyen yazılarını görebilir mi?

Evet, kendi profillerinde "Taslaklar" sekmesi altında içeriklerini görebilirler. Ancak bu içerikler ön yüzde yayında olmaz.

3. E-posta bildirimleri neden gitmiyor olabilir?

Sunucunuzun wp_mail fonksiyonunu destekleyen bir SMTP yapılandırmasına sahip olduğundan emin olun. PHP'nin mail() fonksiyonu çoğu paylaşımlı hostingde engellenmiş olabilir.

4. Onaylanan yazılar otomatik yayınlanabilir mi?

Evet, bir "Onayla" butonu ekleyerek wp_update_post fonksiyonu ile durumu publish statüsüne çekebilirsiniz.

5. Bu sistem SEO'yu etkiler mi?

Hayır, exclude_from_search parametresi sayesinde onay bekleyen içerikler arama motoru botları tarafından indekslenmez, dolayısıyla SEO kaybı yaşanmaz.

İleri Düzey İpuçları: Reddetme Nedeni ve Geri Bildirim Entegrasyonu

Sisteminizi daha kullanıcı dostu hale getirmek için, editörlerin bir yazıyı reddederken nedenini belirtebilecekleri bir meta kutusu eklemek, yazar-editör iletişimini güçlendirir. Bu özellik, yazarların içeriklerini neden düzeltmeleri gerektiğini anlamalarını sağlar.

Reddetme Nedeni İçin Meta Kutusu Oluşturma

Aşağıdaki kod bloğu, yazı düzenleme ekranına bir metin alanı ekler ve bu veriyi veritabanına kaydeder:

add_action('add_meta_boxes', 'ozel_reddetme_nedeni_meta_box');
function ozel_reddetme_nedeni_meta_box() {
    add_meta_box('red_nedeni', 'Reddetme Nedeni', 'red_nedeni_callback', 'post', 'side', 'high');
}

function red_nedeni_callback($post) {
    $value = get_post_meta($post->ID, '_reddetme_nedeni', true);
    echo '' . esc_textarea($value) . '';
}

add_action('save_post', 'save_red_nedeni_meta');
function save_red_nedeni_meta($post_id) {
    if (isset($_POST['red_nedeni_field'])) {
        update_post_meta($post_id, '_reddetme_nedeni', sanitize_text_field($_POST['red_nedeni_field']));
    }
}

Performans ve Hata Ayıklama Stratejileri

Özel onay sistemleri, özellikle çok sayıda yazarın olduğu büyük ölçekli WordPress sitelerinde veritabanı sorgularını artırabilir. Sistemin performansını korumak için şu stratejileri uygulamanız önerilir:

  • Sorgu Optimizasyonu: pre_get_posts filtresini kullanırken, onay bekleyen içerikleri listelemek için sadece gerekli meta verilerini çekin.
  • Transients API Kullanımı: Onay bekleyen yazı sayısını sürekli veritabanından çekmek yerine, set_transient ile önbelleğe alarak sunucu yükünü azaltın.
  • Hata Ayıklama (Debugging): İşlemlerin arka planda nasıl çalıştığını görmek için WP_DEBUG_LOG özelliğini aktif edin ve error_log() fonksiyonu ile onay süreçlerini takip edin.

Hata Ayıklama İçin Örnek Loglama

Onay süreci tetiklendiğinde sistemin düzgün çalışıp çalışmadığını şu basit loglama yöntemiyle izleyebilirsiniz:

function log_onay_islemi($post_id) {
    $log_mesaj = "Yazı ID: " . $post_id . " onay sürecine girdi. Zaman: " . current_time('mysql');
    error_log($log_mesaj);
}
add_action('transition_post_status', 'log_onay_islemi', 10, 3);

Bu yöntem, sisteminizde bir tıkanıklık veya hata oluştuğunda, sorunun hangi aşamada (durum değişikliği, bildirim gönderimi veya yetkilendirme) kaynaklandığını hızlıca tespit etmenize olanak tanır.

Sonuç

WordPress ile özel bir kullanıcı denetimli içerik onay sistemi oluşturmak, sitenizin içerik kalitesini yönetmek adına atabileceğiniz en profesyonel adımlardan biridir. Bu rehberde, durum tanımlamadan yetkilendirme kısıtlamalarına kadar tüm süreci teknik olarak ele aldık. Bir sonraki adım olarak, bu sisteme bir "Reddetme Nedeni" kutusu ekleyerek yazarlara geri bildirim gönderme mekanizmasını geliştirebilirsiniz.

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

On yıldır dijital yayıncılıkta pratik çözüm rehberleri hazırlıyorum. Karmaşık süreçleri herkesin anlayabileceği adım adım yönergelere dönüştürme konusunda uzmanım.

Yorumlar (0)

Yorum Yaz