Как перечислить только дочерние термины таксономии, а не их родителей?


Я создаю меню выбора возраста в администраторе, заполненное из таксономии 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>';
?> 
Author: Andrew, 2011-07-24

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>';
 18
Author: Manny Fleurmond, 2016-03-16 06:47:42

Вы также можете сделать:

$terms = get_terms($taxonomyName);
foreach($terms as $term) {
    if ($term->parent != 0) { // avoid parent categories
        //your instructions here
    }
}

Я заметил, что у родителя поле "родитель" равно 0, а у ребенка в нем есть идентификатор родителя.

 14
Author: karimhossenbux, 2016-03-15 16:32:03

Мы можем исключить родителей верхнего уровня, отфильтровав их с помощью 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(), если объект термина доступен (, как в этом случае)

 5
Author: Pieter Goosen, 2016-03-16 06:44:41

Почему вы не можете просто установить аргумент childless в значение true?

$ages = get_terms( array(
    'taxonomy' => 'age',
    'childless' => true
    )
);
 2
Author: Yaron, 2016-10-19 23:20:19

Если вы отображаете ребенка нескольких родителей, вы можете попробовать это. Отображение идентификаторов терминов упоминания дочернего термина.

$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>';
    }
  }
}
 -1
Author: Jakir Hossain, 2015-12-30 15:33:20