使用wp_reset_query()重置query

琢磨着为单篇文章添加上随机文章之类,因为已经写好了一个随机文章的函数,所以,直接在 single.php 中调用即可。

可是,页面卡住了,CPU 100了。换了个浏览器,依然如此。将新添加的语句注释掉,正常。函数的问题?可是,404 页面工作正常啊!将语句替换为简单的 echo 语句,一切正常。

再次调用函数,刷新,等待加载。N久之后,终于开始刷新出来了。可是,为什么是无数的文章而不是原本的单篇文章的呢?赶紧停止加载,去看代码。

仔细查看代码,终于发现了问题。我写的随机文章函数使用的是 wp_query() 方法,然后,里面是一个 loop,而添加的单篇文章的时候又位于其 loop 里面。而 $post 之类都是全局变量,这样,随机文章函数就重写了一系列的全局变量,从而导致了悲剧。

至于解决方法,查看了一下别人主题的代码,发现了 wp_reset_query() 这个函数,Codex 上的说明如下:

This function destroys the previous query used on a custom Loop. Function should be called after The Loop to ensure conditional tags work as expected.

于是,在随机文章函数的 loop 结束后添加该函数,一切 OK 了。

wp_reset_query() 的实现

看了一下源码,wp_reset_query() 的实现如下:

/**
 * Destroy the previous query and set up a new query.
 *
 * This should be used after {@link query_posts()} and before another {@link
 * query_posts()}. This will remove obscure bugs that occur when the previous
 * wp_query object is not destroyed properly before another is set up.
 *
 * @since 2.3.0
 * @uses wp_query
 */
function wp_reset_query() {
    unset(GLOBALS['wp_query']);
    GLOBALS['wp_query'] =&GLOBALS['wp_the_query'];
    wp_reset_postdata();
}

/**
 * After looping through a separate query, this function restores
 * the post global to the current post in the main query
 *
 * @since 3.0.0
 * @useswp_query
 */
function wp_reset_postdata() {
    global wp_query;
    if ( !empty(wp_query->post) ) {
        GLOBALS['post'] =wp_query->post;
        setup_postdata($wp_query->post);
    }
}

6条评论

    1. 嗯,因为我是第一次做主题,所以记录下来

评论已关闭。