问题描述
我在管理员中创建一个年龄选择菜单,由 age
的分类组成。分类法分层如下:
-
18-25 岁 (父母,身份证号 183)
-
18(小孩)
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
-
26-30(父母,184 号)
-
26
-
27
-
28
-
29
-
三十
-
我只想列出孩子 (18,19 等等),而不是父母 (18-25,26-30) 等。目前我正在使用 get_terms
与 parent
参数,但它不接受超过 1 个父 ID 。这是我到目前为止,这显示了 18-25 岁的孩子。
$ages = get_terms( 'age', array(
'hide_empty' => 0,
'parent' => '183',
));
这是我想要的,但不支持。我也尝试过一个数组,但它也不工作。
$ages = get_terms( 'age', array(
'hide_empty' => 0,
'parent' => '183,184',
));
我看到有一个 get_term_children 函数,但我不确定如何使用它,因为它看起来像只接受一个值。例如:在这个例子中,它将构建一个无序的列表,但是我可以修改选择菜单。
<?php
$termID = 183;
$taxonomyName = "age";
$termchildren = get_term_children( $termID, $taxonomyName );
echo '<ul>';
foreach ($termchildren as $child) {
$term = get_term_by( 'id', $child, $taxonomyName );
echo '<li><a href="' . get_term_link( $term->name, $taxonomyName ) . '">' . $term->name . '</a></li>';
}
echo '</ul>';
?>
最佳解决方案
这应该适合你:
$taxonomyName = "age";
//This gets top layer terms only. This is done by setting parent to 0.
$parent_terms = get_terms( $taxonomyName, array( 'parent' => 0, 'orderby' => 'slug', 'hide_empty' => false ) );
echo '<ul>';
foreach ( $parent_terms as $pterm ) {
//Get the Child terms
$terms = get_terms( $taxonomyName, array( 'parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false ) );
foreach ( $terms as $term ) {
echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';
}
}
echo '</ul>';
次佳解决方案
你也可以做:
$terms = get_terms($taxonomyName);
foreach($terms as $term) {
if ($term->parent != 0) { // avoid parent categories
//your instructions here
}
}
我注意到父母的”parent” 字段等于 0,一个小孩在其中有父 ID 。
第三种解决方案
我们可以通过使用 terms_clauses
筛选器在执行之前对 SQL 查询进行过滤来排除顶级父级。这样我们不需要在最终的 foreach
循环中跳过父母,因为它们不在返回的术语数组中,这样可以节省我们不必要的工作和编码
您可以尝试以下操作:
add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args )
{
// Check if our custom arguments is set and set to 1, if not bail
if ( !isset( $args['wpse_exclude_top'] )
|| 1 !== $args['wpse_exclude_top']
)
return $pieces;
// Everything checks out, lets remove parents
$pieces['where'] .= ' AND tt.parent > 0';
return $pieces;
}, 10, 3 );
要排除顶级父母,我们现在可以通过我们的参数数组来传递'wpse_exclude_top' => 1
。上面的过滤器支持新的 wpse_exclude_top
参数
$terms = get_terms( 'category', ['wpse_exclude_top' => 1] );
if ( $terms
&& !is_wp_error( $terms )
) {
echo '<ul>';
foreach ($terms as $term) {
echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';
}
echo '</ul>';
}
只是一个说明,get_term_link()
不接受术语名称,只有,slug,ID 或完整的术语对象。对于性能,如果术语对象可用 (如这种情况),始终始终将术语对象传递给 get_term_link()
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。