WordPress 循环解释:它是什么以及它是如何工作的
已发表: 2022-03-12循环是 WordPress 的核心部分。 没有它,您将看不到任何 WordPress 网站上的内容。 它负责确保文章出现在博客页面和档案中,以及单个页面上的静态内容。
如果您是主题设计师,您将无法学习如何使用它。 但是,作为一个普通的 WordPress 用户,您甚至可能不知道它的存在。
为了缓解这种情况,在这篇文章中,我们将详细解释 WordPress 循环。 我们将介绍它是什么以及它是如何工作的,以及在 WordPress 中的哪里可以找到它。 您还将学习如何创建自己的,并查看一些 WordPress 循环示例以巩固您对它的理解。
什么是 WordPress 循环(以及在哪里找到它)?

如果您要简要解释 WordPress 循环是什么,它只是在 WordPress 网站的页面上获取和输出内容的标记。 无论是静态页面、帖子、博客页面还是存档——WordPress 从数据库中提取内容并将其显示在页面上的任何地方都涉及到循环。
但是,为什么它首先被称为循环?
因为它会反复运行。 另外,正如您将在下面看到的,它实际上由一个 PHP 循环组成。
WordPress 循环多久运行一次?
直到没有任何东西可以显示。 即使在静态页面上,它也会循环显示可用内容。 但是,在这种情况下,它会在一次通过后停止。
WordPress 循环是什么样的?
为了更清楚地说明我们在说什么,让我们看一个示例并逐步进行。 这是一个简单的 WordPress 循环的示例:
if ( have_posts() ) : while ( have_posts() ) : the_post(); // Display content here endwhile; endif;
如果您已经了解 PHP 或者是 WordPress 开发人员,那么理解它应该没有任何问题。 但是,对于其他所有人,让我们一一回顾。
-
if ( have_posts() )
: — 这是一个使用 have_posts() 函数的if
语句。 如果语句在编程中很常见,它们只是说“如果以下条件适用,则继续”。 在这种情况下,条件是have_posts()
,它只是检查是否存在任何可以显示的帖子。 -
while ( have_posts() )
: — 这一行是一个while
循环,标志着 WordPress 循环的开始。 只要条件为真,它就会执行它包含的代码。 同样,条件是 WordPress 是否有任何帖子。 它返回true
的频率取决于管理界面中 WordPress 设置中设置的帖子数量。 -
the_post();
— 这是循环执行的代码。 这是一个 WordPress 函数,它调用下一篇文章的所有可用数据并将其保存以准备显示。 为此,我们有很多模板标签,我们将在下面讨论。 -
// Display content here
— 此处是我们放置标记的位置,该标记确定要显示内容的哪一部分以及以何种方式显示。 它通常是 PHP 和 HTML 的混合体。 我们没有在这里展示它,因为它更复杂,我们稍后会讨论它。 -
endwhile;
— 在完成我们需要它做的事情后关闭while
循环的一段代码。 -
endif;
— 与上面相同,但对于if
语句。
所以,基本上结构如下:检查帖子是否存在,然后从数据库中提取必要的数据并以预先确定的方式显示,只要有有效的帖子显示就重复此操作。
替代语法
一件快速的事情,你有时也会看到这样写的循环:
if ( have_posts() ) { while ( have_posts() ) { the_post(); // Display content here } // end while } // end if
这与上面的示例完全相同,只是使用了另一种 PHP 语法。 你使用哪一个真的取决于你。 为了一致性起见,我们将继续第一个变体。
在哪里可以找到 WordPress 循环?
每当页面上出现内容时,循环总是在工作的事实已经回答了在哪里可以找到 WordPress 循环。 答案在显示内容的主题的每个模板文件中。
或者,根据您的主题架构,它也可能在模板部分中。 这些是包含常用代码片段(例如循环)的模板文件。 它们可以被拉入其他文件,而不是每次都重用相同的代码片段。

例如,如果你打开二十一二十一主题的page.php
文件,你可以看到,在这里,循环被分成了几部分。 虽然它从文件本身开始,但确定如何输出数据的部分位于名为content-page.php
的模板部分中。
/* Start the Loop */ while ( have_posts() ) : the_post(); get_template_part( 'template-parts/content/content-page' ); // If comments are open or there is at least one comment, load up the comment template. if ( comments_open() || get_comments_number() ) { comments_template(); } endwhile; // End of the loop.
WordPress 模板层次结构决定了系统使用哪个文件来显示什么类型的页面,并且每个文件需要包含一个循环或对您可以找到它的位置的引用。
这也意味着循环在单个文件中可能看起来不同,这意味着在不同的页面上。 例如,在存档中,您可能只想显示帖子摘录,而在主博客页面上,您可能希望显示整个帖子(直到“阅读更多”链接)。 为此,您需要不同类型的标记,这就是循环在home.php
和archive.php
中看起来不一样的原因。
如何创建循环
为了创建一个循环,您基本上可以从我们上面剖析的简单代码开始。 这真的是标准循环。 这里又是:
if ( have_posts() ) : while ( have_posts() ) : the_post(); // Display content here endwhile; endif;
棘手的部分是我们遗漏的部分:决定内容显示的部分。 为此,如前所述,您通常混合使用 HTML 和 PHP。 例如,下面是您如何告诉 WordPress 吐出包含在<article>
标记中的帖子,该标记具有自定义类和 id,标题为h1
标题,以及特色图像和内容。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <article <?php post_class(); ?>> <h1><?php the_title(); ?></h1> <?php the_post_thumbnail(); ?> <?php the_content(); ?> </article> <?php endwhile; endif; ?>
上面突出的一件事是有很多用下划线写的标签。 这些是 WordPress 模板标签,它们提供了调用内容公共部分的快捷方式。 在这里,我们使用the_title()
显示帖子标题,使用the_post_thumbnail()
() 显示特色图像,使用 the_content( the_content()
显示主要内容。 还有更多,例如the_excerpt()
或the_category()
。 您可以在此处找到选项列表。
另一个对 WordPress 循环很重要的事情是条件标签。 您会看到它们在与循环相关的标记中大量使用,以仅在某些条件下显示某些内容。 例如,将the_post_thumbnail()
包装到条件语句中以防止 WordPress 在不存在特色图像时尝试将其放在页面上是很常见的。
<?php if ( has_post_thumbnail() ): the_post_thumbnail(); endif; ?>
我们在下面有更多示例。 要了解有关条件标签的更多信息,请查看 WordPress Codex。
WordPress 循环的示例
作为本教程的最后一部分,我们将介绍一些有关如何使用 WordPress 循环的示例。
二十二十一主题
在查看二十一二十一主题时,首先突出的是它大量使用模板部分。 所有标准模板文件,如page.php
、 single.php
甚至index.php
在文件内开始循环,然后使用get_template_part
将内容显示卸载到其他文件。 在这种情况下,分别是content-page.php
、 content-single.php
和content.php
。 以下是single.php
的缩短版本作为示例:
<?php get_header(); /* Start the Loop */ while ( have_posts() ) : the_post(); get_template_part( 'template-parts/content/content-single' ); // additional code for comments and post navigation endwhile; // End of the loop. get_footer();
这在其他文件中也可见。 例如,页眉和页脚也有自己的模板部分。 您可以在其他地方看到对循环内的引用。 例如,如果您查看content-single.php
,您可以在末尾看到对author-bio.php
模板部分的调用。
<article <?php post_class(); ?>> <header class="entry-header alignwide"> <?php the_title( '<h1 class="entry-title">', '</h1>' ); ?> <?php twenty_twenty_one_post_thumbnail(); ?> </header><!-- .entry-header --> <div class="entry-content"> <?php the_content(); wp_link_pages( array( 'before' => '<nav class="page-links" aria-label="' . esc_attr__( 'Page', 'twentytwentyone' ) . '">', 'after' => '</nav>', /* translators: %: Page number. */ 'pagelink' => esc_html__( 'Page %', 'twentytwentyone' ), ) ); ?> </div><!-- .entry-content --> <footer class="entry-footer default-max-width"> <?php twenty_twenty_one_entry_meta_footer(); ?> </footer><!-- .entry-footer --> <?php if ( ! is_singular( 'attachment' ) ) : ?> <?php get_template_part( 'template-parts/post/author-bio' ); ?> <?php endif; ?> </article><!-- #post-<?php the_ID(); ?> -->
除此之外,这是相对标准的公平:

- 打开具有自定义 id 和类的
<article>
HTML 元素 - 创建文章标题元素,该元素输出包装在 h1 标题中的标题,并使用为二十一二十一定制的功能显示特色图像
- 随后使用包含
the_content()
模板标签的entry-content
元素来输出单个帖子内容 - 包括分页标记和带有另一个二十一二十一功能的条目页脚,用于显示帖子元信息
- 最后,在它自己的模板部分有前面提到的对作者简介的调用
二十个 WordPress 默认主题
如果您回到第一个 WordPress 默认主题二十,并使用 subversion 存储库查看版本 1.0 中的文件,您可以看到处理循环和模板文件是如何随着时间的推移而演变的。 那时,许多模板文件都包含自己完整的 WordPress 循环,而不是将它们外包给可重用的模板部分。 您可以在主题的page.php
中清楚地看到这一点。
<?php get_header(); ?> <div> <div role="main"> <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?> <div <?php post_class(); ?>> <?php if ( is_front_page() ) { ?> <h2 class="entry-title"><?php the_title(); ?></h2> <?php } else { ?> <h1 class="entry-title"><?php the_title(); ?></h1> <?php } ?> <div class="entry-content"> <?php the_content(); ?> <?php wp_link_pages( array( 'before' => '<div class="page-link">' . __( 'Pages:', 'twentyten' ), 'after' => '</div>' ) ); ?> <?php edit_post_link( __( 'Edit', 'twentyten' ), '<span class="edit-link">', '</span>' ); ?> </div><!-- .entry-content --> </div><!-- #post-## --> <?php comments_template( '', true ); ?> <?php endwhile; ?> </div><!-- #content --> </div><!-- #container --> <?php get_sidebar(); ?> <?php get_footer(); ?>
onecolumn-page.php
也是如此,它是一个控制主题提供的自定义页面模板的文件。 还值得注意的是,它使用了对循环的较旧调用,该调用当时写在一行中。
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
在现代主题中,您通常会看到它像前面看到的那样分散在几行中,以提高代码的可读性。
二十个主题也有一个独立的loop.php
文件,它太长了,无法在不超过我的字数限制的情况下包含在此处。 它分为三个部分,控制几种类型的帖子(图片库、 Asides类别的帖子、所有其他帖子)的显示。 其中每一个都由if
和else
语句进一步细分,以解释不同的情况,如存档和搜索页面。
<?php while ( have_posts() ) : the_post(); ?> <?php /* How to display posts of the Gallery format. The gallery category is the old way. */ ?> // Lots of code here <?php else : ?> // Lots of code here as well <?php endif; ?> <?php /* How to display posts of the Aside format. The asides category is the old way. */ ?> // Even more code <?php /* How to display all other posts. */ ?> <?php else : ?> // Still more code <?php else : ?> // A bit more markup <?php endif; ?> // And a bit more code <?php endif; // This was the if statement that broke the loop into three parts based on categories. ?> <?php endwhile; // End of the loop. Whew. ?>
整个事情包含一个相当复杂的逻辑,这就是为什么它出来相当长和复杂的原因。 我很高兴我们今天有其他处理这些问题的方法,我建议您查看它以查看您不想模仿的 WordPress 循环示例。
顺便说一句,如果您认为我对当时的开发人员过于苛刻,请放心,他们同意我的评估。 只需查看loop.php
关闭循环的开发人员评论。
<?php endwhile; // End the loop. Whew. ?>
WordPress 查询循环块
您可能没有意识到它是一个相对较新的 Gutenberg 功能,但块编辑器(以及扩展的全站点编辑)现在也有一个包含 WordPress 循环的块。 它被称为查询循环块,您可以像任何其他块一样将其添加到您的站点。 最简单的方法是添加正斜杠并输入其名称,例如/queryloop 。 点击回车,它将出现在页面上。

该块允许创建 PHP 循环而无需编写代码。 它将自动显示您网站上的最新帖子。 除此之外,它还有几个自定义选项。 首先,该块带有许多预设布局。 您可以通过箭头循环浏览它们,也可以单击“网格”选项一次查看它们。

选择您喜欢的任何一个,或者如果您已经到达您最喜欢的选项,请单击“选择”以完成选择。 重要的是要注意布局由块模式组成,因此预先安排了单个块的组。 这也意味着您可以根据需要对它们进行不同的排列,它们仍然是正常的块。 使用箭头或单击并按住拖动选项将它们移动到您想要的位置。
此外,每个块(通常是每个块组)在主编辑器屏幕和侧边栏中也带有它们常用的选项。 在这里,您可以更改它们的颜色、字体大小、格式等。

一旦满意,如果您发布或预览页面,您将看到您的自定义 WordPress 查询循环出现在其上。 因此,即使您不是 WordPress 开发人员并且不懂 PHP,您仍然可以利用循环提供的功能。
简而言之 WordPress 循环
循环是任何 WordPress 专业人士都必须熟悉的东西。 但是,即使您是一个比较随意的用户,了解它的工作原理仍然不是一个坏主意。 如果您愿意,它可能更容易解决问题或创建自定义页面模板。
在这篇文章中,我们已经讨论了循环是什么,它驻留在哪里,并详细分解了它。 我们还了解了如何从默认主题和新查询块创建自己的循环和示例。 到目前为止,您知道创建和自定义 WordPress 循环所需的一切。
您最喜欢 WordPress 循环的什么用途? 请在下面的评论中分享您的想法!
图片:Jonny Gios/Unsplash、Tine Ivanic/Unsplash