使用“set”方法将参数传递给WP_QUERY

时间:2017-11-04 作者:grazianodev

我正在修改WP\\u主查询,以使用pre_get_posts, 像这样:

add_action( \'pre_get_posts\', \'public_loop\' );

public function public_loop( $query ) {
    if ( ! is_admin() && $query->is_main_query() ) { 
        $query->set( \'meta_key\', \'deadline\' );  
    }
}
然后我通过AJAX加载旧帖子,所以我需要创建一个新的查询,我希望它与我修改的主查询具有相同的参数。按预期将参数作为参数传递:

function load_new_posts() {

    $q = new WP_Query( array( \'meta_key\' => \'deadline\' ) );

    if ( $q->have_posts() ) :
        while ( $q->have_posts() ) : $q->the_post();
            get_template_part( \'views/post/content\', get_post_format() );
        endwhile;           
    endif;

}
但使用set 方法不:

function load_new_posts() {

    $q = new WP_Query();

    $q->set( \'meta_key\', \'deadline\' );

    if ( $q->have_posts() ) :
        while ( $q->have_posts() ) : $q->the_post();
            get_template_part( \'views/post/content\', get_post_format() );
        endwhile;           
    endif;

}
在第二种情况下,AJAX调用表示“此请求没有可用的响应数据”。然而,如果我var_dump( $q ) 查询看起来正确。

我宁愿使用set 这样我就可以创建一个可重用的函数(因为我在pre_get_posts在AJAX调用中)。

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

在最后一个示例(不适用于您的示例)中,您正在实例化WP_Query 类,而不传入查询变量数组。这很好,但在内部,这意味着查询从未真正发生过。你在打电话$q->set( ... ), 但这只是设置一个查询变量,它不会运行查询和检索结果。

要实际运行查询并填充结果,请执行以下两项操作之一:

将查询变量传递给类构造函数。

$q = new WP_Query( array( \'meta_key\' => \'deadline\' ) );
或者,在实例化后运行查询。

$q = new WP_Query();
$q->query( array( \'meta_key\' => \'deadline\' ) );
什么会not 工作,这是:

$q = new WP_Query();
$q->set( \'meta_key\', \'deadline\' );
$q->query( array() );
它不起作用,因为query() 方法sets and overrides 任何现有查询变量。因此,您不能使用set() 在这种特殊情况下。记住,原因set() 从第一个示例中的过滤器可以很好地工作,这是因为过滤器事件发生在WP_Query 内部分类。但当您使用WP_Query 如果您自己初始化,则必须显式传入一组查询变量,以建立需要运行的查询。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post