Should I reset $wp_query?

时间:2019-10-30 作者:LovinQuaQua

我对WordPress并不完全陌生,但查询的事情让我有点困惑。我在网上搜索了很多文章,但找不到我需要的东西。也许它可以帮助很多像我这样有文字处理技能的人。

我想创建一个短代码,并需要遍历一个名为events的自定义post类型。

function leweb_get_suggested_events() {

    // Query
    global $wp_query;

    // Arguments  
    $args = array(
        \'post_type\' => \'events\',
    );  

    ob_start();

    $query = new WP_Query( $args );

    if( $query->have_posts() ) {
        echo \'<ul>\';
        while( $query->have_posts() ) {
            $query->the_post();
            echo \'<li>\' . get_the_title() . \'</li>\';
        }
        echo \'</ul>\';
    }

    $output = ob_get_clean();
    return $output;

}
add_shortcode( \'leweb_suggested_events\', \'leweb_get_suggested_events\' );
该查询是正确的,并且正在运行。但我应该重置一些东西吗?

我称之为全球$wp_query 进入主回路。这是我在读一些文章时发现的。

然后我开始自己的循环$query = new WP_Query($args);所以我有两个循环,对吗?主循环和我自己的循环。

Should I reset them both or just one of them, or is it fine like above?

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

该查询是正确的,并且正在运行。但我应该重置一些东西吗?

我应该同时重置它们还是只重置其中一个,或者像上面那样可以吗?

Neither!

你的WP_Query 对象自包含在中$query, 所以没有理由去碰$wp_query 全局变量,为什么要?$wp_query 表示主查询,所以不要管它。

你需要重置的是当前帖子。注意$query->the_post() 设置当前帖子,循环结束后需要撤消该帖子:

    if( $query->have_posts() ) {
        while( $query->have_posts() ) {
            $query->the_post();
            ....
        }
        wp_reset_postdata();
    }

打开一个单词wp_reset_query()

Thewp_reset_query() 功能是你在研究中可能看到的东西,但要避免这种情况。打算在query_posts, 这是一个你永远不应该使用的函数。

如果你发现自己需要使用query_posts, 或wp_reset_query 在你的客户工作中,出现了严重的问题。把它们从你的记忆中抹去,当你在代码中看到它们时尖叫,然后用极端的预感重构它们。

短代码和块

您是否考虑过将其转换为GB块而不是短代码?只需创建一个用PHP呈现的块,无需学习React或advanced JS

相关推荐

TAX_QUERY:当帖子应用了相应的子术语时,不显示带有父术语的帖子

我有一个层次分类法download-category 从中,我只希望显示带有父术语的帖子:$downloads_parent_posts = get_posts( array( \'post_type\' => \'downloads\', \'orderby\' => \'title\', \'order\' => \'ASC\', \'tax_query\' =>