在本系列的前几部分中,您已经了解了 WP_Query 它的结构以及它的属性和方法是什么。下一阶段是了解您可以使用的各种参数以及如何最好地使用它。
WP_Query 有大量可能的参数,这使得它非常灵活。由于您可以使用它来查询 wp_posts 表中保存的几乎所有内容,因此它为您可能希望在内容上运行的每个查询排列提供参数。
在本教程中,我将介绍类别和标签的两种类型的参数。这两种分类法的论点相似,但如果您要有效地使用它们,您需要了解一些差异。
论据如何运作的回顾 WP_Query
在我们开始之前,让我们快速回顾一下参数是如何工作的 WP_Query。当您 WP_Query 在主题或插件中编码时,您需要包含四个主要元素:
查询的参数,使用将在本教程中介绍的参数
查询本身
循环
完成:重置帖子数据
在实践中,这将类似于以下内容:
<?php $args = array( // Arguments for your query. ); // Custom query. $query = new WP_Query( $args ); // Check that we have query results. if ( $query->have_posts() ) { // Start looping over the query results. while ( $query->have_posts() ) { $query->the_post(); // Contents of the queried post results go here. } } // restore original post data. wp_reset_postdata(); ?>
参数告诉wordpress从数据库中获取哪些数据,我将在这里介绍这些数据。所以我们在这里只关注代码的第一部分:
$args = array( // Arguments for your query. );
如您所见,参数包含在一个数组中。在完成本教程时,您将学习如何对它们进行编码。
编码你的论点
对数组中的参数进行编码有一种特定的方法,如下所示:
$args = array( 'parameter1' => 'value', 'parameter2' => 'value', 'parameter3' => 'value' );
您必须将参数及其值括在单引号中, => 在它们之间使用,并用逗号分隔它们。如果您弄错了,WordPress 可能不会将您的所有参数添加到查询中,或者您可能会得到一个白屏。
类别参数
让我们从类别参数开始。您在此处的选项如下:
cat ( int ): 使用类别 ID。
category_name (字符串):使用类别 slug(不是名称)。
category__and (数组):使用类别 ID。
category__in (数组):使用类别 ID。
category__not_in (数组):使用类别 ID。
请注意,对于这些,您都没有使用您的类别的名称。甚至 category_name 参数也将 slug 作为其值,而不是其名称。我倾向于使用这个而不是 ID,因为当我稍后回到我的代码时, slug比 ID 更容易识别。但是,如果您认为您的站点用户可能会更改一个或多个类别的 slug,我建议使用 ID 以避免任何问题。
让我们来看看你如何使用这些。
cat 参数_
该 cat 参数很简单:只需使用单个类别 ID 或一串类别 ID。
查询一个类别如下所示:
$args = array( 'cat' => '12' );
查询多个类别如下所示:
$args = array( 'cat' => '12, 13, 14' );
以上将告诉 WordPress 获取列出的任何类别中的帖子。如果您想在一系列类别中的每个类别中查找帖子,请使用 category_and 参数,其中更简短。
您还可以使用该 cat 参数来查找属于一个类别但不在另一个类别中的帖子,方法是在类别 ID 前使用减号,如下所示:
$args = array( 'cat' => '12, -13' );
以上将查询类别 12 中的帖子,而不是类别 13 中的帖子。
category_name 参数_
该 category_name 参数使用类别 slug,而不是名称(令人困惑,我知道!)。同样,您可以将它与单个类别或一系列类别一起使用,以查找任何类别中的帖子。
要查询单个类别中的帖子,请添加:
$args = array( 'category_name' => 'my-slug' );
要查找多个类别中的一个或多个类别的帖子,请使用以下命令:
$args = array( 'category_name' => 'my-slug, your-slug, another-slug' );
与 cat 参数一样,这不会找到 所有 类别中的帖子,但会找到 任何 类别中的帖子。
category__and 参数_
如果您想查找所有类别数组中的帖子,这就是您使用的参数。它采用类别 ID 作为其值。因此,要查找所有三个类别的帖子,您可以使用:
$args = array( 'category__and' => array( '12', '13', '14' ) );
请注意,这使用的是数组而不是字符串,因此您对其进行了不同的编码。该参数的名称中有两个下划线:只使用一个,它将不起作用。
category__in 参数_
下一个参数在一个或多个类别数组中查找帖子。它实际上与参数的工作方式相同 cat ,并且也将类别 ID 作为其值。
因此,要查询一个或多个类别数组中的帖子,您可以使用:
$args = array( 'category__in' => array( '12', '13', '14' ) );
以上将从这些类别中的一个或多个中获取帖子。
category__not_in 参数_
该 category__not_in 参数的作用与您期望的一样:它查询不在类别或类别数组中的帖子。
要从一个类别中排除帖子,您将使用以下内容:
$args = array( 'category__not_in' => '12' );
并从一系列类别中排除帖子:
$args = array( 'category__not_in' => array( '12', '13', '14' ) );
这将排除任何这些类别的帖子。
标签参数
标签的参数与类别略有不同:恐怕您无法根据您对类别参数的了解来确定它们可能是什么!
标签参数为:
tag ( string ): 使用标签 slug。
tag_id ( int ): 使用标签 ID。
tag__and (数组):使用标签 ID。
tag__in (数组):使用标签 ID。
tag__not_in (数组):使用标签 ID。
tag_slug__and (数组):使用标签 slug。
tag_slug__in (数组):使用标签 slug。
让我们来看看这些。
tag 参数_
该 tag 参数将标签 slug 作为其值,可用于查找具有一个标签或任何一串标签的帖子。
因此,要查找带有一个标签的帖子,您可以使用:
$args = array( 'tag' => 'my-tag' );
并从标签数组中查找带有标签的帖子:
$args = array( 'tag' => 'my-tag, your-tag, another-tag' );
请注意,上述查询使用 数组中的任何 标签发布,而不是所有标签。
tag_id 参数_
该 tag_id 参数的工作方式与 cat 参数类似:它采用标签 ID,可以与单个标签或多个标签一起使用。
要查找具有单个标签的帖子,请使用以下命令:
$args = array( 'tag_id' => '21' );
要从一串标签 ID 中查找具有一个或多个标签的帖子:
$args = array( 'tag_id' => '21, 22, 23' );
您还 tag_id 可以在将其用于单个标签或多个标签时使用排除标签。
因此,要查询除具有给定标签的帖子之外的帖子,您可以使用:
$args = array( 'tag_id' => '-21' );
虽然要查找具有两个标签之一但没有另一个标签的帖子,但您可以使用:
$args = array( 'tag_id' => '21, -22, 23' );
因此,上面将查询带有标签 21 或 23 中的一个或两个标签但不包含标签 22 的帖子。
tag__in 参数_
此参数可让您查找带有一个或多个标签数组的帖子。它的工作方式 tag 与使用数组时相同:
$args = array( 'tag_in' => array( '21', '22', '23' ) );
这将查询带有列出的任何或所有标签的帖子。如果您想查找带有所有标签的帖子,请使用 tag__and,我稍后会介绍。
tag__not_in 参数_
该 tag__not_in 参数允许您查询没有给定标签或标签数组的帖子。
像这样使用它来排除一个标签:
$args = array( 'tag__not_in' => array( '21' ) );
请注意,即使您只使用一个标签,您仍然需要使用数组。如需更多标签,请使用:
$args = array( 'tag__not_in' => array( '21', '22', '23' ) );
这将查询没有上述任何标签的帖子。
tag_slug__and 和 tag_slug__in 参数_
这两个参数的行为方式与 tag__and 和 tag__in 参数完全相同,只是您在数组中使用该标签块而不是标签 ID。
因此,例如,要查找同时具有一对标签的帖子,您可以使用 tag__slug_in:
$args = array( 'tag_slug__in' => array( 'my-tag', 'your-tag', 'another-tag' ) );
这会查找带有任何这些标签的帖子。您还可以将 tag 参数与一串标记 slug 一起使用来实现相同的结果。
要包含具有所有一组标签的帖子,请使用 tag_slug__and:
$args = array( 'tag_slug__and' => array( 'my-tag', 'your-tag', 'another-tag' ) );
这不是查询带有任何标签的帖子,而是仅查询具有 所有 标签的帖子。
类别和标签的高级使用 WP_Query
WP_Query让我们根据本文评论中提出的问题来看看类别和标签参数的一些高级用法 。
列出类别的子类别
要列出给定类别的子类别(每个类别都有一个指向子类别档案的链接),您不会使用 WP_Query. 相反,您会使用 wp_list_categories(),它会输出一个类别列表,其中包含指向其档案的链接。要输出特定类别的子类别,请使用 ‘child_of' 参数。
这是代码:
<?php $args = array ( ‘child_of’ => 5 ); wp_list_categories( $args ); ?>
将上面代码中的替换 5 为您要列出其子类别的类别的 ID。
在一个元素中显示某个类别的第一个帖子,然后在另一个元素中显示更多帖子
如果您想突出显示某个类别中的最新帖子(可能包括该帖子的摘录和特色图片),然后显示该类别中接下来几篇帖子的列表,这是一种有用的技术。
您可以使用 'posts_per_page'and 'offset' 参数来做到这一点。
最简单的方法是编写两个单独的查询。第一个用于 'posts_per_page' => 1 获取第一个帖子。第二个查询用于'offset' => 1 在第一个帖子之后获取帖子,也用于 'posts_per_page' 定义要输出的帖子数量。
这是代码:
<?php // first query - one post $args = array( 'cat' => 2, 'posts_per_page' => 1 ); // Custom query. $query = new WP_Query( $args ); // Check that we have query results. if ( $query->have_posts() ) { // Start looping over the query results. while ( $query->have_posts() ) { $query->the_post(); // Contents of the queried post results go here. } } // Restore original post data. wp_reset_postdata(); // second query - three posts $args = array( 'cat' => 2, 'posts_per_page' => 3, 'offset' => 1 ); // Custom query. $query = new WP_Query( $args ); // Check that we have query results. if ( $query->have_posts() ) { // Start looping over the query results. while ( $query->have_posts() ) { $query->the_post(); // Contents of the queried post results go here. } } // Rewind the query. rewind_posts(); ?>
另一种涉及较少数据库调用的替代方法是编写一个查询,然后第二次循环返回该查询,倒回查询并使用变量来确保第一个循环的 post 输出不重复。
您可以在我们关于该主题的教程中找到更多关于 对多个循环使用一个查询的信息。
显示来自多个类别的帖子
如果要显示给定类别以及一个或多个其他类别中的帖子,请使用 cat and category__in 参数。对于其中的每一个,您都使用类别 ID。
想象一下,您希望您的帖子属于第 1 类以及第 2、3 和 5 类中的一个或多个。
以下是您将为此使用的参数:
$args = array( 'cat' => '1', 'category__in' => array ( '2', '3', '5' ) );
概括
按类别和/或标签查询您的帖子是您很有可能遇到的事情 WP_Query。通过使用上面的参数,并在必要时将它们组合起来,您可以创建强大的参数来准确地从数据库中提取您需要的数据。
- 编码你的论点
- cat 参数_
- category_name 参数_
- category__and 参数_
- category__in 参数_
- category__not_in 参数_
- tag 参数_
- tag_id 参数_
- tag__in 参数_
- tag__not_in 参数_
- tag_slug__and 和 tag_slug__in 参数_
- 列出类别的子类别
- 在一个元素中显示某个类别的第一个帖子,然后在另一个元素中显示更多帖子
- 显示来自多个类别的帖子