琢磨着为单篇文章添加上随机文章之类,因为已经写好了一个随机文章的函数,所以,直接在 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);
}
}
这个是必须的,特别是单个页面多个调用
嗯,我一开始不知道
这函数在CMS主题多出调用文章列表很是用到~
嗯,因为我是第一次做主题,所以记录下来
看不懂…… 👿 🙁
unset($GLOBALS[‘wp_query’]); 我懂了..销毁了重建~