web-dev-qa-db-ja.com

WP_Query異なる複数のカテゴリのみに属するWoocommerce製品tax_query

特定のカテゴリの製品を照会するために、Woocommerce製品にWP_Queryを使用しています。これは私のために働いた構文です-

$args = array(
    'posts_per_page' => -1,
    'product_cat' => 'category-slug-here',
    'post_type' => 'product',
    'orderby' => 'title',
);
$the_query = new WP_Query( $args );
// The Loop
while ( $the_query->have_posts() ) {
    $the_query->the_post();
    echo '' . get_the_title() . '<br /><br />';
}
wp_reset_postdata();

これはデータを返しますが、カテゴリのスラッグではなくIDを渡してフィルタリングし、複数のカテゴリに存在する製品を検索したいですonly

引数product_catWP_Queryにネイティブではないので(少なくとも私が見つけることができるので)、これはWoocommerceのカスタムなものだと思います。ドキュメントを通じて、カテゴリIDでフィルタリングできるものを見つけられず、このフィルタリングにAND条件を使用することもできませんでした。

catを使用すると、tax_queryおよびcategory__andの配列は結果を生成しませんでした。基本的に、カテゴリID 102と115の両方に存在するすべての製品を照会したいと思います。スラッグを使用する必要がある場合は、所有しているIDに基づいてその情報を取得する方法があると確信していますが、複数のカテゴリでフィルタリングする2つのクエリを回避したい。

誰もこれを達成する方法を知っていますか?

PDATE:product_cat引数内のコンマでカテゴリスラッグを区切ると「OR」効果が得られるため、両方の異なる製品を組み合わせることがわかりましたが、これは私ではありません探している。したがって、たとえば:

 'product_cat' => 'category-slug1, category-slug2'

合計で両方のカテゴリの製品が返されますが、私はまだ両方または複数のカテゴリにのみ属する別個の製品を見つける方法を探しています。

14
RCNeil

うわー、だから何時間も頭を叩いた後、これは私がこれを解決することができた方法です-

$args = array(
    'posts_per_page' => -1,
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => 'category-slug1'
        ),
        array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => 'category-slug2'
        )
    ),
    'post_type' => 'product',
    'orderby' => 'title',
);
$the_query = new WP_Query( $args );

これは、tax_queryを含むrelation => 'AND'引数を利用して、製品が両方のカテゴリに分類されるようにします。

これが将来誰かを助けることを願っています。

また、スラッグではなくIDを渡す方法もわかりませんでしたが(方法はあるはずですが)、IDに基づいてスラッグを取得する関数を次に示します。

$terms = get_term($YOURID, 'product_cat'); 
$theslug = $terms->slug; 
28
RCNeil

Category_IDでクエリすることは、私にとってはうまくいったことです。

// First obtain term id:
//...
$all_categories = get_categories( $args );
$cat_ids = array();

foreach ($all_categories as $cat) 
{
     array_Push($cat_ids, $cat->term_id);
}

//Now use ids from array:
$args = array(
    'posts_per_page' => -1,
    'post_type' => 'product',
    'tax_query'     => array(
        array(
            'taxonomy'  => 'product_cat',
            'field'     => 'id', 
            'terms'     => $cat_ids
        )
    )
);
11
user2718602

WordPress codex on WP_Queryカテゴリパラメータの場合

[〜#〜]または[〜#〜]と同等

$args = array( 'product_cat' => 'category-slug1,category-slug2' ) );

[〜#〜] and [〜#〜]と同等

$args = array( 'product_cat' => 'category-slug1+category-slug2' );

例えば.

$query = new WP_Query( $args );
6
Daniel Twork

「tax_query」配列の配列内で、クエリで実行される「演算子」を指定できます。 「AND」演算子を使用して、目的を達成できます。

$args = array(
'posts_per_page' => -1,
'tax_query' => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'product_cat',
        'field' => 'slug',
        'terms' => array( 'category-slug1', 'category-slug2' )
        'operator => 'AND',
    ),
),
'post_type' => 'product',
'orderby' => 'title',
);
$the_query = new WP_Query( $args );

このクエリで選択されたすべての製品は、指定された「用語」と一致します。詳細については、このリンクを参照してください: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

リンクが壊れた場合の関連情報は次のとおりです。

operator(string)-テストする演算子。可能な値は、「IN」、「NOT IN」、「AND」、「EXISTS」、および「NOT EXISTS」です。デフォルト値は「IN」です。

1
asdf