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


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

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

Возраст таксономия

  • шестнадцать (используется на 3 постах)
  • двадцать семь (используется в 0 сообщениях)
  • тридцать четыре (используется на 12 сообщения)

Цвет глаз таксономия

  • Синий (используется в 5 сообщениях)
  • Коричневый (используется в 10 сообщениях)
  • Зеленый (используется в 0 сообщениях)

Мое желание - получить список всех терминов в eye_color, которые:

  1. есть сообщения
  2. используются вместе с thirty-four на одном или нескольких сообщениях

Конечно, я знаю, что get_terms() имеет аргумент hide_empty, но это выполняет только половину того, что я хотеть.

ОБНОВЛЕНИЕ: Комментарий ниже ссылается на функцию, которая позволяет находить термины, основанные на родственных терминах одной таксономии... но я хотел бы найти термины, основанные на родственных терминах нескольких таксономий.

Говоря простым английским языком, я бы в основном хотел:

Выберите все термины из taxonomy A, которые используются в публикации как с Term 1 from Taxonomy B, так и Term 2 from Taxonomy C.

Есть идеи?

Author: Pete, 2014-10-20

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 ) );

Если это решение не соответствует вашим потребностям, скажите мне, и я постараюсь это исправить.

С наилучшими пожеланиями,

 1
Author: Bordoni, 2014-10-23 21:18:55