多个嵌套的Tax_Query关系

时间:2014-03-26 作者:Shane

我已经在一个特定的问题上停留了一段时间,还没有找到解决它的方法。我有定制的小部件,对于每个小部件,我都添加了基于类别和/或标签过滤帖子的功能(此功能有效)。我现在正试图通过在每个小部件中包含一个自定义字段来扩展它,您可以在其中输入要排除的类别的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和$标记接受了两个输入数组(这很好),但似乎不起作用的是:

\'cat\'               => -5,
如果我完全删除tax\\u查询数组,排除类别工作得非常好,因此tax\\u查询似乎正在覆盖排除?

如果有人能直接给我指出正确的方向,那就太好了:)

谢谢

2 个回复
最合适的回答,由SO网友:engelen 整理而成

这个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运算符组成。因此,在您的情况下,添加\'cat\' => -5 只需将上述数组添加到tax_query, 导致查询返回以下帖子:

不属于第5类$category, 或$tags

嵌套的tax\\u查询

无法在中使用嵌套条件tax_query. 要实现您正在寻找的条件(来自$category 或者有一个标签tags, 但在所有不属于第5类的情况下),您必须posts_where 还有可能posts_join.

对任何感兴趣的人来说,这同样适用于meta_query: 这也不支持嵌套查询。

EDIT

使用posts_where

回应您的评论:要实现这一点,请使用posts_where, 您将只希望将筛选器应用于要排除其类别的一个查询。为此,请在创建查询之前添加筛选器,然后将其删除:

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

EDIT

构建附加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\'];

SO网友:italiansoda

只是提供有关嵌套分类法的更新答案,因为它们确实受到支持。以上所选答案已过时/有点误导。WordPress Core支持Nested Taxonomies since v4.1

Taken from the WordPress Codex

可以嵌套“tax\\u query”子句,以创建更复杂的查询。示例:显示quotes类别中的帖子,或两者都具有quote post格式且都属于Widget类别的帖子:

$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

结束

相关推荐