SO网友:V. Högman
更加精确,因为我无法对给出的答案进行评论。从开发人员的角度来看,Wordpress文档并不精确,在打开WP代码之前,我自己也很困惑。
global post
与给定响应(Pieter)中所声称的不同,全球
$post
已在登录到单个模板(标准或自定义帖子)时设置。它应该是第一个也是唯一的职位。我自己也尝试过在顺序循环前后显示帖子,然后再看看会发生什么。
// in single.php or single-{cpt}.php
get_the_header();
global $post;
echo "<h3>before loop</h3>";
var_dump($post); // already contains the queried post!
echo "<h3>in loop [i=0]</h3>";
the_post();
var_dump($post); // still the same!
echo "<h3>in loop [i=1]</h3>";
the_post();
var_dump($post); // not set (NULL)
the WP loop
因此,对于访问帖子的标准字段,您不需要严格调用
the_post()
. 然而,正如Milo所提到的,这可能会与插件产生一些冲突或导致奇怪的行为,因为您的内容将显示在循环之外。它不仅会错过
loop_start
和
loop_end
操作,但WP查询包含一个名为
in_the_loop
这不会被设定。例如,内容调用中的回调
in_the_loop()
会得到
false
而你可以期望
true
阅读某些内容时。这很容易让人误解,因为你不在一个真实的循环中。。。循环应该只用于涉及多个帖子的归档,但在WP中这只是一个糟糕的语义选择。
您可以在此处看到:https://developer.wordpress.org/reference/classes/wp_query/the_post/
public function the_post() {
global $post;
$this->in_the_loop = true;
if ( $this->current_post == -1 ) // loop has just started
/**
* Fires once the loop is started.
*
* @since 2.0.0
*
* @param WP_Query &$this The WP_Query instance (passed by reference).
*/
do_action_ref_array( \'loop_start\', array( &$this ) );
$post = $this->next_post();
$this->setup_postdata( $post );
}
a while loop?
最后一个问题是
while (has_posts())
循环,这没有多大意义,因为您在一个帖子模板中,并且应该找到一个唯一的帖子。有人声称,对于其他模板来说,在一般情况下需要一致性,但从纯开发人员的角度来看,这有点令人困惑。实际上你应该检查一下
if (has_posts())
在发生错误调用的情况下,如果重定向出错,那么主要原因是更加健壮。鉴于此,您可以使用
while (has_posts())
匹配通用模板,但这更多的是主观问题。
TL;DR
循环还是不循环?A.
while
循环不是必需的,但
the_post()
应至少调用一次,不是为了加载帖子,而是为了与内部状态一致(WP\\u查询)。与……核对
has_posts()
应在之前调用一次,以实现健壮性。