web-dev-qa-db-fra.com

Obtenir la liste des articles qui ont au moins un terme d'une taxonomie personnalisée avec WP_Query

Est-il possible, avec WP_Query, d’obtenir toutes les publications qui ont au moins une catégorie ou un ensemble de termes de taxonomie personnalisé?

2
Nicola Peluchetti

Oui, tout à fait possible.

SCÉNARIO 1

Si vous n'avez besoin que d'une seule taxonomie, tout ce que vous avez à faire est d'obtenir tous les identifiants de tous les termes affectés à la taxonomie, puis de passer ce tableau d'identifiants de termes à un tax_query

(Nécessite 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
}

SCÉNARIO 2

Si vous avez besoin de publications dans lesquelles des termes doivent être attribués à plusieurs taxonomies, vous pouvez créer une requête plus complexe sur la logique deSCENARIO 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
Pieter Goosen