循环是WordPress通过主题模板文件输出文章的默认机制。在循环中,WordPress遍历当前页面获取到的所有文章,然后使用主题中的模版标签将其格式化并输出。

  我们可以用WordPress循环来做很多事情,例如:

  在网站首页显示多个文章模块

  在文章详情页面显示内容和评论

  在侧边栏中显示最新文章或热门文章

  显示指定文章类型或分类方法中的数据

  根据指定的条件获取数据并显示在文章模块中

  循环细节

  循环的基本使用方法如下。

  <?php

  if(have_posts()):

  while(have_posts()):the_post();

  //显示文章内容

  endwhile;

  endif;

  ?>

  上面的代码首先判断是否有循环,如果有,则逐个显示循环中的内容。

  have_posts()函数检查当前页面是否有文章。

  只要括号中的条件逻辑为真,while循环就会继一直执行下去。

  使用文章循环

  循环应放在index.php或其他用来显示文章的模板中。因为我们不想在每个文章中都显示网站页头,所以循环代码应该放在get_header()之后。

  <?php

  get_header();

  //循环代码从这里开始

  if(have_posts()):

  while(have_posts()):the_post();

  //显示文章内容

  endwhile;

  endif;

  ?>

  如以上代码所示,循环必须以if和while语句开头,以endwhile和endif语句结束。用以显示文章内容的模版标签必须在循环开始语句和结束语句中间。

  如果当前页面没有文章,我们可以显示一个404错误信息,这个信息必须放在endwhile和endif语句之间,如下所示。

  这是一个非常简单的index.php文章。

  <?php

  get_header();

  if(have_posts()):

  while(have_posts()):the_post();

  the_content();

  endwhile;

  else:

  _e('抱歉,未找到您需要的文章。','textdomain');

  endif;

  get_sidebar();

  get_footer();

  ?>

  可以在文章循环中显示什么

  我们可以在循环中使用模版标签显示各种文章内容、文章自定义字段,下面是一些常用的模版标签:

  next_post_link():显示在当前文章之后发布的文章的链接

  previous_post_link()–显示在当前文章之前发布的文章的链接

  the_category():显示当前文章所在的分类

  the_author():显示文章作者

  the_content():显示文章正文内容

  the_excerpt():显示文章摘要

  the_ID():显示文章或页面ID

  the_meta():显示文章或页面的自定义字段

  the_shortlink():显示文章的短链接

  the_tags():显示文章所包含的标签

  the_title():显示文章标题

  the_time():显示文章发布时间

  显示文章的时候,我们可以使用条件标签控制文章是否在满足某种条件的情况下显示。

  示例

  下面让我们看一些WordPress循环的真实使用示例。

  基本示例

  文章列表页

  大多数网站都有文章列表页面,在列表页面中,我们可以显示这个列表中所有文章的标题、缩略图、摘要、分类等信息。下面的示例是一个简单的列表页面,示例代码首先检查是否有文章,如果有,显示文章标题、缩略图、摘要,如果没有,则显示提示消息。

  <?php

  if(have_posts()):

  while(have_posts()):the_post();

  the_title('<h2>','</h2>');

  the_post_thumbnail();

  the_excerpt();

  endwhile;

  else:

  _e('抱歉,未找到您需要的文章。','textdomain');

  endif;

  ?>

  文章详情页

  在WordPress中,每个文章都有自己的详情页面,我们可以使用模版标签在这个页面上显示文章的各种信息。

  在下面的示例中,模版循环显示了文章的标题和内容,除此之外,我们还可以显示文章正文、文章作者、发表时间等信息。

  <?php

  if(have_posts()):

  while(have_posts()):the_post();

  the_title('<h1>','</h1>');

  the_content();

  endwhile;

  else:

  _e('抱歉,未找到您需要的文章。','textdomain');

  endif;

  ?>

  为某个分类中的文章显示不同的内容和样式

  我们来看一下模版示例,在这个示例中:

  首先,显示每篇文章的标题、发布时间、作者、正文和分类。

  然后,我们利用判断函数in_category()来为分类ID为3的文章显示不同的样式。

  <?php

  //开始循环

  if(have_posts()):

  while(have_posts()):the_post();

  //判断文章是否在分类3中,如果是,添加CSS类"post-category-three".否则,添加CSS类"post".

  if(in_category(3)):?>

  <div>

  <?php else:?>

  <div>

  <?php endif;

  //显示文章标题

  the_title('<h2>',';</h2>');

  //显示该文章作者存档的链接

  printf(__('作者%s','textdomain'),get_the_author_posts_link());

  //显示文章内容

  ?>

  <div>

  <?php the_content()?>

  </div>

  <?php

  //显示逗号分隔的文章分类

  _e('文章分类','textdomain');the_category(',');

  //关闭div

  ?>

  </div>

  <?php

  //结束循环,下面是没有文章时显示的内容

  endwhile;

  else:

  //如果没有文章,显示提示消息

  _e('抱歉,未找到您需要的文章。','textdomain');

  //结束判断和循环

  endif;

  ?>

  主循环

  主循环是WordPress中的一个非常重要的概念,在开始学习多个循环之前,我们首先需要了解一下什么是主循环。

  当我们访问WordPress站点的时候,WordPress会根据我们访问的页面为我们新建一个文章查询和循环,设置一个$wp_query全局变量。这个变量就是主循环数据的变量,我们可以直接在页面模版中循环这个数据来输出文章。

  看一下下面的代码:

  if(have_posts()):

  while(have_posts()):the_post();

  the_title();

  endwhile;

  endif;

  为了说明主循环,我们稍微改写一下代码。

  if($wp_query->have_posts()):

  while($wp_query->have_posts()):$wp_query->the_post();

  the_title();

  endwhile;

  endif;

  两段代码是等效的,为了保持代码的简洁性,WordPress隐藏了全局的主循环变量$wp_query。

  多个循环

  在某些情况下,我们可能需要使用多个循环。例如,我们可能需要在页面顶部的内容列表中显示文章标题,然后在页面下方显示文章内容。因为我们使用的是同一个循环,我们只需要在开始第二次循环之前重置循环即可,使用函数rewind_posts()即可实现这个功能。

  使用rewind_posts()函数重新开始循环

  我们可以使用rewind_post()函数让循环从循环中的第一个元素重新开始,当我们需要在一个页面中循环同一个查询时,这个函数非常有用。

  这下面是一个rewind_posts()示例:

  <?php

  //开始第一次循环

  if(have_posts()):

  while(have_posts()):the_post();

  the_title();

  endwhile;

  endif;

  //使用rewind_posts()重置循环

  rewind_posts();

  //开始第二次循环

  while(have_posts()):the_post();

  the_content();

  endwhile;

  ?>

  新建查询和文章循环

  如上面的代码所示,我们可以非常容易的循环同一个查询结果两次或多次,但是很多时候,这不是我们所需要的。有时候我们需要在一个页面上显示不同的文章,例如,我们需要在页面的左侧显示所有文章,右侧显示分类「example-category」中的文章。这种情况下,我们需要新建一个文章查询,然后循环这个新的文章查询结果,示例代码如下:

  <?php

  //显示所有文章

  if(have_posts()):

  while(have_posts()):the_post();

  the_title();

  the_content();

  endwhile;

  else:

  _e('抱歉,未找到您需要的文章。');

  endif;

  wp_reset_postdata();

  //创建一个新的文章查询,获取分类「category_name」中的文章。

  $secondary_query=new WP_Query('category_name=example-category');

  //循环新的查询结果

  if($secondary_query->have_posts())

  echo'<ul>';

  while($secondary_query->have_posts()):$secondary_query->the_post();

  the_title('<li>','</li>');

  endwhile;

  echo'</ul>';

  endif;

  wp_reset_postdata();

  ?>

  如上例所示,我们首先显示主循环中的结果。然后,使用WP_Query类查询指定分类中的文章。

  请注意,上面示例中的第二个循环和主循环还有一个区别:后者调用了wp_reset_postdata()函数来重置文章数据。

  重置多个文章循环

  在循环中,文章数据是存储在$post全局变量中的,在循环结束时,我们需要重置这个全局变量,否则会导致一些难以调试的Bug。根据循环调用的方式,有三个函数可以用来重置循环。

  wp_reset_postdata()

  wp_reset_query()

  rewind_posts()

  使用wp_reset_postdata()重置文章数据

  使用WP_Query新建自定义循环或使用了多个循环时,请使用wp_reset_postdata()来重置文章数据,这个函数将全局变量$post变量还原到主查询中的当前帖子。如果我们在进行WordPress开发时遵循了最佳实践,该函数是用来重置循环的最常见函数。

  建议在使用了WP_Query类新建了查询和循环时,都要使用wp_reset_postdata()函数重置文章数据。

  下面是使用WP-Query类新建了查询和循环后,使用wp_reset_postdata()还原文章数据的示例代码。

  <?php

  //WP_Query所使用的参数

  $args=array('posts_per_page'=>3);

  //调用WP_Query新建文章查询.

  $the_query=new WP_Query($args);

  if($the_query->have_posts()):

  //开始循环

  while($the_query->have_posts()):$the_query->the_post();

  the_title();

  the_excerpt();

  //结束循环

  endwhile;

  else:

  _e('抱歉,未找到您需要的文章。','textdomain');

  endif;

  wp_reset_postdata();

  ?>

  使用wp_reset_query()重置主循环和文章数据

  因为query_posts()函数新建的循环是一个主循环,在使用了这个函数新建查询后,我们必须使用wp_reset_query()来还原查询和文章数据。如果使用了WP_Query新建查询,我们可以使用wp_reset_query()函数来还原文章数据(因为该函数已经调用了wp_reset_postdata()函数),但是最好的做法是使用wp_reset_postadata函数来还原使用WP_Query新建的文章循环。

  因为query_posts()会新建一个主循环来替代当前页面的主循环,使用这个函数会带来一些副作用,新建循环是,我们尽量使用WP_Query按不是query_posts函数。

  更多技术教程,请关注技术教程网www.jishujc.com