HUSKY - Product Filter for WooCommerce

WooCommerce-Filter nach Kategorie liefert keine Ergebnisse: Kategorie-Hierarchie-Fix

Wenn der WooCommerce-Filter nach Kategorie keine Ergebnisse für übergeordnete Kategorien zurückgibt, obwohl Produkte untergeordneten Kategorien zugewiesen sind, hilft Ihnen dieser Leitfaden dabei, das Problem zu beheben.

Das Problem

Symptom:Wenn Sie nach einer übergeordneten Kategorie filtern, werden keine Produkte angezeigt, obwohl Produkte in den untergeordneten Kategorien vorhanden sind.

Beispiel:

  • Kategoriestruktur:Federal Actions > SEC > Enforcement
  • Produkt ist zugeordnet:Enforcement(nur Kinderkategorie)
  • Filtern nachFederal Actions or SECgibt zurück:Keine Ergebnisse
  • Filtern nachEnforcementgibt zurück:Produkt angezeigt

Warum das passiert

WordPress/WooCommercerequires Produkte, die explizit mit gekennzeichnet werden müssenalle übergeordneten Kategorienin der Hierarchie, nicht nur in der untergeordneten Kategorie.

Wenn Sie über die WordPress-Administratoroberfläche ein Produkt einer untergeordneten Kategorie zuweisen, markiert WooCommerce das Produkt nicht automatisch mit allen übergeordneten Kategorien in der Begriffsbeziehungstabelle. Dies ist eine Datenstrukturanforderung und keine HUSKY-Einschränkung.

Die richtige Kategoriezuordnung sollte Folgendes umfassen:

  • Kinderkategorie:Enforcement
  • Übergeordnete Kategorie:SEC
  • Großelternkategorie:Federal Actions

So überprüfen Sie, ob dieses Problem vorliegt

  1. Gehen Sie zu einer Produktbearbeitungsseite:wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit
  2. Sehen Sie sich die Metabox „Kategorien“ auf der rechten Seite an
  3. Überprüfen Sie, oballe übergeordneten Kategorienin der Hierarchie werden überprüft
  4. Wenn nur die untergeordnete Kategorie aktiviert ist →Sie haben dieses Problem

Lösung: Automatische Normalisierung der Kategoriehierarchie

Diese Lösung besteht aus zwei Teilen:

  1. Zukunftssichere Lösung: Übergeordnete Kategorien beim Speichern von Produkten automatisch markieren
  2. Sofortige Lösung: Alle vorhandenen Produkte normalisieren

Teil 1: Übergeordnete Kategorien automatisch markieren (zukünftige Produkte)

Fügen Sie diesen Code zu Ihrem Child-Theme hinzufunctions.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);
        }
    }
}

Was das bewirkt:

  • Wird jedes Mal ausgelöst, wenn ein Produkt gespeichert wird
  • Ruft alle zugewiesenen Kategorien ab
  • Sucht alle übergeordneten Kategorien für jede zugewiesene Kategorie
  • Markiert das Produkt mit der vollständigen Hierarchie
  • Löscht alle relevanten Caches

Ergebnis:Von nun an umfasst jedes gespeicherte Produkt automatisch alle übergeordneten Kategorien.

Teil 2: Vorhandene Produkte normalisieren (einmalige Korrektur)

Dieses Skript repariert alle vorhandenen Produkte in Ihrer Datenbank. Fügen Sie dies hinzutemporaryCode zu Ihremfunctions.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
    ];
}

Anwendung:

  1. Fügen Sie den Code zu Ihrem hinzufunctions.php
  2. Gehen Sie zu:https://yoursite.com/?normalize_cats=1(muss als Admin angemeldet sein)
  3. Warten Sie, bis das Skript abgeschlossen ist
  4. Sie sehen Ergebnisse, die zeigen, wie viele Produkte aktualisiert wurden
  5. Entfernen Sie diesen Codenachdem ich es einmal ausgeführt habe

Erwartete Ausgabe:

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

Dies bedeutet, dass bei 156 von 919 Produkten die übergeordneten Kategorien fehlten und dies behoben wurde.

Testen des Fixes

Nach der Implementierung beider Teile:

  1. Gehen Sie mit HUSKY-Filtern zu Ihrer Shop-Seite
  2. Versuchen Sie, nach a zu filternübergeordnete Kategorie
  3. Jetzt sollten Produkte aus untergeordneten Kategorien angezeigt werden
  4. Versuchen Sie, einen Drilldown durch die Hierarchie durchzuführen – alle Ebenen sollten funktionieren

Warum nicht dies in HUSKY als Standard festlegen?

Das ist eine berechtigte Frage. Hier ist der Grund:

  1. Änderung der Datenstruktur: Dies ändert die Kerndatenbeziehungen von WooCommerce
  2. Nicht universell: Einige Websites weisen absichtlich nur untergeordnete Kategorien für bestimmte Geschäftslogik zu
  3. Leistung: Bei sehr großen Katalogen erhöht sich der Aufwand für jede Produktspeicherung
  4. Konflikte: Kann andere Plugins beeinträchtigen, die Kategoriebeziehungen verwalten

Zukünftige Erweiterung: Wir können dies als hinzufügenoptionale Einstellungin HUSKY, das Benutzer bei Bedarf aktivieren können, es handelt sich jedoch nicht um das Standardverhalten.

Alternative: Manuelle Kategoriezuweisung

Wenn Sie eine manuelle Steuerung bevorzugen, können Sie:

  1. Bearbeiten Sie jedes Produkt
  2. Aktivieren Sie im Metafeld „Kategorien“ das Kontrollkästchenalle relevanten übergeordneten Kategorien manually
  3. Speichern Sie das Produkt

Dies ermöglicht Ihnen eine detaillierte Kontrolle, ist jedoch bei großen Katalogen zeitaufwändig.

Fehlerbehebung

Das Skript zeigt 0 normalisierte Produkte

  • Ihren Produkten sind möglicherweise bereits die richtigen übergeordneten Kategorien zugewiesen
  • Überprüfen Sie einige Produkte manuell, um sie zu verifizieren

Die Filterung funktioniert nach der Normalisierung immer noch nicht

  • Alle Caches löschen (WordPress, Server, Browser)
  • Stellen Sie sicher, dass HUSKY die richtige Taxonomie verwendet (product_cat)
  • Suchen Sie nach Konflikten mit anderen Filter-Plugins
  • Überprüfen Sie, ob die Produkte veröffentlicht sind (keine Entwürfe).

Produkte verschwinden aus dem Filter für untergeordnete Kategorien

Das sollte nicht passieren, aber wenn doch:

  • Das Skript behält alle vorhandenen Kategoriezuweisungen bei
  • Überprüfen Sie, ob ein anderes Plugin stört
  • Stellen Sie die Sicherung wieder her und wenden Sie sich an den Support

Benutzerdefinierte Taxonomien

Diese Lösung funktioniert auch fürbenutzerdefinierte Taxonomienerstellt mit CPT UI oder ähnlichen Plugins. Einfach ändern'product_cat'zu Ihrem benutzerdefinierten Taxonomie-Slug:

// 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');

Wichtige Hinweise

  • Untergeordnetes Thema erforderlich: Verwenden Sie immer ein untergeordnetes Theme, um Codeverlust bei Theme-Updates zu verhindern
  • Zuerst sichern: Sichern Sie Ihre Datenbank, bevor Sie das Normalisierungsskript ausführen
  • Test zur Inszenierung: Wenn möglich, zuerst auf einer Staging-Site testen
  • Einmaliges Skript: Entfernen Sie das Normalisierungsskript, nachdem Sie es ausgeführt haben
  • Behalten Sie Teil 1-Code bei: Dersave_post_productDer Haken sollte dauerhaft bleiben

Zusammenfassung

Dauerhaft zu functions.php hinzufügen:

  • Hook für übergeordnete Kategorien automatisch markieren (Teil 1)

Einmal ausführen und entfernen:

  • Normalisierungsskript (Teil 2)

Erwartete Ergebnisse:

  • Die Filterung der übergeordneten Kategorie funktioniert ordnungsgemäß
  • Die Filterung untergeordneter Kategorien funktioniert weiterhin
  • Der Hierarchie-Drilldown funktioniert ordnungsgemäß
  • Zukünftige Produkte enthalten automatisch übergeordnete Kategorien