web-dev-qa-db-ja.com

WP_Queryを使用してカスタム分類法から少なくとも1つの用語を持つ投稿のリストを取得する

WP_Queryを使用すると、少なくとも1つのカテゴリまたはカスタム分類用語セットを持つすべての投稿を取得できますか?

2

はい、可能です。

シナリオ1

分類法が1つだけ必要な場合は、分類法に割り当てられているすべての用語のすべての用語IDを取得し、その一連の用語IDを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

複数の分類法に用語を割り当てる必要がある投稿が必要な場合は、SCENARIO 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