web-dev-qa-db-ja.com

言葉なしで投稿を表示する

商品ページのタイトルが分類「review-product」からの自分の用語と一致する場合は、投稿タイプ「reviews」からのレビューを表示する商品ページを作成しています。

例です。

商品ページタイトル: 冷蔵庫

次の投稿を表示(レビュー)

  • 投稿の種類: 'レビュー'
  • 分類法: 'review-product'
  • 用語: 冷蔵庫

これはまったく問題ありません。しかし、時々私は製品のレビューがない(製品タイトルと用語の間に一致がないので)、そしてそれから私は '一般的な'レビューを見せたいです。私のウェブサイトではこれらは以下の投稿です。

  • 投稿の種類: 'レビュー'
  • 分類法: 'review-product'
  • 期間: 期間なし(!!!)

この投稿には、分類学からの用語 'review-product'はありません。

私の質問:

商品タイトルに一致するレビュー投稿がない場合、どうすれば用語なしでレビュー投稿を表示できますか。

これは私が今持っているものです:

function gtp_show_reviews( $number = 100, $term = null ) {
    $reviews = new WP_Query( array( 
        'post_type'         => 'reviews',
        'review-product'    => $term, // Fill this with product page slug (refrigerator)
    ));
    if( $reviews->have_posts() ) { 
        while( $reviews->have_posts() ) {
            $reviews->the_post();
            // The review
        }
    } 
    else {
        // Here I try to unset the 'review-product' term
        unset($reviews->query_vars['review-product']);
        unset($reviews->query_vars['term']);

        while( $reviews->have_posts() ) {
            $reviews->the_post();
            // Check if review has no term
            if( $reviews->has_term() == false ) {
               // The review
            }
        }   
    }

    wp_reset_postdata();
}
7
Robbert

WP_Queryの同じオブジェクトを2回使用することはできません。したがって、どの用語にも割り当てられていない投稿を取得するには、tax_queryパラメータを使用して別の投稿を作成する必要があります。

//fetch all reviews which have no assigned term in 'review-product'
$taxonomy  = 'review-product';
$post_type = 'reviews';
$args = [
    'post_type' => $post_type,
    'tax_query' => [
        [
            'taxonomy' => $taxonomy,
            'terms'    => get_terms( $taxonomy, [ 'fields' => 'ids'  ] ),
            'operator' => 'NOT IN'
        ]
    ]
];

$query = new \WP_Query( $args );

考えは、分類法のすべての用語のリストを取得し、それらをNOT IN演算子を使用して引数としてtax-queryに渡すことです。

あなたの例の2番目のループは新しいWP_Queryオブジェクトを辿るべきです。

7
David
$posts_query = new WP_Query( array(
    'tax_query' => array(
        array(
            'taxonomy' => 'foo',
            'operator' => 'NOT EXISTS', // or 'EXISTS'
        ),
    ),
) );

参照してください: https://core.trac.wordpress.org/ticket/29181

3
geminorum