使用‘PRE_GET_POST’从存档和提要中包括和排除分类

时间:2013-03-10 作者:its_me

我想做什么

我的博客使用了一种称为edition 使用以下术语us-canada (6) ,则,eu (7) 以及india (8) --术语段塞(ID)。

我想确保not assigned to any specific \'edition\' 在所有条款下显示(即,如果一篇文章没有分配到美国、欧洲或印度,它将显示在所有这些条款的存档页中)。

我尝试了什么

这是与其中一个术语相关的示例代码,它应该能让您了解我到底想做什么,以及我会做错什么。

add_filter(\'pre_get_posts\',\'better_editions_archive\');

function better_editions_archive($query) {

    if ( $query->is_tax( \'edition\', 6 ) && $query->is_main_query() ) {
        $query->set( \'post_type\', array( \'post\' ) );

        $query->set( \'tax_query\',
            array(
                \'relation\' => \'AND\',
                array(
                    \'taxonomy\' => \'category\',
                    \'field\' => \'id\',
                    \'terms\' => array( 1, 2, 4, 5 )
                ),
                array(
                    \'taxonomy\' => \'edition\',
                    \'field\' => \'id\',
                    \'terms\' => array( 7, 8 ),
                    \'operator\' => \'NOT IN\'
                )
            )
        );
    }

    return $query;
}
What\'s wrong? 上述代码不起作用(我尝试过的其他代码:code-1, code-2), 这不会改变任何事情。也没有调试错误。

那么,我会做错什么呢?

ALSO, 为了确保更改也适用于这些条款的提要,我将上述代码中的相关行替换为:

function better_editions_archive($query) {

    if ( ( $query->is_tax( \'edition\', 6 ) && $query->is_main_query() ) || ( $query->is_feed() && $query->is_tax( \'edition\', 6 ) ) ) {
但这开始将术语的“反馈”重定向到术语的档案中。也就是说,有了这个功能,example.com/edition/usa/feed/ 重定向回example.com/edition/usa/.

再说一次,我不知道我会做错什么。

更新:什么对我有用?(但是……)

add_filter( \'pre_get_posts\', \'better_editions_archive\' );

function better_editions_archive( $query ) {
    if ( $query->is_tax( \'edition\', 6 ) && $query->is_main_query() ) {

        $args = array(
            \'post_type\' => \'post\',

            \'tax_query\' => array(
                \'relation\' => \'AND\',
                array(
                    \'taxonomy\' => \'category\',
                    \'field\' => \'id\',
                    \'terms\' => array( 1, 2, 4, 5 )
                ),
                array(
                    \'taxonomy\' => \'edition\',
                    \'field\' => \'id\',
                    \'terms\' => array( 7, 8 ),
                    \'operator\' => \'NOT IN\'
                )
            )
        );

        $query->query_vars = $args;
    }

    return $query;
}
这是可行的,但问题是,我想与一位知识渊博的WordPress开发人员进行一次长时间的聊天讨论,他告诉我这一点(你可以按照full conversation here, 但太长了):

然后将此数组指定为query_vars. 现在query_vars 是一个相当大的物体。您基本上是覆盖其中的数据,然后添加自定义数据。这意味着您可以“取消设置”根据默认值添加的所有内容。

他建议不要使用此解决方案,而是使用$query->set(); 方法

但正如你在上面看到的,我无法让另一个工作。所以我来这里是想看看是否有人能用一种不那么专业的语言告诉我我做错了什么。

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

我再打一次。

以下内容应修改主查询,以便在其循环中包含任何属于版本自定义分类法的术语的帖子。

add_filter(\'pre_get_posts\',\'better_editions_archive\');

function better_editions_archive( $query ) {

    if ( $query->is_tax( \'edition\' ) && $query->is_main_query() ) {
        $terms = get_terms( \'edition\', array( \'fields\' => \'ids\' ) );
        $query->set( \'post_type\', array( \'post\' ) );
        $query->set( \'tax_query\', array(
            \'relation\' => \'OR\',
            array(
                \'taxonomy\' => \'edition\',
                \'field\' => \'id\',
                \'terms\' => $terms,
                \'operator\' => \'NOT IN\'
            )
        ) );
    }

    return $query;
}

SO网友:its_me

Note to self: @vancoder的答案基本上是更好的(自动化)版本:

add_filter(\'pre_get_posts\',\'better_editions_archive\');

function better_editions_archive($query) {

    if ( $query->is_tax( \'edition\') && $query->is_main_query() ) {

        $query->set( \'post_type\', array( \'post\' ) );

        $query->set( \'tax_query\',
            array(
                array(
                    \'taxonomy\' => \'edition\',
                    \'field\' => \'id\',
                    \'terms\' => array( 6, 7, 8 ),
                    \'operator\' => \'NOT IN\'
                )
            )
        );

    }

    return $query;
}
(What the code says) 如果是属于自定义分类法的任何术语的存档\'edition\', 然后

该代码不会干扰术语“归档页面”的默认功能,即分配给自定义分类法术语的帖子edition\' 将(像往常一样)显示在相关学期的档案中。

但是如果一篇文章没有分配给任何给定的自定义分类术语(请参见\'terms\' => array( 6, 7, 8 )\'operator\' => \'NOT IN\'), 然后在自定义分类法所有术语的归档页面中显示此类帖子。

代码还影响上述条款的提要,因此,提要反映了存档页面的内容,这正是我所需要的。如果您不希望提要受到影响,即如果您希望更改仅应用于存档页面,请将if替换为:

if ( $query->is_tax( \'edition\') && $query->is_main_query() && ! $query->is_feed() ) {

结束