我们可以通过terms_clauses
filter 在执行SQL查询之前。我们将要做的是引入一个名为wpse_parents
它将接受一个父项ID数组以从中获取子项。注意,此新参数的工作方式与内置参数完全相同,parent
, 因为它将只返回父级的直接子级。
过滤器对代码进行了注释,以便于理解和基本描述特定代码的作用。注意,所有代码至少需要PHP 5.4
add_filter( \'terms_clauses\', function ( $pieces, $taxonomies, $args )
{
// Bail if we are not currently handling our specified taxonomy
if ( !in_array( \'speight_plans\', $taxonomies ) )
return $pieces;
// Check if our custom argument, \'wpse_parents\' is set, if not, bail
if ( !isset ( $args[\'wpse_parents\'] )
|| !is_array( $args[\'wpse_parents\'] )
)
return $pieces;
// If \'wpse_parents\' is set, make sure that \'parent\' and \'child_of\' is not set
if ( $args[\'parent\']
|| $args[\'child_of\']
)
return $pieces;
// Validate the array as an array of integers
$parents = array_map( \'intval\', $args[\'wpse_parents\'] );
// Loop through $parents and set the WHERE clause accordingly
$where = [];
foreach ( $parents as $parent ) {
// Make sure $parent is not 0, if so, skip and continue
if ( 0 === $parent )
continue;
$where[] = " tt.parent = \'$parent\'";
}
if ( !$where )
return $pieces;
$where_string = implode( \' OR \', $where );
$pieces[\'where\'] .= " AND ( $where_string ) ";
return $pieces;
}, 10, 3 );
请注意,过滤器的构建方式不允许
parent
和
child_of
正在设置的参数。如果设置了这些参数中的任何一个,则过滤器会提前卸载,并且不会应用
基本用法
如果需要查询术语15和16中的子术语,可以运行以下查询来实现您的目标
$args = [
\'wpse_parents\' => [15, 16]
];
$terms = get_terms( \'speight_plans\', $args );