WooCommerce Ürün Sekmelerini Gizleme ve Sıralama
E-ticaret sitelerinde ürün sayfası deneyimi, dönüşüm oranlarını doğrudan etkileyen kritik bir faktördür. WooCommerce varsayılan olarak ürün sayfalarına “Açıklama”, “Ek Bilgiler” ve “Yorumlar” sekmelerini ekler. Ancak her mağaza için bu yapı ideal değildir. Bazı durumlarda gereksiz sekmeleri gizlemek, bazı durumlarda ise sekmelerin sırasını değiştirmek gerekir. Bu işlemleri doğru şekilde functions.php üzerinden yapmak hem performans hem de sürdürülebilirlik açısından en temiz yöntemdir.
WooCommerce Sekme Sistemi Nasıl Çalışır?
WooCommerce ürün sekmeleri, woocommerce_product_tabs filtresi üzerinden yönetilir. Bu filtre, her ürün sayfası yüklendiğinde çalışır ve bir dizi (array) döndürür. Bu dizinin içindeki her eleman bir sekmeyi temsil eder.
Varsayılan sekmeler şunlardır:
- description: Ürün açıklama sekmesi, önceliği 10
- additional_information: Ek bilgiler sekmesi (ağırlık, boyut vb.), önceliği 20
- reviews: Müşteri yorumları sekmesi, önceliği 30
Her sekme şu anahtarları içerir:
- title: Sekmede gösterilen başlık metni
- priority: Sekmelerin sıralanma düzeni (küçük değer = sola yakın)
- callback: Sekme içeriğini render eden fonksiyon
Bu yapıyı anlamak, sekmeleri gizleme ve sıralama işlemlerinin temelini oluşturur.
functions.php Dosyasına Kod Eklemek
Tüm örneklerde kodları temanızın functions.php dosyasına ya da bir child theme’in functions.php dosyasına eklemeniz gerekir. Child theme kullanmak kesinlikle tavsiye edilir; ana temayı güncellediğinizde değişiklikleriniz kaybolmaz.
Doğru dosya yolu genellikle şöyledir:
/wp-content/themes/your-child-theme/functions.php
Dosyayı düzenlemeden önce yedek almayı unutmayın:
cp /wp-content/themes/your-child-theme/functions.php
/wp-content/themes/your-child-theme/functions.php.bak
Tüm Sekmeleri Gizleme
Bazen özellikle tek sayfalık landing page tarzı ürünlerde tüm sekmeleri kaldırmak isteyebilirsiniz. Bunu yapmak için filtre ile boş dizi döndürmek yeterlidir:
<?php
add_filter( 'woocommerce_product_tabs', 'tum_sekmeleri_gizle', 98 );
function tum_sekmeleri_gizle( $tabs ) {
return array();
}
Bu yaklaşım, tüm sekmeleri tamamen kaldırır. Ancak bu yöntem genellikle önerilmez çünkü SEO açısından değerli içerik barındıran açıklama sekmesi de kaybolur.
Belirli Sekmeleri Gizleme
Pratikte en sık kullanılan senaryo belirli sekmeleri gizlemektir. Örneğin yorumlar modülünü kapattıysanız “Yorumlar” sekmesini göstermenin bir anlamı yoktur. Ya da ürünleriniz için boyut ve ağırlık bilgisi girmiyorsanız “Ek Bilgiler” sekmesi genellikle boş görünür.
Sadece Yorumlar Sekmesini Gizleme
<?php
add_filter( 'woocommerce_product_tabs', 'yorumlar_sekmesini_gizle', 98 );
function yorumlar_sekmesini_gizle( $tabs ) {
if ( isset( $tabs['reviews'] ) ) {
unset( $tabs['reviews'] );
}
return $tabs;
}
Sadece Ek Bilgiler Sekmesini Gizleme
<?php
add_filter( 'woocommerce_product_tabs', 'ek_bilgiler_gizle', 98 );
function ek_bilgiler_gizle( $tabs ) {
if ( isset( $tabs['additional_information'] ) ) {
unset( $tabs['additional_information'] );
}
return $tabs;
}
Birden Fazla Sekmeyi Aynı Anda Gizleme
Gerçek dünya senaryosunda genellikle birden fazla sekmeyi aynı fonksiyonla yönetmek daha temiz bir kod yapısı sağlar. Birden fazla filtre fonksiyonu tanımlamak yerine tek bir fonksiyon içinde tüm işlemi halledebilirsiniz:
<?php
add_filter( 'woocommerce_product_tabs', 'secili_sekmeleri_gizle', 98 );
function secili_sekmeleri_gizle( $tabs ) {
// Yorumlar sekmesini gizle
unset( $tabs['reviews'] );
// Ek bilgiler sekmesini gizle
unset( $tabs['additional_information'] );
return $tabs;
}
unset() öncesinde isset() kontrolü yapmak iyi bir alışkanlıktır. Ancak sekme mevcut değilse unset() PHP’de hata vermez, yalnızca sessizce devam eder. Yine de kodun okunabilirliği için kontrol eklemenizi öneririm.
Sekme Sıralamasını Değiştirme
Sekmelerin sırası priority değeriyle belirlenir. Düşük priority değeri, sekmenin daha solda görünmesini sağlar. Bunu değiştirmek oldukça basittir:
Yorumları En Başa Alma
Yüksek dönüşüm sağlayan mağazalarda sosyal kanıt çok önemlidir. Yorumlar sekmesini en öne taşımak bu açıdan faydalı olabilir:
<?php
add_filter( 'woocommerce_product_tabs', 'sekme_siralamasini_degistir', 98 );
function sekme_siralamasini_degistir( $tabs ) {
// Yorumları en başa taşı
if ( isset( $tabs['reviews'] ) ) {
$tabs['reviews']['priority'] = 5;
}
// Açıklamayı ikinci sıraya al
if ( isset( $tabs['description'] ) ) {
$tabs['description']['priority'] = 10;
}
// Ek bilgileri en sona bırak
if ( isset( $tabs['additional_information'] ) ) {
$tabs['additional_information']['priority'] = 20;
}
return $tabs;
}
Sekme Başlıklarını Değiştirme
Bazen varsayılan sekme isimlerini değiştirmek istersiniz. “Açıklama” yerine “Ürün Detayları” gibi daha açıklayıcı bir isim kullanmak kullanıcı deneyimini iyileştirebilir:
<?php
add_filter( 'woocommerce_product_tabs', 'sekme_basliklarini_degistir', 98 );
function sekme_basliklarini_degistir( $tabs ) {
// Açıklama sekmesi başlığını değiştir
if ( isset( $tabs['description'] ) ) {
$tabs['description']['title'] = __( 'Ürün Detayları', 'woocommerce' );
}
// Ek bilgiler başlığını değiştir
if ( isset( $tabs['additional_information'] ) ) {
$tabs['additional_information']['title'] = __( 'Teknik Özellikler', 'woocommerce' );
}
// Yorumlar başlığını değiştir
if ( isset( $tabs['reviews'] ) ) {
$tabs['reviews']['title'] = __( 'Müşteri Yorumları', 'woocommerce' );
}
return $tabs;
}
__() fonksiyonu ile metin çeviriyi destekliyorsunuz. Bu özellikle çok dilli siteler için önemlidir.
Özel Sekme Ekleme
Varsayılan sekmeleri yönetmenin yanı sıra özel sekmeler de ekleyebilirsiniz. Örneğin “Kargo Bilgileri” veya “Garanti Koşulları” gibi sekmeler eklemek mağazanıza özgü bilgileri düzenli sunmanızı sağlar:
<?php
add_filter( 'woocommerce_product_tabs', 'ozel_sekme_ekle' );
function ozel_sekme_ekle( $tabs ) {
$tabs['kargo_bilgileri'] = array(
'title' => __( 'Kargo Bilgileri', 'woocommerce' ),
'priority' => 25,
'callback' => 'kargo_bilgileri_icerik',
);
return $tabs;
}
function kargo_bilgileri_icerik() {
echo '<h2>Kargo Bilgileri</h2>';
echo '<p>Siparişleriniz 1-3 iş günü içinde kargoya verilmektedir.</p>';
echo '<p>100 TL ve üzeri alışverişlerde kargo ücretsizdir.</p>';
}
Ürün Kategorisine Göre Sekme Yönetimi
Gerçek dünya senaryolarında en güçlü kullanım, sekmeleri ürün kategorisine göre dinamik olarak yönetmektir. Örneğin elektronik ürünler için “Teknik Özellikler” sekmesi gösterirken giyim ürünleri için bunu gizleyebilirsiniz:
<?php
add_filter( 'woocommerce_product_tabs', 'kategoriye_gore_sekme_yonet', 98 );
function kategoriye_gore_sekme_yonet( $tabs ) {
global $product;
// Ürün nesnesini kontrol et
if ( ! is_a( $product, 'WC_Product' ) ) {
return $tabs;
}
$product_id = $product->get_id();
// Ürünün "dijital-urunler" kategorisinde olup olmadığını kontrol et
if ( has_term( 'dijital-urunler', 'product_cat', $product_id ) ) {
// Dijital ürünler için ek bilgileri gizle (fiziksel özellik yok)
unset( $tabs['additional_information'] );
// Özel dijital içerik sekmesi ekle
$tabs['dijital_icerik'] = array(
'title' => 'İndirme Bilgileri',
'priority' => 15,
'callback' => 'dijital_icerik_sekme',
);
}
// "outlet" kategorisindeki ürünler için yorumları gizle
if ( has_term( 'outlet', 'product_cat', $product_id ) ) {
unset( $tabs['reviews'] );
}
return $tabs;
}
function dijital_icerik_sekme() {
echo '<h2>İndirme Bilgileri</h2>';
echo '<p>Satın alma sonrası ürün, hesabınıza tanımlanacaktır.</p>';
echo '<p>İndirme linkine "Hesabım > Siparişlerim" bölümünden ulaşabilirsiniz.</p>';
}
has_term() fonksiyonu WordPress çekirdeğinden gelir ve belirli bir post’un istediğiniz taxonomy terimini içerip içermediğini kontrol eder.
Ürün Türüne Göre Sekme Yönetimi
WooCommerce’de basit ürün, değişken ürün, dijital ürün gibi farklı ürün türleri bulunur. Her tür için farklı sekme yapısı isteyebilirsiniz:
<?php
add_filter( 'woocommerce_product_tabs', 'urun_turune_gore_sekmeler', 98 );
function urun_turune_gore_sekmeler( $tabs ) {
global $product;
if ( ! is_a( $product, 'WC_Product' ) ) {
return $tabs;
}
$product_type = $product->get_type();
// Dijital (downloadable) ürünler için ek bilgileri gizle
if ( $product->is_downloadable() || $product->is_virtual() ) {
unset( $tabs['additional_information'] );
}
// Gruplu ürünler için yorumları gizle
if ( $product_type === 'grouped' ) {
unset( $tabs['reviews'] );
}
return $tabs;
}
Yorum Sayısına Göre Sekmeni Gösterme
Hiç yorum yokken “Yorumlar” sekmesini göstermek bazı mağazalar için olumsuz bir izlenim yaratabilir. Belirli bir yorum eşiğinin altında sekmeyi gizlemek mantıklı bir yaklaşım olabilir:
<?php
add_filter( 'woocommerce_product_tabs', 'yorum_sayisina_gore_sekme', 98 );
function yorum_sayisina_gore_sekme( $tabs ) {
global $product;
if ( ! is_a( $product, 'WC_Product' ) ) {
return $tabs;
}
// Yorum sayısını kontrol et
$review_count = $product->get_review_count();
// 3'ten az yorum varsa sekmeyi gizle
if ( $review_count < 3 ) {
unset( $tabs['reviews'] );
}
return $tabs;
}
Belirli Kullanıcı Rollerine Göre Sekme Yönetimi
B2B mağazalarında toptan satış müşterilerine farklı bilgiler sunmak isteyebilirsiniz. Kullanıcı rolüne göre sekme görünürlüğünü ayarlamak bunu mümkün kılar:
<?php
add_filter( 'woocommerce_product_tabs', 'role_gore_sekme_yonet', 98 );
function role_gore_sekme_yonet( $tabs ) {
// Kullanıcı giriş yapmış mı kontrol et
if ( is_user_logged_in() ) {
$user = wp_get_current_user();
// Toptan müşteriler için özel sekme ekle
if ( in_array( 'wholesale_customer', $user->roles ) ) {
$tabs['toptan_fiyat'] = array(
'title' => 'Toptan Fiyat Listesi',
'priority' => 8,
'callback' => 'toptan_fiyat_icerik',
);
}
// Misafir kullanıcılar için yorumları gizle
} else {
// Sadece giriş yapmış kullanıcılara yorum sekmesi göster
// Bu karar, mağaza politikasına göre değişir
// unset( $tabs['reviews'] );
}
return $tabs;
}
function toptan_fiyat_icerik() {
echo '<h2>Toptan Fiyat Bilgileri</h2>';
echo '<p>Bu ürün için toptan fiyat listesi için satış temsilcinizle iletişime geçin.</p>';
}
Tüm Değişiklikleri Birleştirme: Temiz Kod Yapısı
Birçok farklı sekme değişikliği yaparken birden fazla add_filter çağrısı kullanmak yerine hepsini tek bir fonksiyon içinde toplamak kodunuzu çok daha okunabilir hale getirir. Aşağıdaki örnek gerçek bir prodüksiyon ortamında kullanılan kapsamlı bir yapıyı göstermektedir:
<?php
/**
* WooCommerce Sekme Yönetimi
* Tüm sekme işlemleri tek filtreden yönetilir
*/
add_filter( 'woocommerce_product_tabs', 'woo_sekme_yonetimi', 98 );
function woo_sekme_yonetimi( $tabs ) {
global $product;
// Ürün nesnesi kontrolü
if ( ! is_a( $product, 'WC_Product' ) ) {
return $tabs;
}
// === SEKME BAŞLIKLARINI ÖZELLEŞTIR ===
if ( isset( $tabs['description'] ) ) {
$tabs['description']['title'] = 'Ürün Açıklaması';
$tabs['description']['priority'] = 10;
}
if ( isset( $tabs['additional_information'] ) ) {
$tabs['additional_information']['title'] = 'Teknik Özellikler';
$tabs['additional_information']['priority'] = 20;
}
if ( isset( $tabs['reviews'] ) ) {
$tabs['reviews']['title'] = 'Değerlendirmeler';
$tabs['reviews']['priority'] = 30;
}
// === DIJITAL ÜRÜNLER İÇİN ÖZEL AYARLAR ===
if ( $product->is_virtual() || $product->is_downloadable() ) {
unset( $tabs['additional_information'] );
}
// === YORUM SAYISI KONTROLÜ ===
if ( isset( $tabs['reviews'] ) ) {
if ( $product->get_review_count() === 0 && ! comments_open() ) {
unset( $tabs['reviews'] );
}
}
// === ÖZEL KARGO SEKMESİ ===
$tabs['kargo'] = array(
'title' => 'Kargo ve Teslimat',
'priority' => 25,
'callback' => 'kargo_sekme_icerik',
);
return $tabs;
}
function kargo_sekme_icerik() {
// Burada WordPress şablonu da include edebilirsiniz
echo '<div class="kargo-bilgisi">';
echo '<h2>Kargo ve Teslimat Bilgileri</h2>';
$kargo_suresi = get_option( 'mağaza_kargo_suresi', '1-3 iş günü' );
echo '<p><strong>Tahmini Teslimat:</strong> ' . esc_html( $kargo_suresi ) . '</p>';
echo '<p><strong>Ücretsiz Kargo:</strong> 150 TL ve üzeri tüm siparişlerde geçerlidir.</p>';
echo '<p><strong>İade:</strong> 14 gün içinde koşulsuz iade hakkı mevcuttur.</p>';
echo '</div>';
}
Yaygın Sorunlar ve Çözümleri
Sekme yönetimi yaparken karşılaşılan bazı tipik sorunlar ve çözümleri şöyledir:
- Tema çakışması: Bazı premium temalar kendi sekme filtrelerini uygular.
prioritydeğerini 98 veya 99 yaparak temanın filtrelerinden sonra çalışmasını sağlayın.
- Cache sorunu: Değişiklikler görünmüyorsa tarayıcı cache ve WordPress cache eklentinizi temizleyin. WP Rocket, W3 Total Cache gibi eklentiler sayfaları önbelleğe alır.
global $productboş geliyor: Bu durum genellikle WooCommerce’nin tam yüklenmediği ortamlarda olur.is_product()kontrolü eklemek güvenli bir yaklaşımdır.
- Eklenti sekmeleri: Üçüncü parti eklentilerin eklediği sekmeleri kaldırmak için o sekmenin array anahtarını
print_r( $tabs )ile tespit edin, ardındanunset()ile kaldırın.
<?php
// Debug için geçici olarak sekme anahtarlarını görüntüle
add_filter( 'woocommerce_product_tabs', 'debug_sekme_anahtarlari', 99 );
function debug_sekme_anahtarlari( $tabs ) {
if ( current_user_can( 'administrator' ) ) {
echo '<pre>';
print_r( array_keys( $tabs ) );
echo '</pre>';
}
return $tabs;
}
Bu kodu test ortamında kullanın, prodüksiyona almayın. Sadece yönetici kullanıcılara gösterdiği için görece güvenlidir ama prodüksiyonda gereksiz kod yükü oluşturur.
Performans Notları
- Sekme filtreleri her ürün sayfası yüklemesinde çalışır. Bu nedenle fonksiyonları mümkün olduğunca basit tutun.
- Veritabanı sorgusu gerektiren işlemlerde
wp_cache_get()vewp_cache_set()kullanmayı düşünün. global $productyerinewc_get_product()kullanımı bazı durumlarda daha güvenlidir ancak ikincisi ekstra veritabanı sorgusu yapabilir.- Kargo bilgisi gibi statik içerikler için callback fonksiyonu içinde veritabanı sorgusu yapmak yerine
get_option()tercih edin.
Sonuç
WooCommerce sekme yönetimi, functions.php üzerinden woocommerce_product_tabs filtresi kullanılarak oldukça esnek bir şekilde yapılabilir. Gizleme, sıralama, başlık değiştirme ve özel sekme ekleme işlemlerinin tamamı aynı filtre üzerinden yürür.
Gerçek projede en çok karşılaşılan ihtiyaçlar şunlardır: gereksiz sekmeleri temizleyerek sayfa görünümünü sadeleştirmek, dijital ürünler için fiziksel özellik sekmelerini kaldırmak ve markaya özgü kargo veya garanti bilgisi sekmeleri eklemek. Tüm bu senaryolar için yukarıdaki örnekler doğrudan kullanılabilir ya da ihtiyaca göre adapte edilebilir.
Child theme kullanımı, isset() kontrolü ve priority değerlerini bilinçli seçmek bu süreçte kaliteli kod yazmanın temel koşullarıdır. Kodu doğrudan prodüksiyon ortamında test etmek yerine staging ortamında deneyip sonra canlıya almak her zaman en güvenli yaklaşımdır.
