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 ActionsoderSECgibt zurück: Keine Ergebnisse - Filtern nach
Enforcementgibt 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
- Gehe zur Produktbearbeitungsseite:
wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit - Schauen Sie sich die Kategorie-Metabox auf der rechten Seite an.
- Überprüfen Sie, ob alle Oberkategorien in der Hierarchie sind angekreuzt
- 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:
- Zukunftsfähige Fehlerbehebung: Übergeordnete Kategorien beim Speichern von Produkten automatisch markieren
- 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:
- Fügen Sie den Code zu Ihrem hinzu
functions.php - Gehen Sie zu:
https://yoursite.com/?normalize_cats=1(muss als Administrator angemeldet sein) - Warten Sie, bis das Skript abgeschlossen ist
- Sie sehen Ergebnisse, die zeigen, wie viele Produkte aktualisiert wurden
- 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:
- Gehen Sie zu Ihrer Shop-Seite mit HUSKY-Filtern
- Versuchen Sie, nach einem zu filtern übergeordnete Kategorie
- Produkte aus untergeordneten Kategorien sollten jetzt erscheinen
- 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:
- Änderung der Datenstruktur: Dies modifiziert Kern-WooCommerce-Datenbeziehungen.
- Nicht universell: Einige Websites weisen absichtlich nur Unterkategorien für bestimmte Geschäftslogik zu
- Leistung: Bei sehr großen Katalogen verursacht dies zusätzlichen Aufwand für jeden Produkt-Speichervorgang.
- 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:
- Jedes Produkt bearbeiten
- Im Metabox Kategorien, aktivieren Sie alle relevanten Oberkategorien manuell
- 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_productHook 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