web-dev-qa-db-ja.com

分類法の子用語のみを一覧表示し、両親を一覧表示しない方法は?

管理者に年齢選択メニューを作成しています。これはageの分類法から移入されています。分類法は次のように階層的です。

  • 18〜25(親、ID 183)
    • 18歳(こども)
    • 19年
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25年
  • 26-30(親、ID 184)
    • 26
    • 27年
    • 28年
    • 29年
    • 30

現在、私はparent引数でget_termsを使用していますが、複数の親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 関数があるのを見ますが、それが1つの値しか受け取らないように見えるので、私はこれをどのように使うべきかわからないです。例:この例では番号なしリストを作成しますが、選択メニュー用に変更できます。

<?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>';
?> 
8
Andrew

これはあなたのために働くはずです:

$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>';
13
Manny Fleurmond

あなたもすることができます:

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

私は、親は0に等しい「親」フィールドを持ち、子供はその中に自分の親IDを持っていることに気付きました。

12
karimhossenbux

SQLクエリを実行する前に変更するために terms_clauses filterを使ってそれらを除外することでトップレベルの親を除外することができます。こうすることで、返された単語の配列に含まれていないため、最後の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() は用語名のみを受け付けません。スラッグ、ID、または完全な用語オブジェクトを受け入れません。パフォーマンスのために、オブジェクトという用語が利用可能であれば、常にオブジェクトという用語をget_term_link()に渡す(この場合のように

3
Pieter Goosen

なぜchildless引数をtrueに設定できないのですか?

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