各位观众老爷,晚上好!我是你们的老朋友,今天咱们不聊风花雪月,就来硬核一把,深入挖掘一下 WordPress 的 WP_Term_Query
类,特别是如何通过 $args
参数来精准查询分类术语。 这玩意儿用好了,能让你在 WordPress 的分类世界里呼风唤雨,指哪打哪。
开场白:分类术语,WordPress 的灵魂伴侣
WordPress 的分类术语(Terms)是啥? 简单来说,就是分类(Category)、标签(Tag)这些玩意儿。 它们就像 WordPress 文章的灵魂伴侣,帮助我们组织、关联内容。 WP_Term_Query
类,就是 WordPress 提供给我们的利器,专门用来从数据库里捞这些灵魂伴侣的。
WP_Term_Query
类:你值得拥有的查询神器
WP_Term_Query
类位于 /wp-includes/class-wp-term-query.php
文件中,它是 WordPress 查询分类术语的官方方式。 别再用那些原始的 SQL 查询了,那太 low 了! WP_Term_Query
才是王道。
$args 参数:查询的万能钥匙
要用好 WP_Term_Query
,最重要的就是理解 $args
参数。 它可以让你指定各种查询条件,就像给搜索引擎下达指令一样。 $args
是一个数组,里面包含了各种查询选项。 咱们一个个来剖析。
1. 基本参数:术语筛选的基石
参数名称 | 数据类型 | 描述 | 示例 |
---|---|---|---|
taxonomy |
string/array | 指定分类法(Taxonomy)。 比如 ‘category’, ‘post_tag’, ‘custom_taxonomy’。 可以是单个字符串,也可以是字符串数组。 | 'taxonomy' => 'category' 或 'taxonomy' => array( 'category', 'post_tag' ) |
object_ids |
int/array | 限定只查询与某些对象(通常是文章)关联的术语。 传入文章 ID 或文章 ID 数组。 | 'object_ids' => 123 或 'object_ids' => array( 123, 456, 789 ) |
include |
int/array | 只查询指定 ID 的术语。 传入术语 ID 或术语 ID 数组。 | 'include' => 10 或 'include' => array( 10, 20, 30 ) |
exclude |
int/array | 排除指定 ID 的术语。 传入术语 ID 或术语 ID 数组。 | 'exclude' => 40 或 'exclude' => array( 40, 50, 60 ) |
exclude_tree |
int/array | 排除指定 ID 的术语及其所有子术语。 传入术语 ID 或术语 ID 数组。 | 'exclude_tree' => 70 或 'exclude_tree' => array( 70, 80, 90 ) |
number |
int | 返回的最大术语数量。 默认为空,表示返回所有符合条件的术语。 | 'number' => 5 |
offset |
int | 从结果集的哪个位置开始返回。 配合 number 参数使用,可以实现分页效果。 |
'offset' => 10 |
search |
string | 搜索术语名称。 会匹配术语的 name 字段。 |
'search' => '关键词' |
name__like |
string | 模糊匹配术语名称。 类似 search ,但更灵活。 |
'name__like' => '关键词' |
slug |
string/array | 根据别名(Slug)查询术语。 传入别名字符串或别名字符串数组。 | 'slug' => 'slug-name' 或 'slug' => array( 'slug-name-1', 'slug-name-2' ) |
name |
string/array | 根据名称查询术语。 传入名称字符串或名称字符串数组。 | 'name' => '分类名称' 或 'name' => array( '分类名称1', '分类名称2' ) |
hide_empty |
bool | 是否隐藏没有文章的术语。 默认为 false 。 |
'hide_empty' => true |
hierarchical |
bool | 是否只返回顶级术语。 如果分类法是分层结构的(比如分类),则有效。 默认为 true 。 |
'hierarchical' => false |
orderby |
string | 排序字段。 可以是 ‘name’, ‘slug’, ‘term_id’, ‘id’, ‘count’, ‘none’。 默认为 ‘name’。 | 'orderby' => 'count' |
order |
string | 排序方式。 可以是 ‘ASC’(升序)或 ‘DESC’(降序)。 默认为 ‘ASC’。 | 'order' => 'DESC' |
parent |
int | 只查询指定父级术语的子术语。 | 'parent' => 5 |
child_of |
int | 查询指定术语的所有子术语(包括多级子术语)。 | 'child_of' => 10 |
get |
string | 返回的数据类型。 可以是 ‘all’(返回所有术语对象),’id=>name’(返回 ID=>Name 数组),’id=>parent’(返回 ID=>Parent 数组),’count’(返回术语总数)。 默认为 ‘all’。 | 'get' => 'id=>name' |
update_term_meta_cache |
bool | 是否更新术语元数据的缓存。 默认为 true 。 |
'update_term_meta_cache' => false |
cache_domain |
string | 缓存域名。 用于区分不同的缓存组。 默认为 ‘core’。 | 'cache_domain' => 'my_custom_domain' |
pad_counts |
bool | 是否更新术语计数,包括其子术语的计数。 默认为 false 。 如果 hide_empty 为 true ,建议设置为 true 。 |
'pad_counts' => true |
示例代码:基本查询
<?php
$args = array(
'taxonomy' => 'category', // 查询分类
'number' => 5, // 返回最多 5 个分类
'orderby' => 'count', // 按文章数量排序
'order' => 'DESC', // 降序排列
'hide_empty' => true, // 隐藏没有文章的分类
);
$terms = new WP_Term_Query( $args );
if ( ! empty( $terms->terms ) ) {
echo '<ul>';
foreach ( $terms->terms as $term ) {
echo '<li><a href="' . esc_url( get_term_link( $term ) ) . '">' . esc_html( $term->name ) . ' (' . $term->count . ')</a></li>';
}
echo '</ul>';
} else {
echo '<p>没有找到分类。</p>';
}
?>
这段代码会查询文章分类(Category),返回文章数量最多的 5 个分类,并隐藏没有文章的分类,最后以列表的形式展示出来。
2. 高级参数:玩转复杂查询
除了上面这些基本参数,WP_Term_Query
还支持一些高级参数,可以让你实现更复杂的查询需求。
参数名称 | 数据类型 | 描述 | 示例 |
---|---|---|---|
meta_query |
array | 用于根据术语元数据进行查询。 meta_query 数组中的每个元素都是一个子数组,用于描述一个元数据查询条件。 这个参数非常强大,可以让你根据自定义的术语元数据进行各种复杂的查询。 |
php 'meta_query' => array( array( 'key' => 'my_custom_field', // 元数据键名 'value' => 'some_value', // 元数据值 'compare' => '=', // 比较运算符,可以是 '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS' 'type' => 'CHAR', // 元数据类型,可以是 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'UNSIGNED' ), array( 'key' => 'another_field', 'value' => array( 1, 2, 3 ), 'compare' => 'IN', 'type' => 'NUMERIC', ), ) |
name__in |
array | 查询名称包含在指定数组中的术语。 类似于 name 参数,但可以传入一个名称数组。 |
'name__in' => array( '名称1', '名称2', '名称3' ) |
slug__in |
array | 查询别名包含在指定数组中的术语。 类似于 slug 参数,但可以传入一个别名数组。 |
'slug__in' => array( 'slug1', 'slug2', 'slug3' ) |
term_id |
int | 精确匹配术语 ID。 不建议使用,建议使用 include 参数。 |
'term_id' => 123 |
term_taxonomy_id |
int/array | 根据 term_taxonomy_id 查询。 term_taxonomy_id 是 wp_term_taxonomy 表中的 ID,用于唯一标识一个术语在一个分类法中的关系。 通常情况下,你不需要直接使用这个参数。 |
'term_taxonomy_id' => 456 或 'term_taxonomy_id' => array( 456, 789 ) |
parent__in |
array | 查询父级术语 ID 包含在指定数组中的子术语。 | 'parent__in' => array( 5, 10, 15 ) |
childless |
bool | 如果为 true,则只返回没有子术语的术语。 仅在分层分类法中有效。 | 'childless' => true |
示例代码:使用 meta_query
进行高级查询
假设我们为每个分类添加了一个自定义字段 featured
,用于标记该分类是否为精选分类。 我们可以使用 meta_query
来查询所有精选分类:
<?php
$args = array(
'taxonomy' => 'category',
'meta_query' => array(
array(
'key' => 'featured', // 元数据键名
'value' => '1', // 元数据值(假设 1 表示精选)
'compare' => '=', // 精确匹配
'type' => 'NUMERIC', // 元数据类型为数字
),
),
);
$terms = new WP_Term_Query( $args );
if ( ! empty( $terms->terms ) ) {
echo '<ul>';
foreach ( $terms->terms as $term ) {
echo '<li><a href="' . esc_url( get_term_link( $term ) ) . '">' . esc_html( $term->name ) . '</a></li>';
}
echo '</ul>';
} else {
echo '<p>没有找到精选分类。</p>';
}
?>
这段代码会查询所有 featured
字段值为 1
的分类。
3. 性能优化:让查询飞起来
WP_Term_Query
虽然强大,但如果不注意,也可能导致性能问题。 以下是一些性能优化的建议:
- 尽量使用
include
参数: 如果只需要查询几个特定的术语,使用include
参数可以避免不必要的数据库扫描。 - 合理使用缓存:
WP_Term_Query
会自动缓存查询结果,但如果你的查询条件非常复杂,或者数据更新频繁,可能需要手动清理缓存。 可以使用wp_cache_delete()
函数来清理术语缓存。 - 避免在循环中进行查询: 尽量一次性查询所有需要的术语,而不是在循环中多次查询。
- 谨慎使用
meta_query
:meta_query
非常强大,但也可能导致性能问题。 尽量避免在meta_query
中使用复杂的查询条件,或者对没有索引的字段进行查询。 确保你的自定义元数据字段建立了索引。 update_term_meta_cache
参数: 如果你不需要使用术语的元数据,可以将update_term_meta_cache
设置为false
,可以提升查询性能。
总结:掌握 WP_Term_Query
,玩转 WordPress 分类
WP_Term_Query
类是 WordPress 查询分类术语的强大工具。 通过灵活使用 $args
参数,你可以实现各种复杂的查询需求。 掌握 WP_Term_Query
,你就能在 WordPress 的分类世界里自由驰骋,让你的网站内容组织更有条理,用户体验更上一层楼。
希望今天的讲座对大家有所帮助! 如果有什么疑问,欢迎随时提问。 咱们下期再见!