WordPress İçerik Öncesine Otomatik İçerik Ekleme
WordPress site yönetiminde en sık karşılaşılan ihtiyaçlardan biri, içerik alanının başına otomatik olarak bir şeyler eklemektir. Bunu her seferinde editörden elle yapmak hem zaman kaybı hem de insan hatalarına açık bir süreçtir. İşte tam burada functions.php devreye giriyor ve hayatı çok daha kolaylaştırıyor.
the_content Filtresi Nedir ve Nasıl Çalışır?
WordPress, içerik gösterimini bir filtre sistemi üzerinden yönetir. the_content filtresi, veritabanından çekilen ham içeriği ekrana basmadan önce işleme sokar. Bu filtreye hook’ladığın her fonksiyon, içeriği alır, istediğin gibi manipüle eder ve geri döndürür.
Bu yaklaşımın güzelliği şu: veritabanındaki içerik hiç değişmez. Sadece kullanıcıya gösterilen çıktı değişir. Yani bir hata yapsan bile gerçek içerik güvende kalır.
Temel kullanım şu şekildedir:
add_filter( 'the_content', 'fonksiyon_adi' );
function fonksiyon_adi( $content ) {
$ek_icerik = '<p>Buraya eklenecek içerik</p>';
return $ek_icerik . $content;
}
Bu kadar basit. Ama gerçek dünya senaryolarında işler biraz daha karmaşıklaşır. Hadi somut örneklere geçelim.
Temel Kullanım: Tüm İçeriklere Ekleme
En basit senaryo, sitedeki tüm post ve sayfa içeriklerinin başına bir şey eklemektir. Diyelim ki siteye yeni bir KVKK bildirimi eklemen gerekiyor ve bunu her içeriğin üstünde göstermek istiyorsun.
function kvkk_bildirimi_ekle( $content ) {
$bildiri = '<div class="kvkk-uyari" style="background: #fff3cd; border: 1px solid #ffc107; padding: 12px; margin-bottom: 20px; border-radius: 4px;">';
$bildiri .= '<strong>Gizlilik Bildirimi:</strong> Bu içerik kişisel verilerin korunması mevzuatına uygun olarak hazırlanmıştır. ';
$bildiri .= '<a href="/gizlilik-politikasi">Detaylı bilgi için tıklayın.</a>';
$bildiri .= '</div>';
return $bildiri . $content;
}
add_filter( 'the_content', 'kvkk_bildirimi_ekle' );
Bu kod çalışır ama bir sorunu var: Ana sayfada, arşiv sayfalarında, widget alanlarında da tetiklenebilir. Bunu kontrol altına almak için koşullu etiketler kullanman gerekiyor.
Sadece Belirli Post Tiplerine Ekleme
Gerçek dünyada genellikle belirli bir post tipine özgü içerik eklemen gerekir. Mesela sadece blog yazılarının başına “Bu yazı X dakikada okunur” gibi bir bilgi kutusu eklemek istiyorsun.
function okuma_suresi_ekle( $content ) {
// Sadece tekil post görünümünde çalış
if ( ! is_singular( 'post' ) ) {
return $content;
}
// Ana döngü içinde olduğundan emin ol
if ( ! in_the_loop() ) {
return $content;
}
// Kelime sayısına göre okuma süresi hesapla
$kelime_sayisi = str_word_count( strip_tags( $content ) );
$okuma_suresi = ceil( $kelime_sayisi / 200 ); // Ortalama 200 kelime/dakika
$bilgi_kutusu = '<div class="okuma-suresi">';
$bilgi_kutusu .= '<span class="ikon">⏱</span> ';
$bilgi_kutusu .= 'Tahmini okuma süresi: <strong>' . $okuma_suresi . ' dakika</strong>';
$bilgi_kutusu .= '</div>';
return $bilgi_kutusu . $content;
}
add_filter( 'the_content', 'okuma_suresi_ekle' );
Burada dikkat etmem gereken iki kritik nokta var:
- is_singular(‘post’): Sadece tekil yazı görünümlerinde tetiklenir
- in_the_loop(): Widget’larda veya başka alanlarda yanlışlıkla çalışmasını engeller
Kategori veya Etiket Bazlı Ekleme
Diyelim ki “Tarifler” kategorisindeki yazıların başına her zaman bir uyarı kutusu eklemek istiyorsun. Mesela “Bu tarifte yer alan kalori değerleri tahminidir” gibi bir not.
function tarif_uyarisi_ekle( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() ) {
return $content;
}
// Yazı belirtilen kategoride mi kontrol et
if ( ! has_category( 'tarifler' ) ) {
return $content;
}
$uyari = '<div class="tarif-uyari-kutusu">';
$uyari .= '<h4>⚠️ Dikkat</h4>';
$uyari .= '<p>Bu tarifte belirtilen kalori ve besin değerleri tahminidir. ';
$uyari .= 'Kesin bilgi için bir beslenme uzmanına danışmanızı öneririz.</p>';
$uyari .= '<p><em>Hazırlama süreleri malzeme miktarına göre farklılık gösterebilir.</em></p>';
$uyari .= '</div>';
return $uyari . $content;
}
add_filter( 'the_content', 'tarif_uyarisi_ekle' );
Aynı mantığı etiketler için de kullanabilirsin. has_tag('sponsorlu') gibi bir kontrol ile sponsorlu içeriklerin başına otomatik olarak “Reklam” etiketi ekleyebilirsin.
Custom Post Type için Özel Ekleme
Eğer sitende özel bir post tipi varsa, örneğin urun-inceleme ya da portfoy gibi, bu post tiplerinin içeriklerine özel bilgiler ekleyebilirsin.
function urun_inceleme_puani_ekle( $content ) {
if ( ! is_singular( 'urun-inceleme' ) || ! in_the_loop() ) {
return $content;
}
$post_id = get_the_ID();
// Custom field'dan puan bilgisini çek
$puan = get_post_meta( $post_id, 'inceleme_puani', true );
$urun_adi = get_post_meta( $post_id, 'urun_adi', true );
$fiyat = get_post_meta( $post_id, 'urun_fiyati', true );
$tavsiye_eder = get_post_meta( $post_id, 'tavsiye_eder_mi', true );
if ( empty( $puan ) ) {
return $content;
}
// Yıldız gösterimi oluştur
$yildizlar = '';
for ( $i = 1; $i <= 5; $i++ ) {
$yildizlar .= ( $i <= $puan ) ? '★' : '☆';
}
$ozet = '<div class="inceleme-ozet-kutusu">';
$ozet .= '<h3>İnceleme Özeti</h3>';
if ( $urun_adi ) {
$ozet .= '<p><strong>Ürün:</strong> ' . esc_html( $urun_adi ) . '</p>';
}
$ozet .= '<p><strong>Puanımız:</strong> <span class="yildizlar">' . $yildizlar . '</span> (' . esc_html( $puan ) . '/5)</p>';
if ( $fiyat ) {
$ozet .= '<p><strong>Fiyat:</strong> ' . esc_html( $fiyat ) . ' TL</p>';
}
$ozet .= '<p><strong>Tavsiye eder miyiz?</strong> ' . ( $tavsiye_eder === 'evet' ? '✅ Evet' : '❌ Hayır' ) . '</p>';
$ozet .= '</div>';
return $ozet . $content;
}
add_filter( 'the_content', 'urun_inceleme_puani_ekle' );
Bu örnek gerçekten işe yarar bir senaryo. Ürün inceleme sitelerinde her yazının başında böyle bir özet kutusu görmüşsünüzdür. Bunu her seferinde elle yazmak yerine, yazar sadece custom field’ları dolduruyor ve sistem gerisini hallediyor.
Kullanıcı Rolüne Göre Farklı İçerik Ekleme
Bazı durumlarda, farklı kullanıcı rollerine farklı mesajlar göstermen gerekebilir. Mesela üye olan kullanıcılara “Teşekkürler, yazıyı okudunuz” derken, üye olmayanlara “Üye olun ve daha fazlasını okuyun” mesajı gösterebilirsin.
function kullanici_rolune_gore_mesaj_ekle( $content ) {
if ( ! is_singular() || ! in_the_loop() ) {
return $content;
}
if ( is_user_logged_in() ) {
$current_user = wp_get_current_user();
$kullanici_adi = $current_user->display_name;
// Üyelere özel mesaj
$mesaj = '<div class="uye-karsilama">';
$mesaj .= '<p>👋 Merhaba <strong>' . esc_html( $kullanici_adi ) . '</strong>, ';
$mesaj .= 'bu içeriği üye olduğun için erken okuyorsun!</p>';
$mesaj .= '</div>';
} else {
// Misafir kullanıcılara üyelik daveti
$mesaj = '<div class="uyelik-daveti">';
$mesaj .= '<p>📧 Bu tür içeriklerden haberdar olmak için ';
$mesaj .= '<a href="' . esc_url( wp_registration_url() ) . '">ücretsiz üye ol</a> ';
$mesaj .= 'veya <a href="' . esc_url( wp_login_url() ) . '">giriş yap</a>.</p>';
$mesaj .= '</div>';
}
return $mesaj . $content;
}
add_filter( 'the_content', 'kullanici_rolune_gore_mesaj_ekle' );
WooCommerce Ürün Sayfalarına İçerik Ekleme
WooCommerce kullanıyorsan, ürün açıklamalarının başına otomatik bilgi eklemek çok işe yarar. Mesela her ürünün başına kargo ve iade bilgisi eklemek isteyebilirsin.
function woo_urun_bilgi_ekle( $content ) {
// Sadece WooCommerce ürün sayfalarında çalış
if ( ! is_singular( 'product' ) || ! in_the_loop() ) {
return $content;
}
global $product;
// $product nesnesi hazır değilse çık
if ( ! $product instanceof WC_Product ) {
return $content;
}
$stok_durumu = $product->get_stock_status();
$stok_uyari = '';
// Stok durumuna göre uyarı mesajı
if ( $stok_durumu === 'onbackorder' ) {
$stok_uyari = '<div class="stok-uyari arka-siparis">';
$stok_uyari .= '📦 Bu ürün şu an stokta yok, arka sipariş alınmaktadır.';
$stok_uyari .= '</div>';
} elseif ( $stok_durumu === 'instock' && $product->get_stock_quantity() < 5 ) {
$stok_uyari = '<div class="stok-uyari az-stok">';
$stok_uyari .= '⚡ Son ' . $product->get_stock_quantity() . ' adet! Stoklar tükenmeden alın.';
$stok_uyari .= '</div>';
}
$bilgi_bar = '<div class="urun-bilgi-bar">';
$bilgi_bar .= '<span>🚚 Ücretsiz Kargo (200 TL ve üzeri)</span>';
$bilgi_bar .= '<span>↩️ 30 Gün İade Garantisi</span>';
$bilgi_bar .= '<span>🔒 Güvenli Ödeme</span>';
$bilgi_bar .= '</div>';
return $stok_uyari . $bilgi_bar . $content;
}
add_filter( 'the_content', 'woo_urun_bilgi_ekle' );
Bu kodu kullanan bir e-ticaret sitesinde, yöneticinin tek tek ürün sayfalarını düzenlemesine gerek kalmaz. Stok durumu değiştiğinde uyarı otomatik olarak güncellenir.
Tarih Bazlı İçerik Ekleme: Eski Yazı Uyarısı
Blog yönetiminin en klasik sorunlarından biri eski içeriklerin hâlâ okunması ve güncelliğini yitirmiş bilgilerin paylaşılmasıdır. Bunu önlemek için eski yazılara otomatik uyarı ekleyebilirsin.
function eski_yazi_uyarisi_ekle( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() ) {
return $content;
}
$yayinlanma_tarihi = get_the_date( 'U' ); // Unix timestamp
$simdi = current_time( 'timestamp' );
$fark_gun = ( $simdi - $yayinlanma_tarihi ) / DAY_IN_SECONDS;
// 365 günden eski yazılara uyarı ekle
if ( $fark_gun < 365 ) {
return $content;
}
$yil_sayisi = floor( $fark_gun / 365 );
$uyari = '<div class="eski-yazi-uyarisi">';
$uyari .= '<strong>⚠️ Dikkat:</strong> Bu yazı yaklaşık <strong>';
$uyari .= $yil_sayisi . ' yıl</strong> önce yayınlanmıştır. ';
$uyari .= 'İçeriklerin bir kısmı güncelliğini yitirmiş olabilir. ';
// Güncelleme tarihi varsa göster
$guncelleme_tarihi = get_the_modified_date( 'U' );
if ( $guncelleme_tarihi > $yayinlanma_tarihi ) {
$uyari .= 'Son güncelleme: <strong>' . get_the_modified_date( 'd.m.Y' ) . '</strong>.';
}
$uyari .= '</div>';
return $uyari . $content;
}
add_filter( 'the_content', 'eski_yazi_uyarisi_ekle' );
Bu özelliği teknik bloglar için çok sık kullanırım. 2019’da yazdığın bir WordPress güvenlik yazısı artık geçerli olmayabilir ve okuyucuyu yanlış yönlendirmemek için bu tür uyarılar kritik önem taşır.
Birden Fazla Filtreyi Yönetme ve Öncelik Sıralaması
Birden fazla fonksiyon aynı filtreye hook’landığında, çalışma sırası önem kazanır. add_filter‘ın üçüncü parametresi olan öncelik değeri bunu belirler. Düşük sayı = önce çalışır.
// Bu fonksiyon önce çalışır (öncelik: 10, varsayılan)
function ilk_eklenen_icerik( $content ) {
if ( ! is_singular() || ! in_the_loop() ) {
return $content;
}
$ek = '<div class="ilk-bilgi">Bu bilgi en üstte görünür.</div>';
return $ek . $content;
}
add_filter( 'the_content', 'ilk_eklenen_icerik', 10 );
// Bu fonksiyon sonra çalışır (öncelik: 5)
// Ama öncelik 5 olduğu için aslında DAHA ÖNCE çalışır
function en_uste_cikan_icerik( $content ) {
if ( ! is_singular() || ! in_the_loop() ) {
return $content;
}
$ek = '<div class="en-ust-bilgi">Bu bilgi gerçekten en üstte.</div>';
return $ek . $content;
}
add_filter( 'the_content', 'en_uste_cikan_icerik', 5 );
Yani öncelik değeri düşük olan hook daha önce çalışır. Bu sıralamayı kafan karışmadan yönetmek için şunu aklında tut:
- Öncelik 5: En erken çalışır, içeriğin en üstüne eklenir
- Öncelik 10: Varsayılan, ortada kalır
- Öncelik 20: En son çalışır, içeriğin en altına eklenir (ön içerik için)
Bekle, bu aslında biraz kafa karıştırıcı. Eğer her fonksiyon $ek . $content şeklinde döndürüyorsa, önce çalışan fonksiyonun eklentisi DAHA ALTA düşer. Çünkü sonraki fonksiyon, öncekinin çıktısını $content olarak alır ve üstüne kendi eklemesini yapar. Bu yüzden içerik öncesine ekleme yaparken yüksek öncelik = daha üstte demektir.
Güvenlik: XSS ve Escape
Kullanıcıdan gelen verileri içeriğe eklerken mutlaka escape işlemi uygulaman gerekiyor. WordPress bunu kolaylaştırmak için birkaç fonksiyon sunar:
- esc_html(): HTML karakterlerini güvenli hale getirir
- esc_url(): URL’leri temizler
- esc_attr(): HTML attribute değerlerini güvenli hale getirir
- wp_kses_post(): Post içeriği için izin verilen HTML taglarını filtreler
- sanitize_text_field(): Düz metin alanlarını temizler
Hiçbir zaman kullanıcı girdisini doğrudan içeriğe ekleme. Her zaman uygun escape fonksiyonunu kullan.
Performance: Caching ile Uyum
Bu tür dinamik eklemeler, caching eklentileriyle bazen sorun çıkarabilir. Özellikle kullanıcı rolüne göre farklı içerik gösterdiğinde, cache sisteminin bunu nasıl işlediğine dikkat etmen gerekir.
WP Rocket, W3 Total Cache gibi eklentilerde “kullanıcıya özel sayfa cache” ayarını aktif etmen gerekebilir. Aksi takdirde bir misafir kullanıcının gördüğü cached sayfa, giriş yapmış bir kullanıcıya da gösterilebilir.
Genel kural olarak kullanıcıya özgü içerikler ekliyorsan, o bölümü AJAX ile dinamik yüklemek daha güvenli bir yaklaşımdır.
Tüm Fonksiyonları Bir Arada Organize Etme
Birden fazla the_content hook’u kullanırken kodu organize tutmak önemlidir. İyi bir pratik, bunları bir sınıf içinde gruplamaktır:
class Icerik_Once_Ekleyici {
public function __construct() {
add_filter( 'the_content', array( $this, 'eski_yazi_uyarisi' ), 5 );
add_filter( 'the_content', array( $this, 'kategori_bildirimi' ), 10 );
add_filter( 'the_content', array( $this, 'okuma_suresi' ), 15 );
}
private function kontrol_et() {
return is_singular() && in_the_loop();
}
public function eski_yazi_uyarisi( $content ) {
if ( ! $this->kontrol_et() || ! is_singular( 'post' ) ) {
return $content;
}
$yayinlanma = get_the_date( 'U' );
$fark_gun = ( current_time( 'timestamp' ) - $yayinlanma ) / DAY_IN_SECONDS;
if ( $fark_gun < 365 ) {
return $content;
}
$uyari = '<div class="eski-uyari">⚠️ Bu içerik 1 yıldan eski olabilir.</div>';
return $uyari . $content;
}
public function kategori_bildirimi( $content ) {
if ( ! $this->kontrol_et() ) {
return $content;
}
if ( has_category( 'sponsorlu' ) ) {
$bildirim = '<div class="sponsorlu-icerik">📢 Sponsorlu İçerik</div>';
return $bildirim . $content;
}
return $content;
}
public function okuma_suresi( $content ) {
if ( ! $this->kontrol_et() || ! is_singular( 'post' ) ) {
return $content;
}
$sure = ceil( str_word_count( strip_tags( $content ) ) / 200 );
$gosterim = '<p class="okuma-suresi">⏱ Okuma süresi: <strong>' . $sure . ' dk</strong></p>';
return $gosterim . $content;
}
}
new Icerik_Once_Ekleyici();
Bu yaklaşım hem okunabilir hem de bakımı kolay. Yeni bir ekleme yapmak istediğinde sadece yeni bir metod yazıp __construct içinde hook’layabilirsin.
Sonuç
the_content filtresi, WordPress’in en güçlü araçlarından biri. Doğru kullanıldığında içerik yönetimini büyük ölçüde otomatize eder ve editörlerin üzerindeki yükü azaltır.
Özetlemek gerekirse, dikkat etmen gereken kritik noktalar şunlar:
- Her zaman
in_the_loop()kontrolü yap, yoksa beklenmedik yerlerde çalışır is_singular()ile post tipi kontrolü ekle, gereksiz çalışmaları önle- Kullanıcı girdilerini mutlaka escape et, XSS açıklarına kapı açma
- Öncelik sırasını doğru ayarla, birden fazla hook kullanıyorsan
- Cache uyumluluğunu göz önünde bulundur, kullanıcıya özel içeriklerde dikkatli ol
- Kodu organize tut, bir sınıf yapısı kullanmayı düşün
Bu yöntemler production ortamında test ettiğim, gerçek müşteri projelerinde kullandığım teknikler. Child theme’inizin functions.php dosyasına ekleyebilir, ya da küçük bir eklenti oluşturarak da kullanabilirsiniz. Child theme kullanmadan doğrudan tema functions.php‘sine ekleme yaparsanız, tema güncellemelerinde kodlarınızın uçabileceğini unutmayın.
