到目前為止,在本系列中,您已經了解了 WP_Query
的結構及其屬性和方法。現在我們正在研究可與 WP_Query
一起使用的各種參數以及如何對它們進行編碼。
WP_Query
有大量可能的參數,這使得它極其靈活。由於您可以使用它來查詢 wp_posts
表中保存的任何內容,因此它具有您可能想要在內容上執行的每個查詢排列的參數。
在本教程中,我將了解查詢分類術語的參數。
在開始之前,讓我們快速回顧一下參數在 WP_Query
中的工作原理。當您在主題或外掛程式中編寫 WP_Query
時,您需要包含四個主要元素:
if
和 class="inline">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
,因此為分類術語設定參數比為類別和標籤設定參數要複雜一些。在此參數中,您可以編寫一個巢狀的參數數組,以使用這些參數指定分類法和術語:
分類法
(字串):分類法field
(string): 選擇分類術語('term_id
(預設), 'name'
或'slug'
)terms
(int/string/array):分類術語include_children
(布林值):是否包含分層分類法的子級。預設為 true。 operator
(string): 要測試的運算子。可能的值為'IN'
(預設)、'NOT IN'
、'AND'
、'EXISTS'
、和「不存在」
。 您擁有operator
參數這一事實意味著您無需從一系列可用參數中進行選擇來定義是包含還是排除術語(就像對標籤所做的那樣)和類別),但可以使用tax_query
來取代所有與分類相關的內容。
如果您想要查詢多個分類法,您也可以在所有陣列(每個分類法一個)之前使用relation
參數,其中AND
或OR
指定您是要尋找包含所有術語還是其中任何術語的貼文。
透過一些例子可以很容易地解釋這一點。
這是最簡單的場景,只涉及使用一個巢狀數組:
$args = array( 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => 'tutorial', ) ) );
#上述查詢是針對 category
分類中包含 tutorial
術語的貼文。請注意,您還需要使用 field
參數來識別您使用哪個欄位來識別術語,除非您使用預設的術語 ID。如果您想使用術語 ID,您可以使用以下內容:
$args = array( 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => '11' ) ) );
#使用 ID 會使您以後更難確定查詢要查找的內容,但如果您認為使用者可能會編輯術語 slugs,則可以避免任何潛在問題。
如果您想識別具有同一分類中的一個或多個術語數組的帖子,您仍然可以編寫一個嵌套數組,但添加一組術語。
例如,要查询包含分类中任何术语 ID 列表的帖子,您可以使用:
$args = array( 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'terms' => [14, 17] ) ) );
但是如果您想查询包含这些术语的所有帖子怎么办?您需要在嵌套数组中使用 operator
参数:
$args = array( 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'terms' => [14, 17], 'operator' => 'AND' ) ) );
请注意,第一个示例实际上使用 IN
运算符来查找包含任何术语的帖子,但由于这是默认值,因此您不必在参数中指定它。 p>
另一种情况是,如果您想要查询在一个分类中没有任何术语数组的帖子,您可以这样做:
$args = array( 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'terms' => [14, 17], 'operator' => 'NOT IN' ) ) );
在这里,我将 AND
运算符替换为 NOT IN
,这意味着 WordPress 将查找数组中不包含任何术语的帖子。
请注意,如果您更喜欢使用 slugs 而不是术语 ID,则可以在任何这些场景中执行此操作。最后一个示例如下所示:
$args = array( 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => ['php', 'strings'], 'operator' => 'NOT IN' ) ) );
如果您想要使用多个分类法,则需要创建多个数组。让我们看一个最简单的示例,查询包含类别分类中的一个术语和标签分类中的一个术语的帖子:
$args = array( 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => ['tutorial'] ), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => ['javascript'] ) ) );
在这里,我编写了两个嵌套数组:每个分类法一个,使用与仅使用一种分类法的示例相同的参数。我在这些之前添加了 relation
参数。您需要包含 relation
参数来告诉 WordPress 是否正在查找每个数组输出的全部或部分帖子。其工作原理如下:
'relation' => 'AND'
,WordPress 将获取第一个数组和第二个数组中指定的帖子。因此,在上面的示例中,仅发布两者 类别中的 <code>tutorial
slug 和 中的 <code class="inline">javascript
slug post_tag 将被查询。
'relation' => 'OR'
,WordPress 将获取第一个数组或第二个数组输出的帖子。因此,在这种情况下,您将收到带有 tutorial
slug 或 javascript
slug(或两者)的帖子。如果您正在寻找包含这两个标签之一的帖子,则可以使用以下代码:
$args = array( 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => ['tutorial'] ), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => ['javascript'] ) ) );
您还可以通过将给定分类法添加到数组中来查找多个术语:
$args = array( 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => ['guide'] ), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => ['php', 'strings'] ) ) );
通过将 relation
参数与查询相结合,并使用 operator
参数,您可以创建复杂的查询。下面的参数将查询包含一个分类中的术语但不包含另一个分类中的术语的帖子:
$args = array( 'orderby' => 'title', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => ['tutorial'], 'operator' => 'NOT IN' ), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => ['php', 'math'], 'operator' => 'AND' ) ) );
请注意,我在这里使用了 'relation' => 'AND'
:如果我使用 OR
,它将使用 slug-two
和没有 slug-one
的帖子,而不是有 slug-two
但没有 slug 的帖子-one
,这就是我正在寻找的。p>
您可以根据需要进一步查询分类法的术语:在两个嵌套查询中使用 operator
参数,或添加额外的嵌套查询来查询另一个分类法中的术语。
您可以创建嵌套分类查询来创建更复杂的过滤器来获取您的帖子。在 4.1 版本中,WordPress 核心添加了对嵌套分类法的支持。更早地获得类似的结果要么要复杂得多,要么根本不可能。
$args = array( 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => ['guide'], ), array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => ['tutorial'], ), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => ['php', 'strings'], 'operator' => 'AND' ) ) ) );
上述查询将选择 category
分类下带有 guide
slug 的帖子,或者在 category
下具有 tutorial
slug 并具有 php
, stringsphpcnendc 的帖子<code>post_tag
下的 phpcn slug 组合.
tax
参数的注释您可能想知道为什么我没有包含 {tax}
参数,您只需按如下方式编写您的参数:
$args = array( 'taxonomy1' => 'slug-one' );
如果您过去曾经使用过这种查询分类法的方式,您可能会熟悉这种方式,但它现在已被弃用,并且您不应该使用它。所以坚持使用 tax_query
!无论如何,使用 tax_query
会给您带来更大的灵活性。
查询分类比类别和标签稍微复杂一些,因为您需要掌握 tax_query
参数。
但是,正如我们所看到的,这是一个非常有力的论点,它为您提供了很大的范围和灵活性,可以按照您希望的方式查询数据库。
这篇文章已根据 Nitish Kumar 的贡献进行了更新。 Nitish 是一名 Web 开发人员,拥有在各种平台上创建电子商务网站的经验。他将业余时间花在个人项目上,让他的日常生活变得更轻松,或者在晚上与朋友一起散步。
以上是使用WP_Query參數篩選分類法的詳細內容。更多資訊請關注PHP中文網其他相關文章!