PreGet POST-条件()和$QUERY->条件()之间的区别?

时间:2014-11-25 作者:Howdy_McGee

这可能是一个糟糕的问题,但内部pre_get_posts() 两者之间有什么真正的区别吗$query->conditional() 而不是仅仅添加conditional() ? 以以下示例为例:

/** Themes Pre Get Posts **/
function theme_pgp( $query ) {
    if( $query->is_home() ) {
        // Run Conditional 1
    }

    if( is_home() ) {
        // Run Conditional 2
    }
}
add_action( \'pre_get_posts\', \'theme_pgp\' );
为了可读性,我更喜欢使用第二个条件,但我经常看到代码使用第一个条件,所以我的问题是:在pre_get_posts 函数/操作/筛选器-是否存在这样的情况:这可能会返回不同的结果,即1个条件运行,而不是另一个?

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

有很大的不同。。。大多数时候。

is_home(), 就像任何其他条件标记一样,检查main query.

$query->condition() 检查通过操作传递的查询对象,该对象可以是完全不同的查询,因为pre_get_posts 需要all 查询。

例如,假设您正在查看singular post, 和内部single.php 您有:

$q = new WP_Query( array(\'nopaging\'=>true) );
现在让我们假设functions.php 您有:

add_action(\'pre_get_posts\', function ($query) {
    if( $query->is_home() ) {
       // conditional code
    }
} );
当主查询和辅助查询都触发操作时,挂钩回调将运行。

然而,对于主查询,条件代码会not 运行,因为您处于单数post视图中,但当由辅助查询条件代码激发时will 运行,因为辅助查询对象是主类型。

所以使用$query->is_home() 也没有is_home(), 它们只是不同而已,你应该根据你想要得到的结果来选择一个或另一个。

但是,当操作传递的查询对象是主查询时,这两种方法是相同的,因此如果只想检查主查询对象,使用其中一种方法没有任何区别:

function theme_pgp( $query ) {
    if ( ! $query->is_main_query() ) {
        return; // only main query
    }

    // here using is_home() or $query->is_home()
    // does not make any difference
}

结束

相关推荐