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 nach
Federal ActionsorSECgibt zurück:Keine Ergebnisse - Filtern nach
Enforcementgibt 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
- Gehen Sie zu einer Produktbearbeitungsseite:
wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit - Sehen Sie sich die Metabox „Kategorien“ auf der rechten Seite an
- Überprüfen Sie, oballe übergeordneten Kategorienin der Hierarchie werden überprüft
- Wenn nur die untergeordnete Kategorie aktiviert ist →Sie haben dieses Problem
Lösung: Automatische Normalisierung der Kategoriehierarchie
Diese Lösung besteht aus zwei Teilen:
- Zukunftssichere Lösung: Übergeordnete Kategorien beim Speichern von Produkten automatisch markieren
- 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:
- Fügen Sie den Code zu Ihrem hinzu
functions.php - Gehen Sie zu:
https://yoursite.com/?normalize_cats=1(muss als Admin angemeldet sein) - Warten Sie, bis das Skript abgeschlossen ist
- Sie sehen Ergebnisse, die zeigen, wie viele Produkte aktualisiert wurden
- 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:
- Gehen Sie mit HUSKY-Filtern zu Ihrer Shop-Seite
- Versuchen Sie, nach a zu filternübergeordnete Kategorie
- Jetzt sollten Produkte aus untergeordneten Kategorien angezeigt werden
- 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:
- Änderung der Datenstruktur: Dies ändert die Kerndatenbeziehungen von WooCommerce
- Nicht universell: Einige Websites weisen absichtlich nur untergeordnete Kategorien für bestimmte Geschäftslogik zu
- Leistung: Bei sehr großen Katalogen erhöht sich der Aufwand für jede Produktspeicherung
- 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:
- Bearbeiten Sie jedes Produkt
- Aktivieren Sie im Metafeld „Kategorien“ das Kontrollkästchenalle relevanten übergeordneten Kategorien manually
- 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: Der
save_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