Yazıya Özel Sidebar Atama: functions.php ile
WordPress ile çalışırken er ya da geç şu soruyla yüzleşiyorsunuz: “Bu sayfada farklı bir sidebar göstermem gerekiyor, ama tema bunu desteklemiyor.” İşte tam bu noktada functions.php devreye giriyor. Yazıya özel sidebar atama, aslında çok basit bir konsept; ama doğru yapılandırılmadığında tema güncellemelerinde kaybolan, bakımı zorlaşan bir kaosa dönüşebilir. Bu yazıda konuyu hem teorik hem pratik açıdan ele alıyoruz.
Sidebar Nedir ve Neden Özelleştirme Gerekir?
WordPress’te sidebar, teknik olarak bir “widget area” yani widget alanıdır. Tema dosyalarında dynamic_sidebar() fonksiyonu ile çağrılır. Varsayılan olarak çoğu tema tek bir sidebar kullanır ve bu sidebar’ı tüm sayfalarda gösterir.
Gerçek dünyada ise durum çok farklı:
- Blog yazıları için “Son Yazılar” ve “Kategoriler” widget’larını içeren bir sidebar istiyorsunuz
- Ürün sayfaları için filtre widget’larının olduğu ayrı bir sidebar lazım
- İletişim sayfasında sidebar hiç olmamalı
- Landing page’lerde sidebar yerine özel bir çağrı-eylem kutusu göstermek istiyorsunuz
Bu ihtiyaçları karşılamanın en temiz yolu functions.php üzerinden yeni widget alanları kaydedip, bunları koşullu olarak doğru yerlerde çağırmaktır.
functions.php’ye Müdahale Ederken Dikkat Edilecekler
Doğrudan aktif temanızın functions.php dosyasını düzenlemek bir kötü pratiktir. Tema güncellendiğinde tüm değişiklikleriniz gider. Bunun yerine:
- Child tema kullanın: Aktif temanızın child temasını oluşturun ve değişiklikleri oraya yazın
- Custom plugin yaklaşımı: Site işlevselliğini bir mu-plugin veya özel plugin olarak geliştirin
- Code Snippets eklentisi: Küçük kod parçaları için pratik bir alternatif
Bu yazıdaki tüm kodlar child tema functions.php‘sine veya bir özel plugin dosyasına eklenebilir.
Adım 1: Yeni Sidebar’ları Kaydetmek
İlk adım register_sidebar() fonksiyonu ile yeni widget alanlarını WordPress’e tanıtmaktır.
<?php
// functions.php - Yeni sidebar'ları kaydet
function benim_sitemi_sidebar_kaydet() {
// Blog yazıları için özel sidebar
register_sidebar( array(
'name' => 'Blog Yazıları Sidebar',
'id' => 'blog-yazi-sidebar',
'description' => 'Yalnızca blog yazılarında görünen widget alanı',
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>',
));
// WooCommerce ürün sayfaları için sidebar
register_sidebar( array(
'name' => 'Ürün Detay Sidebar',
'id' => 'urun-detay-sidebar',
'description' => 'Ürün sayfalarında görünen filtre ve öneri alanı',
'before_widget' => '<div id="%1$s" class="widget urun-widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3 class="widget-title urun-title">',
'after_title' => '</h3>',
));
// İletişim ve hakkımızda sayfaları için dar sidebar
register_sidebar( array(
'name' => 'Kurumsal Sidebar',
'id' => 'kurumsal-sidebar',
'description' => 'İletişim ve kurumsal sayfalarda kullanılır',
'before_widget' => '<div id="%1$s" class="widget kurumsal-widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h4 class="widget-baslik">',
'after_title' => '</h4>',
));
}
add_action( 'widgets_init', 'benim_sitemi_sidebar_kaydet' );
Bu kod çalıştıktan sonra WordPress yönetim panelinde Görünüm > Widget’lar bölümünde üç yeni widget alanı göreceksiniz.
Adım 2: Koşullu Sidebar Gösterimi için Yardımcı Fonksiyon
Temanın sidebar dosyasına (genellikle sidebar.php) koşul eklemek yerine, bir yardımcı fonksiyon yazarak hangi sidebar’ın görüneceğini merkezi olarak yönetelim.
<?php
// functions.php - Aktif sidebar ID'sini döndüren fonksiyon
function get_aktif_sidebar_id() {
// WooCommerce ürün sayfası
if ( function_exists('is_product') && is_product() ) {
return 'urun-detay-sidebar';
}
// WooCommerce kategori sayfası
if ( function_exists('is_product_category') && is_product_category() ) {
return 'urun-detay-sidebar';
}
// Blog tekil yazısı
if ( is_single() && get_post_type() === 'post' ) {
return 'blog-yazi-sidebar';
}
// Belirli sayfa ID'leri için kurumsal sidebar
$kurumsal_sayfa_idleri = array( 5, 12, 34 ); // İletişim, Hakkımızda, Ekibimiz
if ( is_page( $kurumsal_sayfa_idleri ) ) {
return 'kurumsal-sidebar';
}
// Sidebar gösterilmemesi gereken sayfalar
$sidebar_yok_idleri = array( 7, 19 ); // Landing page'ler
if ( is_page( $sidebar_yok_idleri ) ) {
return false; // false döndürerek sidebar'ı gizle
}
// Varsayılan sidebar
return 'sidebar-1';
}
Bu fonksiyon sayesinde tüm karar mantığı tek bir yerde toplanıyor. Bir şeyi değiştirmeniz gerektiğinde yalnızca bu fonksiyona bakmanız yeterli.
Adım 3: Tema Sidebar Dosyasını Güncellemek
Child temanızda bir sidebar.php dosyası oluşturun (veya varsa düzenleyin):
<?php
// child-tema/sidebar.php
$aktif_sidebar = get_aktif_sidebar_id();
// false döndüyse sidebar hiç gösterme
if ( $aktif_sidebar === false ) {
return;
}
// Sidebar aktif ve dolu mu kontrol et
if ( ! is_active_sidebar( $aktif_sidebar ) ) {
return;
}
?>
<aside id="secondary" class="widget-area sidebar-<?php echo esc_attr( $aktif_sidebar ); ?>">
<?php dynamic_sidebar( $aktif_sidebar ); ?>
</aside>
is_active_sidebar() kontrolü önemli. Eğer widget alanı boşsa, yani hiç widget eklenmemişse, gereksiz boş bir etiketi render edilmez.
Adım 4: Yazı Meta Kutusu ile Sayfa Bazlı Seçim
Bazen her yazı için ayrı ayrı sidebar belirlemek isteyebilirsiniz. Bunun için bir meta kutusu ekleyelim:
<?php
// functions.php - Yazı düzenleme ekranına sidebar seçim kutusu ekle
function sidebar_meta_kutusu_ekle() {
$post_types = array( 'post', 'page' );
foreach ( $post_types as $post_type ) {
add_meta_box(
'ozel_sidebar_secici',
'Özel Sidebar Seç',
'sidebar_meta_kutusu_render',
$post_type,
'side',
'default'
);
}
}
add_action( 'add_meta_boxes', 'sidebar_meta_kutusu_ekle' );
function sidebar_meta_kutusu_render( $post ) {
wp_nonce_field( 'sidebar_meta_kaydet', 'sidebar_meta_nonce' );
$kayitli_sidebar = get_post_meta( $post->ID, '_ozel_sidebar_id', true );
// Kayıtlı tüm sidebar'ları al
global $wp_registered_sidebars;
echo '<select name="ozel_sidebar_id" style="width:100%">';
echo '<option value="">-- Varsayılan --</option>';
echo '<option value="sidebar-yok"' . selected( $kayitli_sidebar, 'sidebar-yok', false ) . '>Sidebar Gösterme</option>';
foreach ( $wp_registered_sidebars as $sidebar ) {
echo '<option value="' . esc_attr( $sidebar['id'] ) . '"'
. selected( $kayitli_sidebar, $sidebar['id'], false ) . '>'
. esc_html( $sidebar['name'] )
. '</option>';
}
echo '</select>';
echo '<p class="description">Bu yazı/sayfa için özel sidebar seçin.</p>';
}
function sidebar_meta_kaydet( $post_id ) {
// Nonce kontrolü
if ( ! isset( $_POST['sidebar_meta_nonce'] ) ) {
return;
}
if ( ! wp_verify_nonce( $_POST['sidebar_meta_nonce'], 'sidebar_meta_kaydet' ) ) {
return;
}
// Otosave kontrolü
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// Yetki kontrolü
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
$sidebar_id = sanitize_text_field( $_POST['ozel_sidebar_id'] );
update_post_meta( $post_id, '_ozel_sidebar_id', $sidebar_id );
}
add_action( 'save_post', 'sidebar_meta_kaydet' );
Artık yazı veya sayfa düzenleme ekranında sağ panelde bir sidebar seçme kutusu görünecek.
Adım 5: Meta Kutusunu Yardımcı Fonksiyona Entegre Etmek
get_aktif_sidebar_id() fonksiyonumuzu güncelleyerek meta kutusundaki seçimi de dahil edelim:
<?php
// functions.php - Meta kutusu verisiyle güncellenmiş fonksiyon
function get_aktif_sidebar_id() {
// Sayfa veya yazıya özel sidebar seçilmişse onu kullan
if ( is_singular() ) {
$ozel_sidebar = get_post_meta( get_the_ID(), '_ozel_sidebar_id', true );
if ( $ozel_sidebar === 'sidebar-yok' ) {
return false;
}
if ( ! empty( $ozel_sidebar ) ) {
return $ozel_sidebar;
}
}
// WooCommerce kontrolü
if ( function_exists('is_product') && is_product() ) {
return 'urun-detay-sidebar';
}
if ( function_exists('is_product_category') && is_product_category() ) {
return 'urun-detay-sidebar';
}
// Blog tekil yazısı
if ( is_single() && get_post_type() === 'post' ) {
return 'blog-yazi-sidebar';
}
// Kurumsal sayfalar
$kurumsal_sayfa_idleri = array( 5, 12, 34 );
if ( is_page( $kurumsal_sayfa_idleri ) ) {
return 'kurumsal-sidebar';
}
// Landing page'ler
$sidebar_yok_idleri = array( 7, 19 );
if ( is_page( $sidebar_yok_idleri ) ) {
return false;
}
return 'sidebar-1';
}
Bu yapı şöyle çalışır: Önce yazıya özel bir seçim var mı diye bakar, varsa onu kullanır. Yoksa kural tabanlı mantığa geçer. Bu hiyerarşik yaklaşım hem esneklik hem de öngörülebilirlik sağlar.
Adım 6: Sayfa Şablonu Bazlı Sidebar Atama
WordPress sayfa şablonları ile de sidebar atayabilirsiniz. Örneğin “full-width.php” şablonu kullanan sayfalar sidebar göstermemelidir:
<?php
// functions.php - Sayfa şablonuna göre sidebar yönetimi
function sayfa_sablonuna_gore_sidebar( $sidebar_id ) {
if ( ! is_page() ) {
return $sidebar_id;
}
$sablon = get_page_template_slug( get_the_ID() );
// Tam genişlik şablonu - sidebar yok
if ( $sablon === 'template-full-width.php' ) {
return false;
}
// Landing page şablonu - sidebar yok
if ( $sablon === 'template-landing.php' ) {
return false;
}
// E-posta listesi şablonu - özel sidebar
if ( $sablon === 'template-email-list.php' ) {
return 'email-sidebar';
}
return $sidebar_id;
}
// Ana fonksiyona filtre uygula
add_filter( 'aktif_sidebar_id', 'sayfa_sablonuna_gore_sidebar' );
Ve get_aktif_sidebar_id() fonksiyonunun sonuna bir filter hook ekleyelim:
<?php
// get_aktif_sidebar_id() fonksiyonunun son return satırlarını şöyle güncelleyin:
function get_aktif_sidebar_id() {
// ... önceki kodlar ...
$varsayilan = 'sidebar-1';
// Filter hook ile diğer fonksiyonların müdahalesine izin ver
return apply_filters( 'aktif_sidebar_id', $varsayilan );
}
Gerçek Dünya Senaryosu: E-Ticaret Sitesi Kurulumu
Bir müşteriniz için WooCommerce tabanlı bir spor ekipmanı mağazası kurduğunuzu düşünelim. İhtiyaç listesi:
- Ana sayfa: Sidebar yok, full width
- Blog yazıları: Spor kategorileri, son yazılar, popüler ürünler widget’ları
- Ürün sayfaları: Fiyat filtresi, renk/beden filtresi, ilgili ürünler
- Kategori sayfaları: Filtreler ve marka listesi
- Hakkımızda / İletişim: Adres, sosyal medya, çalışma saatleri widget’ları
- Sepet / Ödeme: Sidebar yok
Tüm bu senaryoyu kapsayan yapıyı şöyle özetleyebiliriz. Önce tüm sidebar’ları kaydedin, ardından get_aktif_sidebar_id() içinde WooCommerce koşul fonksiyonlarını kullanın: is_cart(), is_checkout(), is_shop(), is_product_category(), is_product(). Blog için is_single() ve get_post_type() === 'post'. Kurumsal sayfalar için sayfa slug’larını veya ID’lerini kullanın: is_page( 'hakkimizda' ), is_page( 'iletisim' ).
Bu yapıyla birlikte editörler de meta kutusundan istedikleri yazıya farklı bir sidebar atayabilir hale gelir. Siz kural koyarsunuz, onlar istisnalar oluşturur.
Performans Notları
Koşullu sidebar sistemi iyi yazıldığında performansı olumsuz etkilemez, hatta geliştirebilir:
is_active_sidebar()kontrolü boş widget alanları için gereksiz HTML çıktısını engeller- Widget alanı sayısını kontrol altında tutun; her kayıtlı sidebar veritabanında yer tutar
- Çok sık değişmeyen sidebar içerikleri için WordPress transient API kullanmayı düşünebilirsiniz
$wp_registered_sidebarsglobal değişkenini gereksiz yere döngüye sokmaktan kaçının
Hata Ayıklama İpuçları
Sidebar görünmüyor veya yanlış sidebar görünüyorsa kontrol listesi:
var_dump( get_aktif_sidebar_id() )çıktısını geçici olarak sayfaya yazdırın- Widget alanına gerçekten widget eklenmiş mi kontrol edin
is_active_sidebar( 'sidebar-id' )true döndürüyor mu?wp-content/debug.logdosyasında PHP hatası var mı?- Child tema
sidebar.php‘si aktif temanınkini override ediyor mu?
wp_get_sidebars_widgets() fonksiyonu hangi widget’ların hangi alanlara atandığını döndürür, debug için kullanışlıdır.
Sonuç
WordPress’te yazıya özel sidebar atama, başlangıçta karmaşık görünse de doğru yapılandırıldığında son derece yönetilebilir bir sistem ortaya çıkarıyor. Bu yazıda anlattığımız yaklaşımın özeti şöyle:
- Tüm widget alanlarını
register_sidebar()ile merkezi olarak kaydedin - Karar mantığını tek bir yardımcı fonksiyona toplayın
- Meta kutusu ile editörlere sayfa bazlı esneklik verin
- Sayfa şablonları için filter hook kullanın
is_active_sidebar()ile boş alanları filtreleyin
Bu sistem sayesinde hem siz hem de sitenizi kullanan editörler tam kontrol sahibi olursunuz. Kural tabanlı atama işlerin çoğunu otomatik halleder, meta kutusu ise istisnalar için güvenli bir çıkış noktası sunar. Child tema üzerinde çalıştığınız sürece tema güncellemeleri hiçbir şeyi bozmaz.
