我应该在single.php文件中使用循环吗?

时间:2015-08-15 作者:user1452062

我阅读了许多教程,检查了许多高级/免费主题的源代码,其中大多数都在单曲中使用循环。php文件。

单曲。php文件只显示一篇文章,所以我认为the_post() 已经足够了,但没有必要。这些主题(二一五、二一二等)有什么原因吗在单曲中使用循环。php文件?

3 个回复
SO网友:Pieter Goosen

严格地说,您不需要在单个帖子页面中进行循环,您只需要调用the_post().

原因the_post() 是吗the_post() 设置$post 单个post post对象的全局值

SO网友:Milo

如果你想保持与所有插件的100%兼容性,你需要在single上使用循环。php。原因是loop_startloop_end 在第一次和最后一次调用时触发的操作have_posts().

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_startloop_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() 应在之前调用一次,以实现健壮性。

结束

相关推荐

Specific loop in Shortcode

我在做短码,我被困在这里了。以下是代码:add_shortcode(\'service-shortcode\', \'service_shortcode\'); function service_shortcode($atts) { extract( shortcode_atts( array( \'title\' => \'Service One\', \'icon\' => \'fa-briefcase\'