如何在不中断主查询的情况下使用WP_QUERY

时间:2021-05-30 作者:Álvaro Franz

这个WP Query 类可以用于对WP数据库进行几乎任何可以想象的查询。太神奇了。

但在加载WordPress时也会使用它来运行当前页面请求的主查询。

通常的做法是使用wp_reset_query() 和/或wp_reset_postdata()

但尚不清楚何时使用其中一种,或者是否必须使用它们。我不想只是以防万一,而只想在真正需要的时候使用它们。

所以我想知道使用WP Query 不中断主查询。

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

目前尚不清楚何时使用其中一种,或者是否必须全部使用

如果您修改了全局$wp_query 变量(例如使用query_posts() 不应实际使用),然后使用wp_reset_query() 将变量还原回主查询,例如,当您调用have_posts(), 它将检查主查询(是否包含任何帖子),而不是其他/自定义查询。

// This (should NOT be done and it) modifies the $wp_query global.
query_posts( \'posts_per_page=2\' );

while ( have_posts() ) {
    the_post();
    the_title( \'<h3>\', \'</h3>\' );
}

// This restores the $wp_query global back to the main query.
wp_reset_query();
$post 变量(例如使用setup_postdata() 或者通过调用the_post() method 在辅助/自定义中WP_Query 实例),然后使用wp_reset_postdata() 将变量还原回主查询中的当前帖子,例如调用the_title() 将在主查询中显示第二篇文章的标题,而不是在辅助查询中显示最后一篇文章的标题。

// Case 1: Calling the the_post() method in a custom WP_Query instance.

$query = new WP_Query( \'posts_per_page=2\' );

while ( $query->have_posts() ) {
    // This modifies the $post global.
    $query->the_post();

    the_title( \'<h3>\', \'</h3>\' );
}

// Restore the $post global back to the current post in the main query.
wp_reset_postdata();

// Case 2: Using setup_postdata().

global $post;
$posts = get_posts( \'posts_per_page=2\' );

foreach ( $posts as $post ) {
    // This modifies the $post global.
    setup_postdata( $post );

    the_title( \'<h3>\', \'</h3>\' );
}

// Restore the $post global back to the current post in the main query.
wp_reset_postdata();
所以在上面的两个例子中,我们只调用wp_reset_postdata() 没有必要打电话wp_reset_query() 因为这两个查询都没有修改主查询(或全局查询$wp_query 变量)。

因此,如果$wp_query 全局未修改,则无需调用wp_reset_query(), 如果$post 全局未修改,则无需调用wp_reset_postdata(). 一、 e.只给其中一个打电话。

其他注释query_posts() 将更改主查询,并且not recommended. 仅在绝对必要时使用。创建的新实例WP_Queryget_posts() 二次回路首选。如果要修改主查询,请使用pre_get_posts 行动

在a中pre_get_posts hook,你可以使用is_main_query() method 在传递的查询对象中,检查当前查询是否为主查询。钩子也是一样,比如posts_orderby 它将查询对象传递(如果请求)到挂钩回调。

钩子在WP_Query 同时在管理端激发(wp-admin), 所以你可以使用is_admin() 以避免更改管理上的主查询,除非您打算这样做。

我不太确定你问题的要点(或你想要的确切答案),但我希望这个答案能有所帮助。:

相关推荐

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

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