Получить список сообщений, в которых есть хотя бы один термин из пользовательской таксономии с помощью запроса WP


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

Author: Pieter Goosen, 2015-08-02

1 answers

Да, вполне возможно.

СЦЕНАРИЙ 1

Если вам нужна только одна таксономия, все, что вам нужно сделать, это получить все идентификаторы терминов всех терминов, назначенных таксономии, а затем передать этот массив идентификаторов терминов в tax_query

( Требуется PHP5.4+)

$term_ids = get_terms( 
    'TAXONOMY_NAME', 
    [ // Array of arguments, see get_terms()
        'fields' => 'ids' // Get only term ids to make query lean
    ]
);
if (    $term_ids // Check if we have terms
     && !is_wp_error( $term_ids ) // Check for no WP_Error object
) {
    $args = [
        'tax_query' => [
            [
                'taxonomy' => 'TAXONOMY_NAME',
                'terms'    => $term_ids,
            ]
        ],
    ];
    $q = new WP_Query( $args );

    // Run your loop as needed. Remeber wp_reset_postdata() after the query
}

СЦЕНАРИЙ 2

Если вам нужны записи, в которых должны быть термины, назначенные нескольким таксономиям, вы можете построить более сложный запрос на основе логики СЦЕНАРИЙ 1

$taxonomies = ['TAXONOMY_NAME_1', 'TAXONOMY_NAME_2']; // Array of taxonomies, can also use get_taxonomies for all
$tax_array = []; // Set the variable to hold our tax query array values
foreach ( $taxonomies as $key=>$taxonomy ) {

    $term_ids = get_terms( 
        $taxonomy, 
        [ // Array of arguments, see get_terms()
            'fields' => 'ids' // Get only term ids to make query lean
        ]
    );
    if (    $term_ids // Check if we have terms
         && !is_wp_error( $term_ids ) // Check for no WP_Error object
    ) {
        $tax_array[$key] = [
            'taxonomy' => $taxonomy,
            'terms'    => $term_ids,
        ];
    }
}
$relation = 'OR'; // Set the tax_query relation, we will use OR
if ( $tax_array ) { // Check if we have a valid array 
    if ( count( $tax_array ) == 1 ) {
        $tax_query[] = $tax_array;
    } else {
        $tax_query = [
            'relation' => $relation,
            $tax_array
        ];
    }

    $args = [ // Set query arguments
        'tax_query' => $tax_query,
        // Any other query arguments that you might want to add
    ]; 
    $q = new WP_Query( $args );

    // Run your loop as needed. Remeber wp_reset_postdata() after the query
}
 3
Author: Pieter Goosen, 2015-08-02 17:39:36