WooCommerce'de Kategori Filtrelemesinin Sonuç Döndürmemesi: Kategori Hiyerarşisi Düzeltmesi
Eğer WooCommerce ürün kategorisine göre filtreleme, ürünler alt kategorilere atanmış olsa bile, üst kategoriler için sonuç döndürmüyorsa, bu kılavuz sorunu çözmenize yardımcı olacaktır.
Sorun
Belirti: Bir üst kategoriye göre filtrelediğinizde, alt kategorilerinde ürünler bulunmasına rağmen hiçbir ürün gösterilmez.
Örnek:
- Kategori yapısı:
Federal Actions > SEC > Enforcement - Ürün şuraya atanmış:
Enforcement(yalnızca alt kategori) Federal ActionsveyaSECile filtreleme şunu döndürür: Sonuç yokEnforcementile filtreleme şunu döndürür: Ürün gösteriliyor
Bu Neden Olur
WordPress/WooCommerce, ürünlerin hiyerarşide yalnızca alt kategoriyle değil, tüm üst kategorilerle açıkça işaretlenmesini gerektirir.
Bir ürünü WordPress yönetici arayüzü aracılığıyla bir alt kategoriye atadığınızda, WooCommerce, ürünü terim ilişkileri 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ük üst kategori:
Federal Actions
Bu Soruna Sahip Olup Olmadığınızı Kontrol Etme
- Bir ürün düzenleme sayfasına gidin:
wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit - Sağ taraftaki Kategoriler meta kutusuna bakın
- Hiyerarşideki tüm üst kategorilerin işaretli olup olmadığını kontrol edin
- Yalnızca alt kategori işaretliyse → Bu soruna sahipsiniz
Çözüm: Otomatik Kategori Hiyerarşisi Normalleştirme
Bu çözüm iki bölümden oluşur:
- Geleceğe yönelik düzeltme: Ürünler kaydedilirken üst kategorileri otomatik olarak işaretle
- Hemen düzeltme: Mevcut tüm ürünleri normalleştir
Bölüm 1: Üst Kategorileri Otomatik İşaretle (Gelecekteki Ürünler)
Bu kodu alt temanızın functions.php dosyasına ekleyin:
/**
* 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 işlevi:
- Bir ürün her kaydedildiğinde 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ç: Artık 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 betik, veritabanınızdaki tüm mevcut ürünleri düzeltecektir. Bu geçici kodu functions.php dosyanıza ekleyin:
/**
* 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
functions.phpdosyanıza ekleyin - Şuraya gidin:
https://yoursite.com/?normalize_cats=1(yönetici olarak giriş yapmış olmalısınız) - Betiğin tamamlanmasını bekleyin
- Kaç ürünün güncellendiğini gösteren sonuçları göreceksiniz
- Bir kez çalıştırdıktan sonra bu kodu kaldırın
Beklenen çıktı:
Category Normalization Results
Array
(
[success] => 1
[normalized] => 156
[total] => 919
)
Bu, 919 üründen 156'sının üst kategorilerinin eksik olduğu ve düzeltildiği anlamına gelir.
Düzeltmeyi Test Etme
- HUSKY filtreleriyle mağaza sayfanıza gidin
- Bir üst kategoriye göre filtrelemeyi deneyin
- Alt kategorilerdeki ürünler artık görünmelidir
- Hiyerarşide aşağı doğru inmeyi deneyin – tüm seviyeler çalışmalıdır
Bu Neden HUSKY'de Varsayılan Olarak Yapılmıyor?
Bu meşru bir soru. İş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 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 eklentilere müdahale edebilir
Gelecekteki İyileştirme: Bunu HUSKY'de kullanıcıların ihtiyaç duyduğunda etkinleştirebileceği isteğe bağlı bir ayar olarak ekleyebiliriz, ancak varsayılan davranış olmayacaktır.
Alternatif: Manuel Kategori Atama
Manuel kontrolü tercih ederseniz, şunları yapabilirsiniz:
- Her ürünü düzenleyin
- Kategoriler meta kutusunda, ilgili tüm üst kategorileri manuel olarak işaretleyin
- Ürünü kaydedin
Bu size ayrıntılı kontrol sağlar ancak büyük kataloglar için zaman alıcıdır.
Sorun Giderme
Betik 0 normalleştirilmiş ürün gösteriyor
- Ürünleriniz zaten doğru üst kategorilere 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ığını (taslak olmadığını) doğrulayın
Ürünler alt kategori filtresinden kayboluyor
Bunun olmaması gerekir, ancak olursa:
- Betik mevcut tüm kategori atamalarını korur
- Başka bir eklentinin müdahale edip etmediğini kontrol edin
- Yedekten geri yükleyin ve desteğe başvurun
Özel Taksonomiler
Bu çözüm, CPT UI veya benzeri eklentilerle oluşturulan özel taksonomiler için de çalışır. 'product_cat' öğesini özel taksonomi slug'ınızla değiştirmeniz yeterlidir:
// 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
- Alt Tema Gerekli: Tema güncellemeleri sırasında kod kaybını önlemek için her zaman bir alt tema kullanın
- Önce Yedekleyin: Normalleştirme betiğini çalıştırmadan önce veritabanınızı yedekleyin
- Test Ortamında Test Edin: Mümkünse önce bir test ortamında test edin
- Tek Seferlik Betik: Normalleştirme betiğini çalıştırdıktan sonra kaldırın
- 1. Bölüm Kodunu Saklayın:
save_post_productkancası kalıcı olarak kalmalıdır
Özet
functions.php dosyasına kalıcı olarak ekleyin:
- Üst kategorileri otomatik işaretle kancası (Bölüm 1)
Bir kez çalıştırın ve kaldırın:
- Normalleştirme betiği (Bölüm 2)
Beklenen sonuçlar:
- Üst kategori filtrelemesi doğru çalışır
- Alt kategori filtrelemesi çalışmaya devam eder
- Hiyerarşi aşağı doğru gezinme düzgün çalışır
- Gelecekteki ürünler otomatik olarak üst kategorileri içerir