Как перечислить только дочерние термины таксономии, а не их родителей?
Я создаю меню выбора возраста в администраторе, заполненное из таксономии age
. Таксономия имеет следующую иерархию:
- 18-25 (родитель, идентификатор 183)
- 18 (ребенок)
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26-30 (родитель, идентификатор 184)
- 26
- 27
- 28
- 29
- 30
Я хотел бы только перечислите детей (18, 19 и т.д.), а не родителей (18-25, 26-30) и т.д. В настоящее время я использую get_terms
с аргументом parent
, но он не принимает более 1 идентификатора родителя. Вот что у меня есть на данный момент, на котором показаны дети от 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>';
?>
5 answers
Это должно сработать для вас:
$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
}
}
Я заметил, что у родителя поле "родитель" равно 0, а у ребенка в нем есть идентификатор родителя.
Мы можем исключить родителей верхнего уровня, отфильтровав их с помощью 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()
не принимайте имя термина, только, слаг, идентификатор или полный объект термина. Для повышения производительности всегда всегда передавайте объект термина get_term_link()
, если объект термина доступен (, как в этом случае)
Почему вы не можете просто установить аргумент childless
в значение true?
$ages = get_terms( array(
'taxonomy' => 'age',
'childless' => true
)
);
Если вы отображаете ребенка нескольких родителей, вы можете попробовать это. Отображение идентификаторов терминов упоминания дочернего термина.
$termIds = array(367, 366, 365, 364, 363, 362);
$taxonomyName = "age";
$args = array(
'orderby' => 'term_id',
'order' => 'DESC',
'hide_empty' => false,
'childless' => false,
);
$terms = get_terms( $taxonomyName, $args );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
$inc = 1;
foreach ( $terms as $term ) {
if (in_array($term->parent, $termIds)) {
echo '<option value="'.$term->term_id.'"><font><font>'.$term->name.'</font></font></option>';
}
}
}