Получение продуктов с определенным атрибутивным термином и определенным категориальным термином в Woocommerce с использованием SQL

#php #sql #wordpress #woocommerce #taxonomy-terms

#php #sql #wordpress #woocommerce #таксономия-термины

Вопрос:

Я хочу найти продукты с двумя разными критериями.

Код, который я использовал сначала для поиска по одному критерию;

 SELECT rel.object_id, rel.term_taxonomy_id, tt.taxonomy, tt.term_id, ts.name
FROM df1wrmw_term_taxonomy tt
INNER JOIN df1wrmw_term_relationships rel ON tt.term_taxonomy_id = rel.term_taxonomy_id
INNER JOIN df1wrmw_terms ts ON tt.term_id = ts.term_id
WHERE tt.taxonomy = "pa_1_scale"
AND ts.term_id = 400;
  

Это возвращает все эти продукты (Object_ID) с атрибутом «pa_1_scale» и ts.term_id = 400. Я также могу сделать это, чтобы вернуть все продукты с помощью product_cat и ts.term_id = 397, используя другой оператор WHERE

 WHERE tt.taxonomy = "product_cat"
AND ts.term_id = 397
  

UNION ALL просто объединяет два. Как мне заставить SQL выбрать оба этих критерия? Я знаю, что оператор WHERE, объединяющий два критерия, не будет работать, поскольку я думаю, что ни одна строка таблицы не содержит оба значения?

Любая доступная помощь была бы отличной.

Ответ №1:

Вы можете попробовать использовать следующее, которое объединит дублирующиеся таблицы с другой ссылкой на переменную, что позволит объединить оба запроса в один:

 SELECT tr.object_id, tr.term_taxonomy_id,  tt.taxonomy,  t.term_id,  t.name,
    tr2.term_taxonomy_id as term_taxonomy_id2, tt2.taxonomy as taxonomy2, 
    t2.term_id as term_id2, t2.name as name2
FROM df1wrmw_term_relationships tr
INNER JOIN df1wrmw_term_taxonomy tt
    ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN df1wrmw_terms t
    ON tt.term_id = t.term_id
INNER JOIN df1wrmw_term_relationships tr2
    ON tr.object_id = tr2.object_id
INNER JOIN df1wrmw_term_taxonomy tt2
    ON tr2.term_taxonomy_id = tt2.term_taxonomy_id
INNER JOIN df1wrmw_terms t2
    ON tt2.term_id = t2.term_id
WHERE tt.taxonomy = 'pa_1_scale'
    AND t.term_id = 400
    AND tt2.taxonomy = 'product_cat'
    AND t2.term_id = 397
  

Или вы можете использовать в WordPress класс WPDB и его методы для получения результатов SQL-запроса в PHP:

 global $wpdb;

$results = $wpdb->get_results("
    SELECT tr.object_id, tr.term_taxonomy_id,  tt.taxonomy,  t.term_id,  t.name,
        tr2.term_taxonomy_id as term_taxonomy_id2, tt2.taxonomy as taxonomy2, 
        t2.term_id as term_id2, t2.name as name2
    FROM {$wpdb->prefix}term_relationships tr
    INNER JOIN {$wpdb->prefix}term_taxonomy tt
        ON tr.term_taxonomy_id = tt.term_taxonomy_id
    INNER JOIN {$wpdb->prefix}terms t
        ON tt.term_id = t.term_id
    INNER JOIN {$wpdb->prefix}term_relationships tr2
        ON tr.object_id = tr2.object_id
    INNER JOIN {$wpdb->prefix}term_taxonomy tt2
        ON tr2.term_taxonomy_id = tt2.term_taxonomy_id
    INNER JOIN {$wpdb->prefix}terms t2
        ON tt2.term_id = t2.term_id
    WHERE tt.taxonomy = 'pa_1_scale'
        AND t.term_id = 400
        AND tt2.taxonomy = 'product_cat'
        AND t2.term_id = 397
");

// Display preformatted raw output
echo '<pre>' . print_pr($results, true) . '</pre>';
  

Это должно сработать.