WooCommerce WP_Query с использованием tax_query не возвращает результатов (0 = 1)

Вопрос или проблема

Я пытаюсь получить конкретные продукты из WooCommerce на основе атрибута продукта (таксономии).

$args = array(
            'post_type' => array('product', 'product_variation'),
            'post_status' => 'publish',
            'tax_query' => array(
                 array(
                       'taxonomy'         => 'pa_range-kwh',
                       'terms'            => 'k2',
                       'field'            => 'slug',
                       'operator'         => 'IN',
                       'include_children' => true,
                        ),

            ),

        );

С точки зрения SQL
Я вижу, что:

SELECT * FROM `wp_terms` WHERE term_id = 891

возвращает

wp_terms

SELECT * FROM `wp_term_taxonomy` where term_id = 891

возвращает
enter image description here

SELECT * FROM `wp_term_relationships` where term_taxonomy_id = 891

возвращает

wp_term_relationships

Несмотря на то, что есть хотя бы один продукт, к которому добавлена таксономия, я продолжаю получать 0 результатов из-за внутреннего запроса, который возвращает (0 = 1), что означает, что он не может найти ни один продукт с указанной таксономией.

Есть идеи, что я могу сделать, чтобы преодолеть это?

П.С. полная функция

$GLOBALS['SERVER_SIDE_EQUATIONS']['get_products'] = function(){

    $products="";

    $argsAlt = array(
            'post_type' => array('product', 'product_variation'),
            'post_status' => 'publish',
            'suppress_filters' => true,
            'range-kwh' => 'k2',
            'pa_range-kwh' => 'k2',
            'lazy_load_term_meta' => false,
            'tax_query' => array(
            'relation' => 'OR',
            array(
                'taxonomy'         => 'pa_range-kwh',
                'terms'            => array('k2'),
                'field'            => 'slug',
                'operator'         => 'IN',
                'include_children' => true,
            ),

),//конец tax_array

        );

        $queryAlt = new WP_Query( $argsAlt );

        if($queryAlt->have_posts()){
            $products .='да ';
            $products .= $custom_posts->found_posts. "<br />";          
            $_pf = new WC_Product_Factory();
            foreach($queryAlt->posts as $post){
                $product_obj = $_pf->get_product($post->ID);
                $products .= $product_obj->get_title();
            } //конец foreach
        }else{
            $products .= '<br />Нет продуктов, которые соответствуют критериям поиска.';
        }//конец if       

    return $products;
};

Компания плагина предложила решение использовать объект wpdb и писать запросы вручную…
Спасибо @Sally CJ. Вы были правы в вашей теории, так как таксономии еще не известны (или не зарегистрированы), когда выполняется скрипт.
Я пока воспользуюсь этим подходом, так как времени мало, но постараюсь вернуться к этому, если найду решение первоначальной проблемы.

Ответ или решение

Решение проблемы с WP_Query и tax_query в WooCommerce

Если вы сталкиваетесь с проблемой, когда запрос WP_Query с использованием tax_query возвращает 0 результатов (0 = 1), это может быть связано с несколькими факторами, включая неправильные параметры запроса, проблемы с регистрацией таксономий или даже кэшированием. Ваша ситуация, где вы пытаетесь получить продукты WooCommerce на основе атрибута продукта, требует внимательного анализа.

Анализ проблемы

Из вашего кода видно, что вы используете таксономию pa_range-kwh для фильтрации продуктов по значению ‘k2’. Однако, несмотря на наличие товаров, соответствующих этому условию, результат остается пустым по причине, описанной вами — внутренний запрос не находит соответствий.

  1. Корректность запроса: Ваша структура $args выглядит правильно на первый взгляд. Убедитесь, что:

    • Таксономия pa_range-kwh действительно зарегистрирована и доступна на момент вызова запроса.
    • Значение термина точно соответствует тому, что хранится в базе данных. Убедитесь, что нет лишних пробелов или неправильного регистра.
  2. Проверка термина: Предоставленные вами SQL-запросы показывают наличие данных в таблицах wp_terms, wp_term_taxonomy и wp_term_relationships, но важно также обратить внимание на связанные товары и их метаданные. Пожалуйста, проверьте наличие записей в этих таблицах, чтобы быть уверенным, что товары правильно связаны с вашей таксономией.

  3. Параметры tax_query: Они должны быть точными. Я также заметил, что в другом месте кода вы задаете:

    'suppress_filters' => true,

    Если это не требуется, попробуйте удалить эту строку, так как она может повлиять на результаты запроса.

Альтернативное решение

Если предложенная вами новая концепция с использованием объекта $wpdb, как предложили разработчики плагина, будет более целесообразной для вашего случая, это действительно может помочь. Использование прямых SQL-запросов обеспечит вам полный контроль над тем, что именно вы запрашиваете из базы данных.

Пример запроса к базе:

global $wpdb;
$products = $wpdb->get_results( 
    "
    SELECT p.*
    FROM $wpdb->posts p 
    JOIN $wpdb->term_relationships tr ON (p.ID = tr.object_id)
    JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
    JOIN $wpdb->terms t ON (tt.term_id = t.term_id)
    WHERE p.post_type IN ('product', 'product_variation')
    AND p.post_status = 'publish'
    AND t.slug = 'k2'
    "
);
// Далее работа с полученными результатами

Заключение

Проблемы с запросами в WooCommerce могут возникать по множеству причин, от неочевидных ошибок в названиях таксономий до более глубоких проблем с базой данных. Если стандартные методы не дают результата, использование $wpdb — это хороший способ обойти проблему, предоставляя более высокую гибкость.

Если проблема не решается даже с использованием прямых запросов, возможно, стоит рассмотреть возможность конфликта с другими плагинами или темами. Надеюсь, приведенные советы помогут вам в решении вашей задачи.

Оцените материал
Добавить комментарий

Капча загружается...

  1. Гость

    Здравствуйте! Столкнулся с похожей проблемой и, возможно, смогу помочь. Похоже, что ваша функция выполняется до того, как WooCommerce успевает зарегистрировать свои таксономии. Это может быть причиной того, что WP_Query не находит продуктов по указанной таксономии.

    Попробуйте обернуть ваш код в функцию и подключить ее к хуку `woocommerce_init`, чтобы убедиться, что все таксономии и продукты уже зарегистрированы:

    add_action(‘woocommerce_init’, ‘get_products_after_wc_init’);
    function get_products_after_wc_init() {
    // Ваш исходный код здесь
    }

    Также обратите внимание на использование параметра `’suppress_filters’ => true` в вашем запросе. Этот параметр может отключать некоторые важные фильтры, влияющие на результаты WP_Query. Рекомендую удалить его или установить в `false`.

    Кроме того, убедитесь, что вы правильно используете таксономию и термины. Иногда неочевидные опечатки или лишние пробелы могут приводить к тому, что запрос не находит результатов.

    Вместо перехода к прямым SQL-запросам через `$wpdb`, что может быть менее безопасно и сложнее в поддержке, лучше попытаться решить проблему с использованием стандартных средств WordPress и WooCommerce.

    Надеюсь, эти рекомендации помогут вам найти и устранить причину проблемы!

    Ответить