HUSKY - Products Filter Professional for WooCommerce

So beheben Sie die Filterung der Kategoriehierarchie im woocommerce-Shop (Datenbank normalisieren)

Wenn Sie Probleme haben, bei denen die Filterung nach übergeordneten Kategorien keine Ergebnisse liefert, obwohl Produkte Kindkategorien zugeordnet sind, hilft Ihnen diese Anleitung bei der Behebung.

Das Problem

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

Beispiel:

  • Kategorienstruktur: Federal Actions > SEC > Enforcement
  • Produkt ist zugewiesen zu: Enforcement (nur Unterkategorie)
  • Filtern nach Federal Actions oder SEC gibt zurück: Keine Ergebnisse
  • Filtern nach Enforcement gibt zurück: Produkt angezeigt

Warum das passiert

WordPress/WooCommerce erfordert Produkte, die explizit mit alle Oberkategorien in der Hierarchie, nicht nur die Unterkategorie.

Wenn Sie ein Produkt über die WordPress-Admin-Oberfläche einer Unterkategorie zuweisen, markiert WooCommerce das Produkt nicht automatisch mit allen Oberkategorien in der Term-Beziehungstabelle. Dies ist eine Anforderung der Datenstruktur, keine HUSKY-Einschränkung.

Die korrekte Kategorienzuweisung sollte enthalten:

  • Unterkategorie: Enforcement
  • Elternkategorie: SEC
  • Großelternkategorie: Federal Actions

So überprüfen Sie, ob Sie dieses Problem haben

  1. Gehe zur Produktbearbeitungsseite: wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit
  2. Schauen Sie sich die Kategorie-Metabox auf der rechten Seite an.
  3. Überprüfen Sie, ob alle Oberkategorien in der Hierarchie sind angekreuzt
  4. Wenn nur die Kind-Kategorie ausgewählt ist → Sie haben dieses Problem

Lösung: Automatische Normalisierung der Kategorienhierarchie

Diese Lösung besteht aus zwei Teilen:

  1. Zukunftsfähige Fehlerbehebung: Übergeordnete Kategorien beim Speichern von Produkten automatisch markieren
  2. Sofortige Fehlerbehebung: Alle vorhandenen Produkte normalisieren

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

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

Was dies bewirkt:

  • Wird jedes Mal ausgelöst, wenn ein Produkt gespeichert wird
  • Ruft alle zugewiesenen Kategorien ab
  • Findet 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 enthält jedes gespeicherte Produkt automatisch alle übergeordneten Kategorien.

Teil 2: Vorhandene Produkte normalisieren (Einmalige Korrektur)

Dieses Skript wird alle vorhandenen Produkte in Ihrer Datenbank reparieren. Fügen Sie dies hinzu temporär Code in Ihr 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
    ];
}

Verwendung:

  1. Fügen Sie den Code zu Ihrem hinzu functions.php
  2. Gehen Sie zu: https://yoursite.com/?normalize_cats=1 (muss als Administrator angemeldet sein)
  3. Warten Sie, bis das Skript abgeschlossen ist
  4. Sie sehen Ergebnisse, die zeigen, wie viele Produkte aktualisiert wurden
  5. Diesen Code entfernen nach einmaliger Ausführung

Erwartete Ausgabe:

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

Dies bedeutet, dass 156 Produkte von 919 übergeordnete Kategorien fehlten und behoben wurden.

Testen der Korrektur

Nach der Implementierung beider Teile:

  1. Gehen Sie zu Ihrer Shop-Seite mit HUSKY-Filtern
  2. Versuchen Sie, nach einem zu filtern übergeordnete Kategorie
  3. Produkte aus untergeordneten Kategorien sollten jetzt erscheinen
  4. Versuchen Sie, die Hierarchie zu durchlaufen – alle Ebenen sollten funktionieren

Warum das nicht standardmäßig in HUSKY machen?

Dies ist eine berechtigte Frage. Hier ist warum:

  1. Änderung der Datenstruktur: Dies modifiziert Kern-WooCommerce-Datenbeziehungen.
  2. Nicht universell: Einige Websites weisen absichtlich nur Unterkategorien für bestimmte Geschäftslogik zu
  3. Leistung: Bei sehr großen Katalogen verursacht dies zusätzlichen Aufwand für jeden Produkt-Speichervorgang.
  4. Konflikte: Kann mit anderen Plugins, die Kategorienbeziehungen verwalten, in Konflikt geraten

Zukünftige Erweiterung: Dies könnten wir als eine optionale Einstellung in HUSKY, die Benutzer aktivieren können, wenn sie benötigt werden, aber es wird kein Standardverhalten sein.

Alternative: Manuelle Kategoriezuweisung

Wenn Sie manuelle Kontrolle bevorzugen, können Sie:

  1. Jedes Produkt bearbeiten
  2. Im Metabox Kategorien, aktivieren Sie alle relevanten Oberkategorien manuell
  3. Produkt speichern

Dies gibt Ihnen eine detaillierte Kontrolle, ist aber für große Kataloge zeitaufwändig.

Fehlerbehebung

Skript zeigt 0 normalisierte Produkte an

  • Ihre Produkte haben möglicherweise bereits die richtigen übergeordneten Kategorien zugewiesen
  • Überprüfen Sie manuell einige Produkte zur Verifizierung

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)
  • Auf Konflikte mit anderen Filter-Plugins prüfen
  • Überprüfen Sie, ob Produkte veröffentlicht sind (nicht Entwurf)

Produkte verschwinden aus dem Child-Kategorie-Filter

Das sollte nicht passieren, aber wenn es doch passiert:

  • Das Skript behält alle vorhandenen Kategoriezuweisungen bei.
  • Prüfen Sie, ob ein anderes Plugin stört
  • Aus Sicherung wiederherstellen und den Support kontaktieren

Benutzerdefinierte Taxonomien

Diese Lösung funktioniert auch für benutzerdefinierte Taxonomien erstellt mit CPT UI oder ähnlichen Plugins. Ändern Sie einfach '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

  • Child Theme erforderlich: Verwende immer ein Child-Theme, um Codeverlust bei Theme-Updates zu vermeiden
  • Erst sichern: Sichern Sie Ihre Datenbank, bevor Sie das Normalisierungsskript ausführen
  • Auf Staging testen: Testen Sie nach Möglichkeit zuerst auf einer Staging-Website.
  • Einmaliges Skript: Entfernen Sie das Normalisierungsskript nach der Ausführung
  • Teil 1 Code beibehalten: Das save_post_product Hook sollte dauerhaft bleiben

Zusammenfassung

Permanent zu functions.php hinzufügen:

  • Hook für automatische Markierung von übergeordneten Kategorien (Teil 1)

Einmal ausführen und entfernen:

  • Normalisierungsskript (Teil 2)

Erwartete Ergebnisse:

  • Elter-Kategorie-Filterung funktioniert korrekt
  • Filterung von Unterkategorien funktioniert weiterhin
  • Hierarchie-Drilldown funktioniert ordnungsgemäß
  • Zukünftige Produkte schließen automatisch übergeordnete Kategorien ein