如何只列出分类的子项而不列出它们的父项?

时间:2011-07-24 作者:Andrew

我在admin中创建了一个年龄选择菜单,它是根据age. 分类法的层次结构如下:

18-25岁(父母,身份证183)18岁(子女)19岁(父母,身份证184)26-30岁(父母,身份证27我只想列出孩子(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>\';
?> 

5 个回复
最合适的回答,由SO网友:Manny Fleurmond 整理而成

这应该适合您:

$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>\';

SO网友:karimhossenbux

您还可以执行以下操作:

$terms = get_terms($taxonomyName);
foreach($terms as $term) {
    if ($term->parent != 0) { // avoid parent categories
        //your instructions here
    }
}
我注意到父级的“parent”字段等于0,子级的父级id在其中。

SO网友:Pieter Goosen

我们可以通过使用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() 不接受术语名称、only、slug、ID或完整的术语对象。对于性能,始终将术语“对象”传递给get_term_link() 如果术语对象可用(如本例所示)

SO网友:Yaron

为什么你不能设置childless 参数是否为true?

$ages = get_terms( array(
    \'taxonomy\' => \'age\',
    \'childless\' => true
    )
);

SO网友:Jakir Hossain

如果显示多个父级的子级,可以尝试此操作。显示提及术语ID子术语。

$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>\';
    }
  }
}

结束

相关推荐

get_terms return errors

嗨,当我尝试get_terms(); 通过此代码在主题选项中$catalogs_terms = get_terms( \'catalogs\' ); $mycatalogs = array( -1 => \'Select a catalog\' ); if ( $catalogs_terms ) { foreach ( $catalogs_terms as $catalog_term ) { $mycatalogs[$cata