برای حل این محدودیت، نیازی به نصب افزونههای سنگین و اضافی ندارید. ما باید با استفاده از یک فیلتر وردپرسی، المنتور را مجبور کنیم که تقاطع دقیقی بین «برچسب انتخابی» و «دستهبندی فعلی» ایجاد کند.
[preferred_source_button source_channel=”classic”]
کافیست قطعهکد زیر را کپی کرده و در فایل functions.php قالب چایلد (Child Theme) خود قرار دهید. اگر به فایلهای قالب دسترسی ندارید، میتوانید از افزونههایی مانند Code Snippets برای اجرای این کد در بکاند سایت استفاده کنید.
// Fix WordPress bug: Apply tag and category conditions simultaneously in Elementor Loop
add_filter( 'woocommerce_shortcode_products_query', function( $query_args, $atts, $loop_name ) {
if ( is_product_category() ) {
$current_cat = get_queried_object();
$has_tag = false;
if ( isset( $query_args['tax_query'] ) ) {
foreach ( $query_args['tax_query'] as $tax ) {
if ( isset( $tax['taxonomy'] ) && $tax['taxonomy'] === 'product_tag' ) {
$has_tag = true;
break;
}
}
}
if ( $has_tag ) {
$query_args['tax_query'][] = [
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $current_cat->term_id,
'include_children' => true,
];
$query_args['tax_query']['relation'] = 'AND';
}
}
return $query_args;
}, 10, 3 );
دلیل فنی تداخل دستهبندی و برچسب در المنتور
در معماری سیستم کوئریبیلدر المنتور پرو، برای نمایش شبکهای محصولات از کلاس پایه WP_Query در وردپرس استفاده میشود. زمانی که شما یک قالب آرشیو (Archive Template) طراحی میکنید، ویجت المنتور برای درک اینکه کاربر در کدام صفحه قرار دارد، به خواندن کوئری جاری صفحه (Current Query) وابسته است.
باگ تداخل زمانی رخ میدهد که شما یک فیلتر تکمیلی (مانند انتخاب Product Tag) را در تنظیمات ویجت Loop Grid اعمال میکنید:
- از دست رفتن کانتکست (Context Loss): المنتور به محض دریافت فیلتر دستی برچسب، کوئری پیشفرض صفحه آرشیو را کاملاً نادیده گرفته و یک کوئری سفارشی (Custom Query) را جایگزین آن میکند. به همین دلیل سیستم فراموش میکند که کاربر در حال حاضر داخل کدام دستهبندی قرار دارد.
- عدم ادغام خودکار تکسونومیها: المنتور به صورت پیشفرض مکانیزمی برای ترکیب همزمان فیلترهای آرشیو (product_cat) و فیلترهای سفارشی ویجت (product_tag) در حالت لوپ ندارد و دومی را روی اولی بازنویسی (Override) میکند.
کد بالا چگونه این مشکل المنتور را حل میکند؟
این قطعهکد دقیقا پیش از آنکه المنتور اطلاعات محصولات را از دیتابیس فراخوانی کند، وارد عمل میشود. سیستم ابتدا به صورت هوشمند تشخیص میدهد که کاربر در حال حاضر داخل کدام دستهبندی از سایت قرار دارد.
سپس، به جای رفتار صفر و یکی المنتور، یک دستور اجباری به هسته وردپرس ارسال میکند تا یک «تقاطع شرطی» ایجاد کند. به زبان ساده، وردپرس را وادار میکند که هر دو فیلتر را به صورت همزمان بررسی کند؛ در نتیجه، در صفحه آرشیو تنها محصولاتی به نمایش درمیآیند که هم برچسب انتخابشده را داشته باشند و هم دقیقا زیرمجموعه همان دستهبندی فعلی کاربر باشند.


