the_title() 括号里什么都不用传,它怎么知道要输出哪篇文章的标题?
你可能会想:因为它知道“现在是第几篇”。但它是怎么知道的?
WordPress 有一个全局变量叫 $post,它永远指向“当前正在处理的那篇文章”。
the_post() 干的事,就是把这个 $post 换成下一篇。换完之后,所有读 $post 的函数,自然就拿到了新文章的数据。
the_title() 内部大致是这样:
function the_title() {
echo get_the_title(); // get_the_title 不传参时,读的就是全局 $post
}
同理:
the_content() 读 $post->post_contentthe_permalink() 读 $post 的 ID,拼出链接the_author() 读 $post 的作者the_time() 读 $post 的发布时间它们全都不传参数,全靠 $post 这个“当前指针”。
拆开看,the_post() 做了两件事:
$post 指向它(同时设置一堆相关变量,比如 $id、$authordata)。没有第 2 步,the_title() 就不知道该读谁。
在循环外面直接调 the_title(),会输出什么?
多半是空的,或者是“上一篇文章”的标题。因为这时 $post 还没被正确设置。
这就是下一篇要讲的问题——在循环外调模板标签,会出什么事。caogenbj 的 single.php 里就有一个现成的例子。
这种设计看起来“不干净”(全局变量嘛),但它是 WordPress 的历史选择,而且有它的道理:
$post,主题只管读);$post 的内容)。代价是:你必须清楚“现在 $post 指向谁”。搞不清这一点,就会写出“标题对、内容错”这种诡异的 bug。
一句话记住:the_title / the_content / the_permalink 都不传参数,它们读的是全局 $post;the_post() 负责把 $post 换成下一篇。
下一篇,看一个真实的“循环外用标签”翻车案例。