WordPress Yorum Formunun Üzerine İçerik Ekleme

WordPress ile çalışırken yorum bölümünü özelleştirme ihtiyacı er ya da geç karşınıza çıkar. Belki bir uyarı mesajı eklemek istiyorsunuz, belki KVKK bildirimi, belki de sadece kullanıcıları yorum yazmaya teşvik eden bir metin. WordPress’in sunduğu hook sistemi sayesinde bunu tek bir satır kod değiştirmeden, tamamen functions.php üzerinden yapabilirsiniz. Bu yazıda yorum formunun üzerine içerik eklemenin tüm yollarını, gerçek dünya senaryolarıyla birlikte ele alacağız.

WordPress Yorum Formu Hook Sistemi

WordPress, yorum formunu render ederken bir dizi action hook tetikler. Bu hook’ları anlamak, doğru yere doğru içeriği eklemenin temelidir.

En çok kullanılan hook’lar şunlar:

  • comment_form_before: Tüm yorum formu başlamadan önce tetiklenir
  • comment_form_top: Form etiketi açıldıktan hemen sonra, alanlardan önce tetiklenir
  • comment_form: Yorum alanlarından sonra, submit butonundan önce
  • comment_form_after: Tüm form kapandıktan sonra
  • comment_form_before_fields: Giriş yapmamış kullanıcılar için alanlar başlamadan önce
  • comment_form_after_fields: Giriş yapmamış kullanıcılar için alanlar bittikten sonra

Bizim odaklanacağımız nokta ağırlıklı olarak comment_form_before ve comment_form_top hook’ları olacak çünkü bunlar formun üzerine içerik eklemek için en uygun noktalardır.

Temel Kullanım: Basit Metin Ekleme

En sade haliyle başlayalım. Yorum formunun üzerine bir paragraf eklemek istiyorsanız şu kodu functions.php dosyanıza ekleyin:

// functions.php
function custom_comment_form_top_message() {
    echo '<p class="comment-notice">Yorumlarınız moderasyon sonrası yayınlanır. Lütfen saygılı bir dil kullanın.</p>';
}
add_action( 'comment_form_before', 'custom_comment_form_top_message' );

Bu kadar. comment_form_before hook’u, etiketinin tamamen dışında çalışır yani eklediğiniz içerik form elementinin bir parçası olmaz. Bu da HTML geçerliliği açısından önemlidir.

Eğer içeriğin formun içinde ama alanların üzerinde görünmesini istiyorsanız comment_form_top kullanın:

function custom_comment_form_inner_notice() {
    echo '<div class="comment-form-notice">
        <strong>Not:</strong> E-posta adresiniz yayınlanmayacaktır.
    </div>';
}
add_action( 'comment_form_top', 'custom_comment_form_inner_notice' );

Gerçek Dünya Senaryosu 1: KVKK Uyarısı Ekleme

Türkiye’de faaliyet gösteren bir site işletiyorsanız yorum formunun üzerinde KVKK uyarısı bulunması artık neredeyse zorunlu. İşte bunu nasıl yapacağınız:

function kvkk_comment_notice() {
    $kvkk_page_url = get_privacy_policy_url();
    
    echo '<div class="kvkk-notice" style="background:#f0f7ff;border-left:4px solid #0073aa;padding:12px 16px;margin-bottom:20px;font-size:13px;">
        <strong>Kişisel Verilerin Korunması:</strong> Yorum bıraktığınızda adınız, 
        e-posta adresiniz ve web siteniz tarafımızca işlenecektir. Bu verilerin 
        işlenmesine ilişkin detaylı bilgi için 
        <a href="' . esc_url( $kvkk_page_url ) . '" target="_blank">Gizlilik Politikamızı</a> 
        inceleyebilirsiniz.
    </div>';
}
add_action( 'comment_form_before', 'kvkk_notice' );

Burada dikkat etmemiz gereken bir nokta var: get_privacy_policy_url() fonksiyonu WordPress’in kendi gizlilik sayfasını döndürür. Eğer özel bir sayfanız varsa URL’yi hardcode etmek yerine bir seçenek olarak saklayabilirsiniz.

Gerçek Dünya Senaryosu 2: Giriş Yapmamış Kullanıcılara Özel Mesaj

Siteniz üyelik sistemi kullanıyorsa giriş yapmamış kullanıcılara yorum formunun üzerinde özel bir mesaj göstermek isteyebilirsiniz:

function comment_login_notice() {
    if ( ! is_user_logged_in() ) {
        $login_url = wp_login_url( get_permalink() );
        $register_url = wp_registration_url();
        
        echo '<div class="login-notice" style="padding:15px;background:#fff3cd;border:1px solid #ffc107;border-radius:4px;margin-bottom:15px;">
            <p style="margin:0;">
                Yorum yapabilmek için <a href="' . esc_url( $login_url ) . '">giriş yapın</a> 
                veya <a href="' . esc_url( $register_url ) . '">üye olun</a>. 
                Üyelik tamamen ücretsizdir.
            </p>
        </div>';
    } else {
        $current_user = wp_get_current_user();
        echo '<p class="logged-in-notice">Merhaba, <strong>' . esc_html( $current_user->display_name ) . '</strong>! Yorumunuzu bekliyoruz.</p>';
    }
}
add_action( 'comment_form_before', 'comment_login_notice' );

Bu yaklaşımın güzel yanı şu: Hem giriş yapmamış hem de giriş yapmış kullanıcılar için farklı mesajlar gösteriyorsunuz. Giriş yapmış kullanıcı ismini görmek hoş bir kişiselleştirme detayı olur.

Gerçek Dünya Senaryosu 3: Belirli Post Tiplerine Özel İçerik

Her sayfada aynı mesajı göstermek istemeyebilirsiniz. Örneğin teknik bir blog yazısında farklı, haber yazısında farklı bir uyarı göstermek mantıklı olabilir:

function conditional_comment_notice() {
    global $post;
    
    // Sadece belirli kategorideki yazılarda göster
    if ( in_category( 'teknik', $post ) ) {
        echo '<div class="technical-notice">
            <p><strong>Teknik İçerik Uyarısı:</strong> Bu yazı hakkında yorum yapmadan önce 
            ilgili dokümantasyonu okumanızı öneririz. Teknik sorularınız için 
            <a href="/forum">forum sayfamızı</a> kullanabilirsiniz.</p>
        </div>';
    }
    
    // Custom post type kontrolü
    if ( get_post_type() === 'product_review' ) {
        echo '<div class="review-notice">
            <p>Yalnızca ürünü satın almış kullanıcıların yorumları onaylanmaktadır. 
            Sipariş numaranızı yorumunuzda belirtiniz.</p>
        </div>';
    }
    
    // Yazı yaşı kontrolü
    $post_age = ( time() - get_post_time( 'U', true ) ) / DAY_IN_SECONDS;
    if ( $post_age > 365 ) {
        echo '<div class="old-post-notice" style="background:#fff3cd;padding:10px;margin-bottom:15px;">
            <p><strong>Dikkat:</strong> Bu yazı 1 yıldan eski. Bilgiler güncelliğini yitirmiş olabilir.</p>
        </div>';
    }
}
add_action( 'comment_form_before', 'conditional_comment_notice' );

Yazı yaşı kontrolü özellikle teknik bloglarda çok işe yarar. Kullanıcılar eski bir yazının yorumlarına hala aktif sorular yazabilir, bu onları sizi meşgul etmeye devam ettirir.

Gerçek Dünya Senaryosu 4: Yorum Sayısına Göre Dinamik İçerik

Yorum sayısına göre farklı mesajlar göstermek kullanıcıları teşvik edici bir etki yaratabilir:

function dynamic_comment_count_notice() {
    $comment_count = get_comments_number();
    
    if ( $comment_count === 0 ) {
        echo '<div class="first-comment-notice">
            <p>Bu yazıya henüz yorum yapılmamış. <strong>İlk yorumu sen yap!</strong> 
            Topluluk tartışmalarını başlatan kişi olmak güzel bir his.</p>
        </div>';
    } elseif ( $comment_count > 0 && $comment_count <= 5 ) {
        echo '<div class="few-comments-notice">
            <p>Bu yazıda ' . $comment_count . ' yorum var. Sende görüşlerini paylaş!</p>
        </div>';
    } elseif ( $comment_count > 50 ) {
        echo '<div class="popular-notice">
            <p><strong>Popüler İçerik:</strong> Bu yazı ' . $comment_count . ' yorumla 
            oldukça ilgi görüyor. Katılmak ister misin?</p>
        </div>';
    }
}
add_action( 'comment_form_before', 'dynamic_comment_count_notice' );

CSS ile Stil Verme

Eklediğiniz içeriklerin inline stil yerine proper CSS class’ları ile yönetilmesi daha temiz bir yaklaşımdır. Temanızın functions.php dosyasına şunu ekleyerek özel bir CSS dosyası yükleyebilir ya da wp_add_inline_style kullanabilirsiniz:

function comment_notice_styles() {
    if ( is_singular() && comments_open() ) {
        $css = '
        .comment-form-notice {
            background: #f8f9fa;
            border: 1px solid #dee2e6;
            border-radius: 6px;
            padding: 14px 18px;
            margin-bottom: 20px;
            font-size: 14px;
            line-height: 1.6;
        }
        .comment-form-notice a {
            color: #0073aa;
            text-decoration: underline;
        }
        .kvkk-notice {
            background: #f0f7ff;
            border-left: 4px solid #0073aa;
            padding: 12px 16px;
            margin-bottom: 20px;
            font-size: 13px;
        }
        .login-notice {
            padding: 15px;
            background: #fff3cd;
            border: 1px solid #ffc107;
            border-radius: 4px;
            margin-bottom: 15px;
        }
        .old-post-notice {
            background: #fff3cd;
            border: 1px solid #ffc107;
            padding: 10px 15px;
            margin-bottom: 15px;
            border-radius: 4px;
        }
        ';
        
        wp_add_inline_style( 'style', $css );
    }
}
add_action( 'wp_enqueue_scripts', 'comment_notice_styles' );

Burada is_singular() && comments_open() kontrolü yapıyoruz ki bu CSS sadece yorum formunun bulunduğu sayfalarda yüklensin. Gereksiz yere her sayfaya CSS yüklemek performans açısından verimli değil.

Gelişmiş Kullanım: Özelleştirilebilir Admin Paneli Ayarları

Belki de en profesyonel yaklaşım, site sahibinin WordPress admin panelinden bu mesajı yönetebilmesini sağlamak. Basit bir settings field ekleyerek bunu yapabilirsiniz:

// Ayar sayfasını kaydet
function comment_notice_settings_init() {
    register_setting( 'discussion', 'custom_comment_notice_text' );
    register_setting( 'discussion', 'custom_comment_notice_enabled' );
    
    add_settings_section(
        'comment_notice_section',
        'Yorum Formu Bildirimi',
        'comment_notice_section_callback',
        'discussion'
    );
    
    add_settings_field(
        'comment_notice_enabled',
        'Bildirimi Aktif Et',
        'comment_notice_enabled_callback',
        'discussion',
        'comment_notice_section'
    );
    
    add_settings_field(
        'comment_notice_text',
        'Bildirim Metni',
        'comment_notice_text_callback',
        'discussion',
        'comment_notice_section'
    );
}
add_action( 'admin_init', 'comment_notice_settings_init' );

function comment_notice_section_callback() {
    echo '<p>Yorum formunun üzerinde gösterilecek özel mesajı buradan yönetebilirsiniz.</p>';
}

function comment_notice_enabled_callback() {
    $enabled = get_option( 'custom_comment_notice_enabled', '1' );
    echo '<input type="checkbox" name="custom_comment_notice_enabled" value="1" ' . checked( '1', $enabled, false ) . '>';
}

function comment_notice_text_callback() {
    $text = get_option( 'custom_comment_notice_text', '' );
    echo '<textarea name="custom_comment_notice_text" rows="4" cols="60" class="large-text">' . esc_textarea( $text ) . '</textarea>';
    echo '<p class="description">HTML etiketleri kullanabilirsiniz.</p>';
}

// Formu bu ayara göre göster
function admin_controlled_comment_notice() {
    $enabled = get_option( 'custom_comment_notice_enabled', '1' );
    $text = get_option( 'custom_comment_notice_text', '' );
    
    if ( $enabled && ! empty( $text ) ) {
        echo '<div class="comment-form-notice">' . wp_kses_post( $text ) . '</div>';
    }
}
add_action( 'comment_form_before', 'admin_controlled_comment_notice' );

Bu yaklaşımda wp_kses_post() fonksiyonunu kullandık. Bu fonksiyon post içeriğinde izin verilen HTML etiketlerine göre çıktıyı sanitize eder. Ne çok kısıtlayıcı ne de çok izin verici, tam olarak doğru denge.

Shortcode Desteği ile Esnek İçerik

Eğer içeriğinizde shortcode kullanmak istiyorsanız küçük bir ekleme gerekiyor:

function shortcode_enabled_comment_notice() {
    $notice_text = get_option( 'custom_comment_notice_text', '' );
    
    if ( ! empty( $notice_text ) ) {
        // Shortcode'ları işle
        $processed_text = do_shortcode( wp_kses_post( $notice_text ) );
        echo '<div class="comment-form-notice">' . $processed_text . '</div>';
    }
}
add_action( 'comment_form_before', 'shortcode_enabled_comment_notice' );

Böylece admin paneline

Hata: İletişim formu bulunamadı.

veya [custom_button] gibi shortcode’lar yazabilir ve bunlar otomatik olarak işlenebilir.

Tema Uyumluluğu ve Dikkat Edilmesi Gerekenler

Bazı temalar yorum formunu tamamen custom bir şekilde oluşturur ve WordPress’in standart comment_form() fonksiyonunu kullanmaz. Bu durumda hook’larınız çalışmaz. Bunu test etmek için şunu yapabilirsiniz:

  • Önce bir varsayılan WordPress temasında (Twenty Twenty-Four gibi) test edin
  • Eğer orada çalışıyorsa sorun temanızdan kaynaklanıyordur
  • Temanın comments.php dosyasını inceleyerek comment_form() çağrısının yapılıp yapılmadığını kontrol edin

Bunun yanında çocuk tema kullanıyorsanız kodu doğru functions.php dosyasına eklediğinizden emin olun. Çocuk temanın functions.php dosyası, ana temanın dosyasını tamamen geçersiz kılmaz, her ikisi de yüklenir. Dolayısıyla kodu çocuk tema functions.php dosyasına eklemek güvenli ve doğru yaklaşımdır.

Cache Uyumlu Yaklaşım

Sitenizde bir cache eklentisi kullanıyorsanız dinamik içerikler sorun yaratabilir. Özellikle giriş durumuna göre farklı içerik gösteriyorsanız cache mekanizması yanlış içeriği sunabilir. Bu durumda şu yaklaşımı düşünebilirsiniz:

function cache_safe_comment_notice() {
    // Statik içerik her zaman güvenli
    echo '<div class="static-notice">
        Yorumlar editörümüz tarafından incelendikten sonra yayınlanır.
    </div>';
    
    // Dinamik içerik için JavaScript kullan
    echo '<div id="dynamic-comment-notice" style="display:none;"></div>';
    echo '<script>
    (function() {
        var notice = document.getElementById("dynamic-comment-notice");
        var isLoggedIn = ' . ( is_user_logged_in() ? "true" : "false" ) . ';
        if (isLoggedIn) {
            notice.innerHTML = "<p>Hoş geldiniz! Yorumunuzu bekliyoruz.</p>";
            notice.style.display = "block";
        }
    })();
    </script>';
}
add_action( 'comment_form_before', 'cache_safe_comment_notice' );

Ancak şunu belirtmek gerekir: is_user_logged_in() gibi PHP fonksiyonları zaten cache’den önce çalışır ve çoğu modern cache eklentisi bu durumu handle edebilir. WP Super Cache ve W3 Total Cache gibi eklentiler giriş yapmış kullanıcılar için cache’i otomatik olarak bypass eder.

Sık Yapılan Hatalar

Yorum formuna içerik eklerken yapılan en yaygın hatalar şunlar:

  • Güvenlik kontrolü yapmamak: Kullanıcıdan gelen veriyi direkt echo etmek XSS açığına davetiye çıkarır. Her zaman esc_html(), esc_url() veya wp_kses_post() kullanın
  • Hook seçimini yanlış yapmak: comment_form_before formu tamamen dışarıdan sarar, comment_form_top form içindedir. İkisi arasındaki farkı test edin
  • Tüm sayfalarda yükleme: is_singular() ve comments_open() kontrolü yapmadan her sayfada kod çalıştırmak gereksiz yük oluşturur
  • Inline CSS aşırı kullanımı: Kısa vadede pratik görünse de büyük projelerde bakımı zorlaşır. Tercihen CSS dosyasını kullanın
  • Çeviri desteğini unutmak: Eğer çok dilli bir site yapıyorsanız metinlerinizi __() veya _e() ile sarın

Sonuç

WordPress yorum formunun üzerine içerik eklemek göründüğünden çok daha esnek ve güçlü bir özellik. comment_form_before ve comment_form_top hook’larını doğru kullanarak KVKK uyarısından kişiselleştirilmiş karşılama mesajına, yorum sayısına göre dinamik içerikten admin paneli yönetimine kadar pek çok şeyi yapabilirsiniz.

Önemli olan doğru hook’u seçmek, güvenlik fonksiyonlarını kullanmayı atlamak ve performans konusunda bilinçli olmak. Bu yazıdaki örnekler birbirinden bağımsız kullanılabileceği gibi birleştirilerek daha kapsamlı bir çözüm de oluşturabilirsiniz.

Bir sonraki adım olarak yorum formunun alanlarını özelleştirmeyi, yeni alanlar eklemeyi ya da submit sonrası tetiklenen hook’ları incelemenizi öneririm. WordPress’in hook sistemi ne kadar derine inerseniz o kadar kontrol sahibi olduğunuzu fark edeceksiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir