到目前为止,您已经了解了WP_Query
的结构以及其属性和方法。 现在,我们正在研究可与WP_Query
使用的各种参数,以及如何对它们进行编码。
WP_Query
具有大量可能的参数,这使其非常灵活。 由于您可以使用它查询几乎所有wp_posts
表中保存的wp_posts
,因此它为您可能希望在内容上运行的每个查询排列提供参数。
在本教程中,我将研究用于查询分类术语的参数。
WP_Query中的参数工作原理回顾
在开始之前,让我们快速回顾一下WP_Query
参数如何工作。 在主题或插件中编码WP_Query
时,需要包括四个主要元素:
- 查询参数,使用本教程将介绍的参数
- 查询本身
- 循环
- 完成:关闭
if
和while
标签并重置发布数据
实际上,这将类似于以下内容:
<?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可能不会将所有参数添加到查询中,或者会出现白屏。
分类参数
由于使用tax_query
为分类术语设置参数要比为类别和标记设置更为复杂。 在此参数中,您编写了一个嵌套的参数数组,以使用以下参数指定分类法和术语:
-
taxonomy
( 字符串 ):分类法。 -
field
( 字符串 ):通过('term_id
(默认),'name'
或'slug'
)选择分类术语。 -
terms
( int / string / array ):分类术语。 -
include_children
( boolean ):是否将孩子包括在分级分类法中。 默认为true。 -
operator
( string ):要测试的运算符。 可能的值为'IN'
(默认),'NOT IN'
,'AND'
。
拥有operator
参数的事实意味着您无需从一系列可用参数中进行选择来定义是否要包含或排除术语(就像对标记和类别所做的那样),而是对所有分类法使用tax_query
相关。
如果要查询多个分类法,还可以在与AND
或OR
所有数组(每个分类法一个)之前使用relation
参数,以指定要查找包含所有术语还是其中任何术语的帖子。
用一些示例最容易解释。
查询一个分类术语
这是最简单的方案,只涉及使用一个嵌套数组:
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'my-taxonomy',
'field' => 'slug',
'terms' => 'my-term-slug',
)
)
);
上面的查询用于在my-taxonomy
法分类中使用“ my-term-slug
帖子。 请注意,除非您使用默认的术语ID,否则还需要使用field
参数来识别用于标识术语的字段。 如果您想使用术语ID,则可以使用以下代码:
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'my-taxonomy',
'terms' => '11'
)
)
);
使用ID使您日后很难确定查询的内容,但是如果您认为用户可以编辑词条,则可以避免任何潜在的问题。
在一种分类法中查询多个术语
如果要使用同一分类法中的一个或多个术语数组来标识帖子,则仍可以编写一个嵌套数组,但添加一个术语数组。
例如,要使用分类中的任何术语ID列表查询帖子,请使用:
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'my-taxonomy',
'terms' => array(
'11',
'12'
)
)
)
);
但是,如果您想查询所有这些术语的帖子,该怎么办? 您需要在嵌套数组中使用operator
参数:
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'my-taxonomy',
'terms' => array(
'11',
'12'
),
'operator' => 'AND'
)
)
);
请注意,第一个示例实际上使用IN
运算符查找带有任何术语的帖子,但是由于这是默认设置,因此您不必在参数中指定它。
另一种情况是,如果您要查询一种分类法中没有一系列术语的帖子,您可以这样做:
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'my-taxonomy',
'terms' => array(
'11',
'12'
),
'operator' => 'NOT IN'
)
)
);
在这里,我用NOT IN
代替了AND
运算符,这意味着WordPress将查找没有数组中任何术语的帖子。
请注意,如果您更喜欢使用条形符号而不是术语ID,则可以在任何这些情况下使用。 最后一个示例如下所示:
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'my-taxonomy',
'field' => 'slug',
'terms' => array(
'my-slug',
'your-slug'
),
'operator' => 'NOT IN'
)
)
);
另一种情况是,如果您要查询具有一个术语但没有另一个术语的帖子。 这将使用IN
运算符(您不需要将其包括在内,因为它是默认值),在要排除的任何术语的ID之前带有减号:
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'my-taxonomy',
'terms' => array(
'11',
'-12'
)
)
)
);
这查询的是第11期而不是第12期的帖子。
从多个分类法中查询术语
如果要使用多个分类法,则需要创建多个数组。 让我们看一个最简单的示例,查询一个带有来自taxonomy1的术语和一个来自taxonomy2的术语的帖子:
$args = array(
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'taxonomy1',
'field' => 'slug',
'terms' => array( 'slug-one' )
),
array(
'taxonomy' => 'taxonomy2',
'field' => 'slug',
'terms' => array( 'slug-two' )
)
)
);
在这里,我编写了两个嵌套数组:每个分类法一个,使用与仅使用一个分类法的示例相同的参数。 在这些之前,我先提到了relation
参数。 您需要包含relation
参数,以告诉WordPress是要查找每个数组输出的全部还是部分帖子。 其工作原理如下:
- 如果您使用
'relation' => 'AND'
,则WordPress将获取第一个数组和第二个数组中指定的帖子。 因此在上面的例子中,只有同时与职位slug-one
在塞taxonomy1
和slug-two
塞在taxonomy2
将被查询。 - 如果您使用
'relation' => 'OR'
,则WordPress将获取第一个数组或第二个数组输出的帖子。 因此,在这种情况下,您将获得带有“slug-one
子弹或“slug-two
子弹(或两者)的帖子。
如果要查找带有两个子弹之一的帖子,这是您将使用的代码:
$args = array(
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'taxonomy1',
'field' => 'slug',
'terms' => array( 'slug-one' )
),
array(
'taxonomy' => 'taxonomy2',
'field' => 'slug',
'terms' => array( 'slug-two' )
)
)
);
您还可以通过将给定分类法添加到数组中来查找多个术语:
$args = array(
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'taxonomy1',
'field' => 'slug',
'terms' => array( 'slug-one' )
),
array(
'taxonomy' => 'taxonomy2',
'field' => 'slug',
'terms' => array(
'slug-two',
'slug-three'
)
)
)
);
通过还使用operator
将relation
参数与嵌套查询结合使用,可以创建非常复杂的查询。 下面的参数将查询具有一个分类法中的术语但不具有来自另一分类学中的术语的帖子:
$args = array(
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'taxonomy1',
'field' => 'slug',
'terms' => array( 'slug-one' ),
'operator' => 'NOT IN'
),
array(
'taxonomy' => 'taxonomy2',
'field' => 'slug',
'terms' => array( 'slug-two' )
)
)
);
请注意,我在这里使用了'relation' => 'AND'
:如果使用OR
,它将查询带有“ slug-two
和没有“ slug-one
帖子,而不是具有“ slug-two
但没有“ slug-one
帖子,这就是我想要的。
可以想象,您可以根据需要进一步查询分类法的术语:在两个嵌套查询中都使用operator
参数,或者在另一个分类法中添加附加的嵌套查询来查询术语。
关于税收论点的注释
您可能想知道为什么我没有包含{tax}
参数,您只需在其中编写如下参数即可:
$args = array(
'taxonomy1' => 'slug-one'
);
如果您过去曾经做过查询分类法的方法,那么您可能已经很熟悉了,但是现在已经过时了,您不应该使用它。 因此,坚持使用'tax_query'
! 无论如何,使用tax_query
给您带来更大的灵活性。
摘要
查询分类法比类别和标签要复杂一些,因为您需要掌握tax_query
参数。
但是,正如我们所看到的,这是一个非常强大的参数,它为您提供了很大的范围和灵活性,可以以您希望的任何方式查询数据库。
翻译自: https://code.tutsplus.com/tutorials/wp_query-arguments-taxonomies--cms-23090