web-dev-qa-db-ja.com

複数のネストしたtax_queryリレーション

私はしばらくの間特定の問題にこだわっていて、それを回避する方法をまだ見つけていません。私はカスタムウィジェットを持っており、各ウィジェットに対してカテゴリAND/ORタグに基づいて投稿をフィルタリングする機能を追加しました(この機能は動作します)。私は今、あなたが除外したいカテゴリのIDを入力できるカスタムフィールドを各ウィジェットに含めることによってそれを拡張しようとしています(カスタムフィールドは既にウィジェットにあり、ユーザー入力を保存します)。

理解を助けるために私がこれまでに持っているものをあなたに見せましょう:

        $args = array(
            'post_type'         => 'post',
            'post_status'       => 'publish',
            'posts_per_page'    => $num_posts,
            'cat'               => -5,
            'tax_query'         => array(
                'relation'      => 'OR',
                array(
                    'taxonomy'  => 'category',
                    'field'     => 'id',
                    'terms'     => $category,
                ),
                array(
                    'taxonomy'  => 'post_tag',
                    'field'     => 'id',
                    'terms'     => $tags
                ),
            ),
            'offset'            => 1,
        );

ご覧のとおり、$ categoryと$ tagsの両方に2つの入力配列を取り入れています(これは問題なく機能しています)が、機能していないように思われるのは、

'cat'               => -5,

Tax_query配列を完全に削除すると、excludeカテゴリは完全に機能します。そこで、tax_queryがexcludeをオーバーライドしているように見えますか。

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです。

ありがとうございます。

1
Shane

cat-パラメータはtax_queryによって上書きされません。代わりに、それはtax_queryに追加されます。したがって、'cat' => -5を使用すると、次の配列がtax_queryに追加されます。

(
    [taxonomy] => category
    [terms] => Array
        (
            [0] => 5
        )

    [include_children] => 1
    [field] => term_id
    [operator] => NOT IN
)

結果として得られる分類クエリは、OR演算子を持つ3つの異なる句で構成されています。したがって、あなたのケースでは、'cat' => -5を追加することは単にtax_queryに上で説明された配列を追加します。

  • カテゴリ5以外
  • $categoryのいずれかのカテゴリで
  • $tags内のいずれかのタグ内

入れ子のtax_query

tax_queryにネストした条件を使用する方法はありません。探している条件($categoryのカテゴリに投稿する、またはtagsのタグがあるが、カテゴリ5にはない場合)を達成するには、 posts_where にフックする必要があります。そしておそらく posts_join

興味のある人なら誰でも同じことがmeta_queryにも言えます。これは入れ子になったクエリもサポートしません。

編集

posts_whereを使う

posts_whereを使用してこれを達成するために、あなたはあなたのコメントに応えて、あなたはあなたがカテゴリーを除外したいただ一つの質問にフィルターを適用したいと思うでしょう。そのためには、クエリを作成する前にフィルタを追加し、その後それを削除します。

add_filter( 'posts_where', 'myplugin_posts_where' );
$query = new WP_Query( $args );
remove_filter( 'posts_where', 'myplugin_posts_where' );

編集

追加のWHERE-句を作成する

get_tax_sql を使用して追加のWHERE-句を作成すると、SQLを手動で作成する必要がなくなり、用語IDが自動的に用語分類IDに変換されるので便利です。

$clauses = get_tax_sql( array(
    array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => 2,
        'operator' => 'NOT IN'
    )
), $wpdb->posts, 'ID' );

$where .= $clauses['where'];
3
engelen

入れ子になった分類法に関する最新の回答を提供するだけで、それらは実際にサポートされています。上記の選択された答えは古くなっています/少し誤解を招きやすいです。 WordPress Coreはv4.1から ネスト分類法をサポートしています

WordPressコーデックスから取られた

より複雑なクエリを作成するために、 'tax_query'句をネストすることができます。例:見積もりカテゴリORにある表示投稿は、どちらも見積もり投稿形式であり、かつ知恵カテゴリにあります。

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array( 'quotes' ),
        ),
        array(
                        'relation' => 'AND',
                        array(
                    'taxonomy' => 'post_format',
                    'field'    => 'slug',
                    'terms'    => array( 'post-format-quote' ),
                        ),
                        array(
                                'taxonomy' => 'category',
                                'field'    => 'slug',
                                'terms'    => array( 'wisdom' ),
                        ),
        ),
    ),
);
$query = new WP_Query( $args );

https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

4
italiansoda