WordPress循环

循环是WordPress通过主题模板输出文章的默认机制。可以在“设置→阅读”里设置一个页面要显示的文章数量。在循环内部,WordPress获取每一篇文章并展示到当前页面中,然后根据你的主题指导来格式化文章。

循环从WordPress数据库为每一篇文章提取数据并且插入合适的信息来替换模板标签。循环中的任何HTML或PHP代码在每一篇文章中都会被处理。

简单地说,循环每次位当前页面取出一篇文章并执行你在主题中指定的动作。

你可以使用循环做各种不同的事情,例如:

  • 在你的博客主页展示文章标题和摘要
  • 在文章详情页展示内容和评论
  • 使用模板标签在单独的页面展示内容
  • 展示自定义文章类型和自定义字段的数据

你可以在你的模板文件中定制你的循环来展示和处理不同的内容。

循环的详细说明

基本的循环代码如下:

从循环中可以看出当有文章的时候,执行循环并展示文章。详细步骤如下:

  • have_posts()函数检查是否有文章
  • 如果有文章,则括号内的条件为真,while循环将会执行。只要have_posts()一直为真,循环就会一直进行下去。

使用循环

循环应放在index.php以及其它要展示文章的模板中。由于你不想重复复制头部,循环应该放在get_header()函数后面。例如:

在上面的例子中,循环以endwhile和endif结束。循环必须以if和while声明开始,以相同的结束声明结束。

在文章中使用的任何标签都必须在开始和结束声明语句之间使用。

如果没有匹配到任何文章,那么你可以在页面中展示一个404“没有找到”的信息提示。这条消息必须位于endwhile和endif声明之间,如下面的例子所示。

一个在index.php中最简单的例子如下所示:

循环可以显示什么

循环可以为每篇文章显示各种不同的元素。例如,在许多主题中使用的一些通用模板标签:

  • next_post_link() - 按时间先后顺序上排在当前文章后面的一篇文章的链接
  • previous_post_link() -按时间先后顺序排在当前文章前面的一篇文章的链接
  • the_category() - 与文章或页面关联的分类
  • the_author() - 文章或页面的作者
  • the_content() - 文章或页面的正文
  • the_excerpt() - 正文的前55个字,后面紧跟“...”或链接到文章详情页的链接。你可以使用“Excerpt”字段来定制文章的摘要长度
  • the_ID() - 文章或页面的ID
  • the_meta() - 与文章或页面关联的自定义字段
  • the_shortlink() - 由站点链接和文章或页面ID组成的链接
  • the_tags() - 与文章关联的标签
  • the_title() - 文章或页面的标题
  • the_time() - 文章或页面的时间或日期。可以使用标准的php格式化函数来定制日期的格式。

你也可以使用条件标签,例如:

  • is_home() - 如果当前页面是主页则返回真
  • is_admin() - 如果在后台管理页面则为真,否则为假
  • is_single() - 如果当前页面是一篇文章则为真
  • is_page() - 如果当前页面是一个独立页面则为真
  • is_page_template() - 判断一个页面是否使用了指定的模板,例如:is_page_template('about-page.php')
  • is_category() - 如果页面或文章具有指定的分类则为真,例如:is_category('news')
  • is_tag() - 如果页面或文章具有指定的标签则为真
  • is_author() - 如果在作者归档页里则为真
  • is_search() - 如果当前页是搜索页则为真
  • is_404() - 如果当前页面不存在则为真
  • has_excerpt() - 如果文章或页面有自定义摘要则为真

例子

让我们一起看下一些循环的例子:

初级例子

博客存档

大多数的博客都有能够显示包括文章标题、缩略图和摘要的博客存档页面。下面展示了一个简单的例子:首先判断是否有文章,如果有文章,则输出文章的标题、缩略图和摘要。如果没有文章,则显示括号内的提示信息。

中级例子

根据不同的分类来样式化文章

下面的例子做了两件事:

  • 首先展示每一篇文章的标题、时间、作者、正文和分类,类似于上面的例子。
  • 其次,使用模板标签in_category(),可以让分类ID为“3”的文章有不同的样式。

例子中的代码注释提供了循环的详细说明:

多个循环

在某些情况下,你可能需要使用多个循环。例如你想在页面顶部的目录列表中显示文章的标题,然后在页面的底部显示正文。由于查询没有被改变,当我们需要循环第二遍的时候只需要简单的回放循环即可。此时我们只需要使用rewind_posts()即可。

使用 rewind_posts()

你可以通过rewind_posts()来重复使用相同查询的循环。如果你想在页面的不同位置再一次显示相同的查询内容,这是非常有用的。

下面是使用rewind_posts()的例子:

创建第二个查询和循环

使用两次相同的查询相当的简单,但是并不总是你想要的。通常你可能需要在模板中创建第二个查询来展示不同的内容。例如,你可能想在相同的页面中展示两组文章,但是每组文章展示不同的内容。以下是一个通用的例子,展示了某个文章所属分类的其它的文章列表。

正如上面的例子所看到的,第一次我们显示了一个常规的循环。然后我们使用WP_Query定义了一个新的变量来查询指定分类下的文章。在例子里,我们使用了“example-category”这个别名。

注意上面的常规循环有一些不同:他调用了wp_reset_postdata()来重置文章数据。在我们使用第二次循环以前,你必须重置文章数据。有两个方法来做这件事:

  1. 通过使用rewind_posts()方法
  2. 或者创建一个新的查询对象

重置多个循环

当在一个模板中使用多个循环时重置它们是非常重要的。如果不这么做的话会导致不可预料的结果,因为数据是如何存储和在全局$post变量中使用的。根据使用方式的不同有三种方法可以重置循环。

使用wp_reset_postdata()

当你使用WP_Query运行了自定义或多个循环的话,则使用wp_reset_postdata()。这个方法使全局变量$post恢复到主查询的状态。如果你遵循最佳实践,这个函数是你重置循环时最经常使用的方法。

为了正确的使用这个函数,请把以下代码放在使用WP_Query循环的下面:

下面是使用wp_reset_postdata()来重置WP_Query循环的例子:

使用wp_reset_query()

使用wp_reset_query()来恢复WP_Query和全局变量$post到主查询。如果你在循环中使用了query_posts(),那么你必须使用这个函数来重置你的循环。你ye 可以在WP_Query循环后面使用它,因为当运行它的时候其实调用了wp_reset_postdata()。但是涉及WP_Query的所有自定义查询使用wp_reset_postdata()是最佳实践。

query_posts不是最佳实践并且应该尽可能的不使用它。因此,你也不会用到wp_reset_query().

为了正确使用这个函数,请把下面的代码放在使用query_posts()函数的后面。

本文翻译自The Loop

发表评论