Как мне использовать термины таксономии на основе терминов, которые они используются вместе?
Как мне получить все термины одной таксономии, которые имеют один или несколько конкретных родственных терминов?
Например, предположим, что у меня есть следующие таксономии. Термины перечислены под таксономиями, а скобки указывают, что во многих публикациях используются термины.
Возраст таксономия
- шестнадцать (используется на 3 постах)
- двадцать семь (используется в 0 сообщениях)
- тридцать четыре (используется на 12 сообщения)
Цвет глаз таксономия
- Синий (используется в 5 сообщениях)
- Коричневый (используется в 10 сообщениях)
- Зеленый (используется в 0 сообщениях)
Мое желание - получить список всех терминов в eye_color
, которые:
- есть сообщения
- используются вместе с
thirty-four
на одном или нескольких сообщениях
Конечно, я знаю, что get_terms() имеет аргумент hide_empty
, но это выполняет только половину того, что я хотеть.
ОБНОВЛЕНИЕ: Комментарий ниже ссылается на функцию, которая позволяет находить термины, основанные на родственных терминах одной таксономии... но я хотел бы найти термины, основанные на родственных терминах нескольких таксономий.
Говоря простым английским языком, я бы в основном хотел:
Выберите все термины из taxonomy A
, которые используются в публикации как с Term 1 from Taxonomy B
, так и Term 2 from Taxonomy C
.
Есть идеи?
1 answers
Итак, мое решение проблем такого рода, когда у нас очень сложный набор правил, состоит в том, чтобы избегать создания нового SQL только для моего решения, потому что, если вам нужно объяснить это новичку, это становится сложным.
Мое решение:
function get_term_union( $taxonomy, $tax_query, $post_type = 'post' ){
$args = array(
'post_type' => $post_type,
'tax_query' => $tax_query,
'fields' => 'ids',
);
$posts = new WP_Query( $args );
$terms = array();
foreach( $posts as $post_id ){
$terms = array_merge( $terms, wp_get_post_terms( $post_id, $taxonomy, array( 'fields' => 'ids' ) ) );
}
$terms = array_unique( $terms );
return $terms;
}
// Usage
$tax_query = array(
'relation' => 'AND',
array(
'taxonomy' => 'taxonomy_B',
'field' => 'slug',
'terms' => 'term_A',
),
array(
'taxonomy' => 'taxonomy_C',
'field' => 'slug',
'terms' => 'term_B',
),
);
// This will return you all the term id's for `taxonomy_A`
var_dump( get_term_union( 'taxonomy_A', $tax_query ) );
Если это решение не соответствует вашим потребностям, скажите мне, и я постараюсь это исправить.
С наилучшими пожеланиями,