HUSKY - Product Filter for WooCommerce

Kategori Başına Farklı WooCommerce Filtreleri Gösterme (Dinamik Filtreleme)

Farklı ürün kategorilerine göre farklı filtre setlerinin nasıl görüntüleneceğini, bağımlı filtreleme oluşturmayı ve WooCommerce Mağaza sayfası için filtreleri nasıl özelleştireceğinizi öğrenin.

Sorun

Varsayılan olarak WOOF, tüm sayfalarda aynı filtreleri gösterir. Ancak farklı ürün kategorileri genellikle farklı filtre seçeneklerine ihtiyaç duyar:

Örnek senaryolar:

  • Elektronik kategorisi: Marka, Ekran Boyutu, Depolama, RAM göster
  • Giyim kategorisi: Beden, Renk, Malzeme, Tarz göster
  • Mobilya kategorisi: Malzeme, Renk, Boyutlar, Oda Tipi göster
  • Mağaza sayfası (ana arşiv): Yalnızca Kategoriler, Fiyat Aralığı, Öne çıkan markalar göster

Mevcut sınırlama: Kullanıcı bir kategori seçtikten sonra bile tüm filtre seçenekleri global kalır ve arayüz ilgisiz filtrelerle karmaşık hale gelir.

Öğrenecekleriniz:

  1. Bağımlı/koşullu filtreleme nasıl etkinleştirilir (filtreler seçime göre güncellenir)
  2. Ürün kategorisine göre farklı filtreler nasıl gösterilir
  3. Mağaza sayfası için özel filtre setleri nasıl oluşturulur
  4. Gelişmiş görünürlük kontrolü için Widget Logic nasıl kullanılır

 

Çözüm 1: Bağımlı Filtrelemeyi Etkinleştirme (AJAX Yeniden Çizimi)

İlk adım, kullanıcı seçim yaptığında filtreleri dinamik olarak güncelleyen AJAX form yeniden çizimini etkinleştirmektir.

Widget’lar İçin:

  1. Görünüm → Widget’lar bölümüne gidin
  2. WOOF widget’ınızı bulun
  3. “Form AJAX yeniden çizimi” seçeneğini etkinleştirin

Bu, filtrelerin her seçimden sonra otomatik olarak güncellenmesini ve yalnızca ilgili seçeneklerin gösterilmesini sağlar.

Shortcode’lar İçin:

WOOF shortcode’unuza ajax_redraw niteliğini ekleyin:

[woof ajax_redraw="1"]

Bunun yaptığı:

  • Kullanıcı “Tekerlek” seçtiğinde → diğer filtreler otomatik olarak güncellenir
  • Yalnızca Tekerlek için mevcut olan Alt Türler, Malzemeler, Renkler gösterilir
  • İlgisiz seçenekleri gizleyerek karmaşıklığı azaltır

Dokümantasyon: https://products-filter.com/shortcode/woof

 

Çözüm 2: Kategori Bazlı Filtre Görünürlüğü (Özel Shortcode)

Bu çözüm, geçerli ürün kategorisine bağlı olarak farklı filtreler görüntüleyen dinamik bir shortcode oluşturur.

 

Adım 1: Özel Shortcode Oluşturun

Bu kodu alt tema’nızın functions.php dosyasına ekleyin:

/**
 * Dynamic WOOF shortcode that shows different filters per category
 * Usage: [woof_dynamic]
 */
add_shortcode('woof_dynamic', function () {
    // Check if WOOF is active
    if (!function_exists('woof_shortcode')) {
        return '<!-- WOOF plugin not active -->';
    }

    // Get current category
    $term = get_queried_object();

    // Check if we're on a product category page
    if (!$term || !isset($term->taxonomy) || $term->taxonomy !== 'product_cat') {
        return do_shortcode('[woof]'); // Show default filters
    }

    // Get category slug
    $cat = strtolower($term->slug);

    // Define which filters to show for each category
    $filters_map = [
        'wheel' => ['pa_sub-type', 'pa_material', 'pa_colour', 'pa_size'],
        'lingerie' => ['pa_size', 'pa_colour', 'pa_material'],
        'massage-candles' => ['pa_type', 'pa_material', 'pa_brand'],
        'electronics' => ['pa_brand', 'pa_screen-size', 'pa_storage'],
        'clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_style'],
        'furniture' => ['pa_material', 'pa_color', 'pa_dimensions', 'pa_room'],
    ];

    // If category not in map, show default filters
    if (!isset($filters_map[$cat])) {
        return do_shortcode('[woof]');
    }

    // Build shortcode with specific filters for this category
    $taxonomies = implode(',', $filters_map[$cat]);

    return do_shortcode('[woof tax_only="' . esc_attr($taxonomies) . '" ajax_redraw="1"]');
});

 

Adım 2: Shortcode’u Kullanın

Mevcut [woof] shortcode’unuzu aşağıdakiyle değiştirin:

[woof_dynamic]

Bu shortcode’u şuraya yerleştirin:

  • Widget alanları (Metin/HTML widget’ı)
  • Sayfa oluşturucu blokları (Elementor, Divi vb.)
  • Tema şablon dosyaları: <?php echo do_shortcode('[woof_dynamic]'); ?>

 

Adım 3: Kategorilerinizi Yapılandırın

$filters_map dizisini kendi gerçek değerlerinizle güncelleyin:

  • Kategori slug’ları (ör. ‘tekerlek’, ‘elektronik’)
  • Nitelik slug’ları (ör. ‘pa_marka’, ‘pa_beden’)

Slug’larınızı bulma:

Kategori slug’ları:

  • Ürünler → Kategoriler bölümüne gidin
  • Bir kategori adının üzerine gelin
  • URL’ye bakın: ...tag_ID=123&taxonomy=product_cat&post_type=product
  • Veya kategoriyi düzenleyip slug alanına bakın

Nitelik slug’ları:

  • Ürünler → Nitelikler bölümüne gidin
  • Bunlar pa_ ile başlar ve ardından nitelik adı gelir
  • Örnekler: pa_color, pa_size, pa_brand, pa_material

 

Çözüm 3: Mağaza Sayfası için Özel Filtreler

Ana WooCommerce Mağaza sayfası, bir kategori arşivi olmadığından farklı bir işlem gerektirir.

Birleşik Çözüm: Mağaza Sayfası + Kategori Sayfaları

Bu kod, hem Mağaza sayfasını hem de bireysel kategori sayfalarını işler:

/**
 * Dynamic WOOF shortcode with Shop page support
 * Shows minimal filters on Shop, full filters on categories
 */
add_shortcode('woof_dynamic', function () {
    if (!function_exists('woof_shortcode')) {
        return '';
    }

    // Shop page (main product archive) - show minimal filters
    if (is_shop() AND !is_product_category() AND !is_product_tag()) {
        return do_shortcode('[woof tax_only="product_cat,pa_colour" by_price="1" ajax_redraw="1"]');
    }

    // Product category pages - show category-specific filters
    $term = get_queried_object();
    if ($term AND isset($term->taxonomy) AND $term->taxonomy === 'product_cat') {
        $cat = strtolower($term->slug);

        // Define filters for each category
        $filters_map = [
            'wheel' => ['pa_sub-type', 'pa_material', 'pa_colour', 'pa_size'],
            'lingerie' => ['pa_size', 'pa_colour', 'pa_material'],
            'massage-candles' => ['pa_type', 'pa_material', 'pa_brand'],
            'electronics' => ['pa_brand', 'pa_screen-size', 'pa_storage'],
            'clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_style'],
        ];

        if (isset($filters_map[$cat])) {
            $taxonomies = implode(',', $filters_map[$cat]);
            return do_shortcode('[woof tax_only="' . esc_attr($taxonomies) . '" ajax_redraw="1"]');
        }
    }

    // Fallback - show all filters
    return do_shortcode('[woof ajax_redraw="1"]');
});

Bu kodun yaptığı:

  1. Mağaza sayfasında: Yalnızca Kategoriler, Renk ve Fiyat filtrelerini gösterir
  2. Kategori sayfalarında: Eşlemeden kategoriye özgü filtreleri gösterir
  3. Diğer sayfalarda: Varsayılan filtreleri gösterir

Mağaza sayfası filtrelerini özelleştirin: Mağaza sayfasında farklı filtreler göstermek için bu satırı değiştirin:

[woof tax_only="product_cat,pa_colour" by_price="1" ajax_redraw="1"]

Kullanılabilir parametreler:

  • tax_only="product_cat,pa_brand" – Yalnızca bu taksonomileri göster
  • by_price="1" – Fiyat aralığı filtresini göster
  • by_only="product_cat,pa_brand" – tax_only alternatifi
  • ajax_redraw="1" – Dinamik güncellemeleri etkinleştir

 

Çözüm 4: Koşullu Görünürlük için Widget Logic

Shortcode yerine widget kullanmayı tercih ediyorsanız, koşullu mantıkla widget görünürlüğünü kontrol edebilirsiniz.

Adım 1: Widget Logic Eklentisini Yükleyin

Bu eklentilerden birini seçin:

 

Adım 2: Birden Fazla WOOF Widget’ı Oluşturun

  1. Görünüm → Widget’lar bölümüne gidin
  2. Kenar çubuğunuza birden fazla WOOF widget’ı ekleyin
  3. Her widget’ı farklı filtrelerle yapılandırın

Adım 3: Koşullu Mantık Ekleyin

Her widget için görünürlük koşulları ekleyin:

Yalnızca Tekerlek kategorisinde göster:

is_product_category('wheel')

Yalnızca İç Giyim kategorisinde göster:

is_product_category('lingerie')

Yalnızca Mağaza sayfasında göster:

is_shop() AND !is_product_category()

Birden fazla kategoride göster:

is_product_category(array('wheel', 'lingerie', 'massage-candles'))

Mağaza sayfası hariç her yerde göster:

!is_shop()

Elektronik veya Bilgisayar kategorilerinde göster:

is_product_category('electronics') || is_product_category('computers')

Gerçek Dünya Örnekleri

Örnek 1: Yetişkin Ürünleri Mağazası

$filters_map = [
    'wheel' => ['pa_type', 'pa_material', 'pa_color', 'pa_power-source', 'pa_waterproof'],
    'lingerie' => ['pa_size', 'pa_color', 'pa_style', 'pa_material'],
    'oil' => ['pa_type', 'pa_brand', 'pa_ingredients', 'pa_volume'],
    'toys' => ['pa_category', 'pa_material', 'pa_size', 'pa_color'],
];

 

Örnek 2: Elektronik Mağazası

$filters_map = [
    'laptops' => ['pa_brand', 'pa_processor', 'pa_ram', 'pa_storage', 'pa_screen-size'],
    'smartphones' => ['pa_brand', 'pa_storage', 'pa_ram', 'pa_camera', 'pa_battery'],
    'headphones' => ['pa_brand', 'pa_type', 'pa_connection', 'pa_noise-cancelling'],
    'cameras' => ['pa_brand', 'pa_megapixels', 'pa_sensor-size', 'pa_video-quality'],
];

 

Örnek 3: Moda Mağazası

$filters_map = [
    'mens-clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_brand', 'pa_style'],
    'womens-clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_brand', 'pa_occasion'],
    'shoes' => ['pa_size', 'pa_color', 'pa_brand', 'pa_type', 'pa_material'],
    'accessories' => ['pa_color', 'pa_material', 'pa_brand', 'pa_type'],
];

 

Örnek 4: Mobilya Mağazası

$filters_map = [
    'bedroom' => ['pa_type', 'pa_material', 'pa_color', 'pa_style', 'pa_size'],
    'living-room' => ['pa_type', 'pa_material', 'pa_color', 'pa_seating-capacity'],
    'office' => ['pa_type', 'pa_material', 'pa_color', 'pa_ergonomic'],
    'outdoor' => ['pa_type', 'pa_material', 'pa_weather-resistant', 'pa_color'],
];

 

Gelişmiş: Fiyat ve Kategorileri Dahil Etme

Niteliklere ek olarak fiyat aralığı ve kategorileri göstermek istiyorsanız:

// On category pages, add price and allow category drill-down
if (isset($filters_map[$cat])) {
    $taxonomies = implode(',', $filters_map[$cat]);
    return do_shortcode('[woof tax_only="product_cat,' . esc_attr($taxonomies) . '" by_price="1" ajax_redraw="1"]');
}

Parametre açıklaması:

  • product_cat – Detaylandırma için kategori filtresini gösterir
  • by_price="1" – Fiyat aralığı kaydırıcısını gösterir
  • ajax_redraw="1" – Filtreleri dinamik olarak günceller

Sorun Giderme

Filtreler dinamik olarak güncellenmiyor

Sorun: Seçimden sonra filtreler statik kalıyor
Çözüm:

  • Shortcode’unuzda ajax_redraw="1" olduğundan emin olun
  • Widget ayarlarında “Form AJAX yeniden çizimi”ni etkinleştirin
  • Hatalar için JavaScript konsolunu kontrol edin

Kategoride yanlış filtreler görünüyor

Sorun: Kategori yanlış filtre setini gösteriyor
Çözüm:

  • Kategori slug’ının doğru olduğunu doğrulayın (URL veya kategori ayarlarını kontrol edin)
  • $filters_map dizisinde küçük harf kullanın
  • Kategorinin eşlemenizde olup olmadığını kontrol edin

Filtreler hiç görünmüyor

Sorun: Sayfada filtre görünmüyor
Çözüm:

  • Nitelik slug’larının pa_ ile başladığını doğrulayın (ör. pa_color, color değil)
  • Niteliklerin o kategorideki ürünlere atanıp atanmadığını kontrol edin
  • Temel shortcode’un çalışıp çalışmadığını görmek için geçici olarak [woof] kullanın

Mağaza sayfası kategori filtrelerini gösteriyor

Sorun: Mağaza sayfası yanlış filtre setini gösteriyor
Çözüm:

  • Kodunuzda is_shop() koşulunun ilk sırada olduğunu doğrulayın
  • !is_product_category() ifadesinin dahil edildiğini kontrol edin
  • Tüm önbellekleri temizleyin (WordPress, sunucu, tarayıcı)

Nitelik slug’ları çalışmıyor

Sorun: Belirli nitelikler için filtreler görünmüyor
Çözüm:

  • Doğru slug’ları bulmak için Ürünler → Nitelikler bölümüne gidin
  • pa_ ön ekini kullanmayı unutmayın (WooCommerce gereksinimi)
  • Yazımı kontrol edin: pa_colour vs pa_color

Kod eklendikten sonra çalışmıyor

Sorun: Kod eklendikten sonra beyaz ekran veya hatalar
Çözüm:

  • Hata günlüğünde PHP sözdizimi hatalarını kontrol edin
  • Alt tema’nın functions.php dosyasını düzenlediğinizden emin olun
  • Tüm parantez ve tırnak işaretlerinin kapatıldığını doğrulayın
  • Kodu kaldırın ve satır satır geri ekleyin

Performans Değerlendirmeleri

AJAX yeniden çizim etkisi:

  • Her seçim bir AJAX isteğini tetikler
  • Daha fazla ürün = daha uzun yanıt süresi
  • Çözüm: Önbelleğe alma kullanın ve veritabanını optimize edin

Birden fazla widget vs. shortcode:

  • Widget’lar: Daha fazla bellek kullanımı (tüm widget’lar yüklenir)
  • Shortcode: Daha verimli (yalnızca bir set yüklenir)
  • Öneri: Shortcode yaklaşımını kullanın

Büyük kataloglar:

  • Filtrelerde sayfalandırmayı değerlendirin
  • Nitelikler için tembel yükleme kullanın
  • Sunucu tarafı önbelleğe alma uygulayın

Alternatif Yaklaşımlar

Birden Fazla Shortcode Kullanma

Tek bir dinamik shortcode yerine birden fazla statik shortcode kullanın:

// On wheel category page
[woof tax_only="pa_sub-type,pa_material,pa_colour,pa_size" ajax_redraw="1"]

// On Lingerie category page
[woof tax_only="pa_size,pa_colour,pa_material" ajax_redraw="1"]

// On Shop page
[woof tax_only="product_cat,pa_colour" by_price="1" ajax_redraw="1"]

Ardından, her sayfada doğru shortcode’u göstermek için Widget Logic kullanın.

Şablon Dosyalarını Kullanma

Doğrudan tema şablonunuza koşullu mantık ekleyin:

<?php
if (is_product_category('books')) {
    echo do_shortcode('[woof tax_only="pa_sub-type,pa_material,pa_colour,pa_size"]');
} elseif (is_product_category('lingerie')) {
    echo do_shortcode('[woof tax_only="pa_size,pa_colour,pa_material"]');
} elseif (is_shop()) {
    echo do_shortcode('[woof tax_only="product_cat,pa_colour" by_price="1"]');
} else {
    echo do_shortcode('[woof]');
}
?>

Özet

Sorun: Her yerde aynı filtreler görünür, arayüz karmaşıklaşır

Çözüm 1: Bağımlı filtreleme için AJAX yeniden çizimini etkinleştirin

Çözüm 2: Kategori eşlemesi ile [woof_dynamic] shortcode’u oluşturun

Çözüm 3: Minimum filtrelerle Mağaza sayfası işlemesi ekleyin

Çözüm 4: Gelişmiş görünürlük kontrolü için Widget Logic kullanın

En İyi Yaklaşım: Kapsamlı dinamik filtreleme için Çözüm 2 + 3’ü birleştirin

Anahtar Kod:

add_shortcode('woof_dynamic', function() {
    // Shop page logic
    if (is_shop() AND !is_product_category()) {
        return do_shortcode('[woof tax_only="product_cat" by_price="1"]');
    }
    
    // Category mapping
    $term = get_queried_object();
    if ($term AND $term->taxonomy === 'product_cat') {
        $filters_map = [
            'category-slug' => ['pa_attribute1', 'pa_attribute2'],
        ];
        // Return category-specific filters
    }
    
    return do_shortcode('[woof]'); // Fallback
});

Bu, her ürün kategorisine göre uyarlanmış profesyonel ve kullanıcı dostu bir filtreleme deneyimi oluşturur.