HUSKY - Products Filter Professional for WooCommerce

Woocommerce Mağazasında Kategori Hiyerarşisi Filtrelemesini Düzeltme (db'yi normalleştirme)

Ürünler alt kategorilere atanmış olsa bile, üst kategori filtrelemesinin sonuç vermediği sorunlar yaşıyorsanız, bu kılavuz bunu düzeltmenize yardımcı olacaktır.

Sorun

Belirti: Üst kategoriden filtrelendiğinde, alt kategorilerde ürünler olmasına rağmen hiçbir ürün gösterilmez.

Örnek:

  • Kategori yapısı: Federal Actions > SEC > Enforcement
  • Ürün şuna atanmış: Enforcement (sadece alt kategori)
  • Tarafından filtreleme Federal Actions veya SEC döndürür: Sonuç yok
  • Tarafından filtreleme Enforcement döndürür: Gösterilen ürün

Neden Bu Oluyor

WordPress/WooCommerce gerektirir ürünler açıkça işaretlenmelidir tüm üst kategoriler hiyerarşide, yalnızca alt kategori değil.

Bir ürünü WordPress yönetici arayüzü aracılığıyla bir alt kategoriye atadığınızda, WooCommerce ürünü taksonomik ilişkiler tablosunda tüm üst kategorilerle otomatik olarak işaretlemez. Bu bir veri yapısı gereksinimidir, HUSKY sınırlaması değildir.

Doğru kategori ataması şunları içermelidir:

  • Alt kategori: Enforcement
  • Üst kategori: SEC
  • Büyükanne kategorisi: Federal Actions

Bu Sorunu Nasıl Kontrol Edebilirsiniz

  1. Bir ürün düzenleme sayfasına gidin: wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit
  2. Sağ taraftaki Kategoriler metaboksuna bakın
  3. Kontrol et tüm üst kategoriler hiyerarşide kontrol edilir
  4. Yalnızca alt kategori işaretlenirse → Bu sorununuz var

Çözüm: Otomatik Kategori Hiyerarşisi Normalizasyonu

Bu çözüm iki kısımdan oluşur:

  1. Geleceğe dönük düzeltme: Ürünleri kaydederken üst kategorileri otomatik olarak işaretle
  2. Acil düzeltme: Mevcut tüm ürünleri normalleştir

Bölüm 1: Üst Kategorileri Otomatik İşaretleme (Gelecek Ürünler)

Bu kodu çocuğunuzun temanın functions.php:

/**
 * Automatically mark all parent categories when product is saved
 * This ensures hierarchy filtering works correctly
 */
add_action('save_post_product', 'auto_mark_parent_categories', 10, 1);

function auto_mark_parent_categories($product_id) {
    // Clear cache
    clean_object_term_cache($product_id, 'product_cat');

    // Get currently assigned categories
    $terms = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'ids']);

    if (!is_wp_error($terms) AND !empty($terms)) {
        $all_terms = [];

        // For each assigned category, get all its parents
        foreach ($terms as $term_id) {
            $all_terms[] = $term_id;

            // Get all ancestor categories
            $ancestors = get_ancestors($term_id, 'product_cat', 'taxonomy');
            if (!empty($ancestors)) {
                $all_terms = array_merge($all_terms, $ancestors);
            }
        }

        // Assign product to all categories including parents
        wp_set_object_terms($product_id, array_unique($all_terms), 'product_cat');

        // Clear caches
        clean_post_cache($product_id);
        clean_object_term_cache($product_id, 'product_cat');

        if (function_exists('wc_delete_product_transients')) {
            wc_delete_product_transients($product_id);
        }
    }
}

Bunun yaptığı:

  • Bir ürün kaydedildiğinde her tetiklenir
  • Atanan tüm kategorileri alır
  • Atanan her kategori için tüm üst kategorileri bulur
  • Ürünü tam hiyerarşiyle işaretler
  • İlgili tüm önbellekleri temizler

Sonuç: Bundan böyle, kaydedilen her ürün otomatik olarak tüm üst kategorileri içerecektir.

Bölüm 2: Mevcut Ürünleri Normalleştir (Tek Seferlik Düzeltme)

Bu komut, veritabanınızdaki tüm mevcut ürünleri düzeltecektir. Bunu ekleyin geçici kodunuza functions.php:

/**
 * One-time script to normalize all existing products
 * Access: yourdomain.com/?normalize_cats=1 (must be logged in as admin)
 */
add_action('init', function () {
    if (isset($_GET['normalize_cats']) AND current_user_can('manage_options')) {
        $result = normalize_all_products_categories();
        echo '<h2>Category Normalization Results</h2>';
        echo '<pre>';
        print_r($result);
        echo '</pre>';
        die();
    }
});

function normalize_all_products_categories() {
    global $wpdb;

    // Get all product IDs
    $args = [
        'post_type' => 'product',
        'post_status' => 'any',
        'posts_per_page' => -1,
        'fields' => 'ids'
    ];

    $product_ids = get_posts($args);
    $log = [];
    $normalized_count = 0;

    foreach ($product_ids as $product_id) {
        // Get current categories
        $terms = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'ids']);

        if (!is_wp_error($terms) AND !empty($terms)) {
            $all_terms = [];

            // Collect all parent categories
            foreach ($terms as $term_id) {
                $all_terms[] = $term_id;

                // Get ancestors
                $ancestors = get_ancestors($term_id, 'product_cat', 'taxonomy');

                if (!empty($ancestors)) {
                    $all_terms = array_merge($all_terms, $ancestors);
                }
            }

            $all_terms = array_unique($all_terms);

            // Only update if we're adding new parent categories
            if (count($all_terms) > count($terms)) {
                wp_set_object_terms($product_id, $all_terms, 'product_cat');
                $normalized_count++;
                $log[] = "Product #{$product_id}: added " . (count($all_terms) - count($terms)) . " parent categories";
            }
        }
    }

    // Log to WordPress error log
    error_log("=== Category Normalization Complete ===");
    error_log(implode("\n", $log));
    error_log("Total normalized: {$normalized_count} products");

    return [
        'success' => true,
        'normalized' => $normalized_count,
        'total' => count($product_ids),
        'details' => $log
    ];
}

Nasıl kullanılır:

  1. Kodu şuraya ekleyin functions.php
  2. Git: https://yoursite.com/?normalize_cats=1 (yönetici olarak oturum açılmalı)
  3. Komut dosyasının tamamlanmasını bekle
  4. Kaç ürünün güncellendiğini gösteren sonuçlar göreceksiniz
  5. Bu kodu kaldırın bir kez çalıştırdıktan sonra

Beklenen çıktı:

Category Normalization Results
Array
(
    [success] => 1
    [normalized] => 156
    [total] => 919
)

Bu, 919 ürünün 156'sının üst kategorilerinin eksik olduğu ve düzeltildiği anlamına gelir.

Düzeltmeyi Test Etme

Her iki bölümü de uyguladıktan sonra:

  1. HUSKY filtreli mağaza sayfanıza gidin
  2. Bir ile filtrelemeyi dene üst kategori
  3. Çocuk kategorilerdeki ürünler artık görünmelidir
  4. Hiyerarşide aşağı doğru inmeye çalışın – tüm seviyeler çalışmalı

Bunu HUSKY'de Varsayılan Yapmaya Ne Dersiniz?

Bu meşru bir sorudur. İşte nedeni:

  1. Veri Yapısı Değişikliği: Bu, temel WooCommerce veri ilişkilerini değiştirir
  2. Evrensel Değil: Bazı siteler belirli iş mantığı için kasıtlı olarak yalnızca alt kategorileri atar
  3. Performans: Çok büyük kataloglarda, bu her ürün kaydına ek yük getirir
  4. Çakışmalar: Kategori ilişkilerini yöneten diğer eklentilerle çakışabilir

Gelecek Geliştirme: Bunu bir isteğe bağlı ayar HUSKY'de kullanıcıların gerekirse etkinleştirebileceği, ancak varsayılan davranış olmayacak şekilde.

Alternatif: Manuel Kategori Atama

Manuel kontrolü tercih ederseniz şunları yapabilirsiniz:

  1. Her ürünü düzenleyin
  2. Kategoriler metabox'ında, kontrol edin ilgili tüm üst kategoriler manuel olarak
  3. Ürünü kaydet

Bu, büyük kataloglar için zaman alıcıdır ancak ayrıntılı kontrol sağlar.

Sorun Giderme

Script 0 normalize edilmiş ürün gösteriyor

  • Ürünlerinizde zaten doğru üst kategoriler atanmış olabilir
  • Doğrulamak için birkaç ürünü manuel olarak kontrol edin

Normalleştirmeden sonra filtreleme hala çalışmıyor

  • Tüm önbellekleri temizleyin (WordPress, sunucu, tarayıcı)
  • HUSKY'nin doğru taksonomiyi kullandığından emin olun (product_cat)
  • Diğer filtre eklentileriyle çakışmaları kontrol edin
  • Ürünlerin yayınlandığından (taslak değil) emin olun

Ürünler alt kategori filtresinden kaybolur

Bu olmamalıdır, ancak olursa:

  • Betik, mevcut tüm kategori atamalarını korur
  • Başka bir eklentinin çakışıp çakışmadığını kontrol edin
  • Yedekten geri yükleyin ve destekle iletişime geçin

Özel Taksonomiler

Bu çözüm şunlar için de çalışır: özel taksonomiler CPT UI veya benzeri eklentilerle oluşturuldu. Basitçe değiştirin 'product_cat' özel taksonomi slug'unuza:

// Example for custom taxonomy 'modality'
$terms = wp_get_post_terms($product_id, 'modality', ['fields' => 'ids']);
wp_set_object_terms($product_id, array_unique($all_terms), 'modality');

Önemli Notlar

  • Çocuk Tema Gerekli: Tema güncellemeleri sırasında kod kaybını önlemek için daima bir alt tema kullanın
  • Önce Yedekleyin: Normalleştirme betiğini çalıştırmadan önce veritabanınızı yedekleyin
  • Staging'de Test Edin: Mümkünse önce bir staging sitesinde test edin
  • Tek Seferlik Betik: Normalleştirme betiğini çalıştırdıktan sonra kaldırın
  • Bölüm 1 Kodunu Sakla: save_post_product kanca kalıcı olarak kalmalı

Özet

functions.php dosyasına kalıcı olarak ekleyin:

  • Üst kategorileri otomatik işaretleme kancası (Bölüm 1)

Bir kez çalıştır ve kaldır:

  • Normalleştirme betiği (Bölüm 2)

Beklenen sonuçlar:

  • Üst kategori filtrelemesi doğru çalışıyor
  • Alt kategori filtreleme çalışmaya devam ediyor
  • Hiyerarşi açılır fonksiyonları düzgün çalışıyor
  • Gelecekteki ürünler otomatik olarak üst kategorileri dahil eder