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 ActionsveyaSECdöndürür: Sonuç yok - Tarafından filtreleme
Enforcementdö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
- Bir ürün düzenleme sayfasına gidin:
wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit - Sağ taraftaki Kategoriler metaboksuna bakın
- Kontrol et tüm üst kategoriler hiyerarşide kontrol edilir
- 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:
- Geleceğe dönük düzeltme: Ürünleri kaydederken üst kategorileri otomatik olarak işaretle
- 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:
- Kodu şuraya ekleyin
functions.php - Git:
https://yoursite.com/?normalize_cats=1(yönetici olarak oturum açılmalı) - Komut dosyasının tamamlanmasını bekle
- Kaç ürünün güncellendiğini gösteren sonuçlar göreceksiniz
- 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:
- HUSKY filtreli mağaza sayfanıza gidin
- Bir ile filtrelemeyi dene üst kategori
- Çocuk kategorilerdeki ürünler artık görünmelidir
- 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:
- Veri Yapısı Değişikliği: Bu, temel WooCommerce veri ilişkilerini değiştirir
- Evrensel Değil: Bazı siteler belirli iş mantığı için kasıtlı olarak yalnızca alt kategorileri atar
- Performans: Çok büyük kataloglarda, bu her ürün kaydına ek yük getirir
- Ç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:
- Her ürünü düzenleyin
- Kategoriler metabox'ında, kontrol edin ilgili tüm üst kategoriler manuel olarak
- Ü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_productkanca 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