Получить список сообщений, в которых есть хотя бы один термин из пользовательской таксономии с помощью запроса WP
Возможно ли с помощью WP_Query
получить все записи, которые имеют хотя бы одну категорию или пользовательский набор терминов таксономии?
2
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