Как отредактировать запрос tax_query для извлечения продуктов из заданной категории c? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть интернет-магазин, созданный с помощью 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 продуктов). Проверьте этот снимок экрана:

x-category pagination

Итак, как вы видите, он отображает только нумерацию страниц (что правильно), но продукты не отображаются!

Примечание 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

Кто-нибудь может мне помочь или указать, что мне здесь не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...