У меня есть интернет-магазин, созданный с помощью WooCommerce. У меня в магазине более 10 категорий. Из пары категорий и подкатегорий у меня нет в наличии товаров, которые я хочу отобразить на странице категории. Я хочу, чтобы отображались только эти товары (у меня есть много других товаров из других категорий, которых нет в наличии, но для них можно скрыться).
В панели управления WooCommerce -> Настройки -> Продукты -> Инвентарь -> Скрыть товары, отсутствующие на складе, из каталога (проверено), чтобы убедиться, что товары, отсутствующие на складе, не будут отображаться , При включении этой опции и проверке основного запроса с помощью плагина Query Monitor я вижу, что следующий основной запрос выполняется на странице категории x-category
:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (45,3507) )
AND wp_term_relationships.term_taxonomy_id IN (4407,4408,4409,4410,4411,4412,4417,4418,4419,6958) )
AND wp_posts.post_type = 'product'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY wp_posts.menu_order ASC, wp_posts.post_title ASC
LIMIT 0, 18
Примечание 1 : в базе данных идентификаторы: 45 и 3507 относятся к терминам:
45: exclude-from-catalog
3507: outofstock
Таким образом, я думал, что могу удалить идентификатор 3507 из запрос, который отвечает за скрытие товаров, отсутствующих на складе:
В моей дочерней теме functions.php
у меня есть следующий код:
function woocommerce_pre_get_posts( $query ) {
if ($query->is_main_query() && is_product_category('x-category')) {
$tax_query = $query->get('tax_query');
$query->set('tax_query',array (array(
'taxonomy' => 'product_visibility',
'field' => 'term_id',
'terms' => [45],
'operator' => 'NOT IN'
)) );
}
}
add_action( 'pre_get_posts', 'woocommerce_pre_get_posts' );
Когда я проверяю основной запрос с Плагин Query Monitor после применения кода выше, основной запрос выглядит так:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (45) )
AND wp_term_relationships.term_taxonomy_id IN (4407,4408,4409,4410,4411,4412,4417,4418,4419,6958) )
AND wp_posts.post_type = 'product'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY wp_posts.menu_order ASC, wp_posts.post_title ASC
LIMIT 0, 18
Как видите, идентификатор 3507
удален из запроса, и вы думаете, что он будет отображать все вне стоковые товары для категории x-category
. Но нет, ничего не отображается: /. Он отображает только нумерацию страниц, которая указывает на наличие 12 страниц (на каждой странице 18 продуктов). Проверьте этот снимок экрана:
Итак, как вы видите, он отображает только нумерацию страниц (что правильно), но продукты не отображаются!
Примечание 2 : Я пытался изменить основной запрос с помощью:
add_action( 'woocommerce_product_query', 'woocommerce_product_query_custom', 10, 2 );
Но я получаю тот же результат, что и упомянутый выше!
Примечание 3 : я попытался изменить код в моем functions.php
, чтобы изменить основной запрос, но получил тот же результат, что и выше. Код:
function woocommerce_product_query_custom( $query ) {
if ($query->is_main_query() && is_product_category( 'x-category' )) {
$out_of_stock_db_ID = 3507;
$tax_query = $query->get('tax_query');
if (array_key_exists(0, $tax_query)){
if (array_key_exists('terms', $tax_query[0])){
$terms=$tax_query[0]['terms'];
if (in_array($out_of_stock_db_ID,$terms)) {
$key = array_search($out_of_stock_db_ID, $terms);
unset($terms[$key]);
$tax_query[0]['terms'] = $terms;
$query->set( 'tax_query', $tax_query );
}
}
}
}
}
add_action( 'woocommerce_product_query', 'woocommerce_product_query_custom', 10, 2 );
Используемое программное обеспечение:
Wordpress 5.3.2
WooCommerce 3.9.2
Product Filters for WooCommerce by Nexter – 1.1.16
Кто-нибудь может мне помочь или указать, что мне здесь не хватает?