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.phpdosyasını inceleyerekcomment_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
echoetmek XSS açığına davetiye çıkarır. Her zamanesc_html(),esc_url()veyawp_kses_post()kullanın - Hook seçimini yanlış yapmak:
comment_form_beforeformu tamamen dışarıdan sarar,comment_form_topform içindedir. İkisi arasındaki farkı test edin - Tüm sayfalarda yükleme:
is_singular()vecomments_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.
