WordPress 自定义查询 – 多个循环

已发表: 2021-01-29

在大多数情况下,使用 WordPress 构建网站时,您激活的主题将默认显示一个列出您最近发布的帖子的首页,除非您从“设置”>“阅读”下的管理选项中选择显示静态页面。 但是,如果您想显示既不是静态页面也不是您的最新帖子的不同范围的内容怎么办? 幸运的是,使用 WordPress 多重循环可以做到这一点。

让我们看看这是如何实现的!

在您的 WordPress 主页上使用多个循环

在我们开始之前,值得注意的是,您应该使用子主题对您自己的网站进行这些修改,因为我们将编辑您主题的模板文件。 如果您不这样做,您会发现下次更新主题时所做的任何修改都将丢失。 您可以在此处找到有关儿童主题的更多信息。

无论您使用什么主题,主页的相应 PHP 文件都将包含一个标准循环,显示一些帖子(在大多数情况下,这将是最近发布的帖子)。 例如,在 Twenty Twenty 主题中,您会在index.php文件的第 79 行附近找到控制它的代码。

 if ( have_posts() ) { $i = 0; while ( have_posts() ) { $i++; if ( $i > 1 ) { echo '<hr class="post-separator styled-separator is-style-wide section-inner" aria-hidden="true" />'; } the_post(); get_template_part( 'template-parts/content', get_post_type() ); } }

在这样的标准循环中,使用了两个重要的全局变量:

  • $wp_queryWP_Query类对象并保存 WP 数据库查询结果
  • $post是当前的WP_Post类对象。

在上面的代码中,我们首先使用have_posts()全局函数检查是否有任何帖子要显示,如果有,则在 while 循环中遍历这些帖子。 the_post()全局函数是遍历帖子的函数,告诉 WordPress 转到下一个帖子。

如果您想详细了解这些函数和类,可以在wp-includes/class-wp-query.php文件中找到它们。

出于我们示例的目的,我们激活了二十二十个主题,然后在名为“类别 1”的类别下创建了 6 个帖子,在名为“服务”的类别下创建了 5 个服务帖子。

为了简单起见,我们将通过仅显示帖子标题列表来使循环代码尽可能简单。

 if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h3 class="entry-title">', '</h3>' ); } }

这意味着在我们的主页中,我们将看到如下内容:

开始定制我们的主页输出

正如我们从上面的屏幕截图中看到的,如果我们访问我们的“首页”,我们将看到 10 个最新的帖子,而不管分配给它们的类别如何。

我们现在将继续创建我们自己的自定义主页模板,我们将在其中包含自定义输出。

为此,请创建一个名为custom-homepage.php的文件并将其保存在主题的文件夹中。 将以下代码添加到此页面:

 <?php /* * Template Name: My custom homepage template */ get_header(); if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h4 class="example"></h4>' ); } } get_footer();

然后,前往您的 WordPress 管理员并创建一个名为“我的主页”的页面,然后从“模板”下拉菜单中选择“我的自定义主页模板”作为模板。

然后要将其设为默认主页,您需要在“设置”菜单(设置 > 阅读 > 静态页面)中选择它。

此时,如果您查看您的主页,您应该只看到从网站前端查看的页面标题。

现在我们已经完成了这个设置,让我们在“我的自定义主页模板”模板中添加一些查询。

添加自定义查询

我们在此示例中的目标是显示所有类别的一些最新帖子。 在此下方,我们将显示来自名为“书籍”的自定义帖子类型的帖子。 如果您不知道如何设置自定义帖子类型,请查看文章“手动创建 WordPress 自定义帖子类型”。 包括自定义帖子类型当然是完全可选的。 如果您不想这样做,那么只需跳过我们引用此帖子类型的步骤。

让我们首先用这个替换当前循环(在index.php中的第 79 行左右):

 $args = array( 'posts_per_page' => 8, 'orderby', 'date', 'order', 'DESC' ); $query = new WP_Query( $args ); while ( $query->have_posts() ) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

这个循环意味着您的主页现在将显示您最近的 8 个帖子(如下所示):

然后,如果您想包含自定义帖子类型“书籍”(或任何其他自定义帖子类型),我们将在第一个循环下方为书籍帖子添加第二个循环,如下所示:

 echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', 'posts_per_page' => 8 ); $query = new WP_Query( $args ); while ($query->have_posts()) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

前往您网站的前端并刷新页面以确认一切正常。

拆分自定义查询

将自定义查询分成几部分会很有用。 这样做的一个原因是,如果您想在恢复初始循环之前通过显示来自另一个类别或帖子类型的帖子来“中断”第一个查询。 例如,如果您想显示某个类别的最新帖子,然后在最后以更多“最新帖子”结束页面结束之前显示其他内容,这很有用。

让我们跳进去。 首先,删除我们之前使用的custom-homepage.php文件的内容并添加以下代码。

 <?php /* * Template Name: My custom homepage template */ get_header(); //////////// // Services Posts loop echo '<h4>Services</h4>'; $args = array( 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Books Posts in between echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', ); $books = new WP_Query( $args ); while ( $books->have_posts() ) : $books->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Resume Services Posts loop echo '<h4>More Services</h4>'; $args = array( 'offset' => '3', 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; //////////// get_footer();

在第一个循环中,我们从服务类别中检索 3 个帖子。 为了在第三个循环中恢复服务类别帖子同时避免重复,我们定义了一个偏移量=> 3 。 这意味着我们会看到以下内容:

当然,您可以将偏移值更改为您想要的任何数字。

将自定义帖子添加到最新帖子查询

如果我们想在主页最新帖子中包含书帖怎么办? 默认情况下,默认循环不包含自定义帖子。 这是我们如何解决这个问题。

对于本节,我们将主页的阅读设置设置为“您的最新帖子”。

这里要遵循的路线是使用pre_get_posts钩子。 这个钩子在wp-includes/class-wp-query.php文件中引入,用于自定义$query对象和主 WordPress 循环,你认为合适。 它在创建查询变量对象之后但在实际查询运行之前执行。

打开活动主题的functions.php文件并在末尾插入以下代码:

 function homepage_add_cpt( $query ) { if ( $query->is_main_query() && is_home() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } add_action( 'pre_get_posts', 'homepage_add_cpt' );

此代码在if条件中所做的是确保仅在主查询运行时将修改应用于主页。

如果您现在访问您的主页,您会注意到在最新帖子中,还包括自定义“书籍”帖子。

结论

几乎无一例外,您在 WordPress 主页的内容方面需要实现的任何目标都是可能的。 正如我们在这里所展示的,使用 WordPress 多循环是自定义主页上显示的输出的强大方法。 我们的方法只是众多方法之一。 WordPress 对出现在您网站上的输出提供了令人难以置信的控制级别。 尝试使用他们提供的工具来实现您想要的!