分類法の子の用語のみをリストし、それらの親をリストする方法は?


9

adminで年齢の選択メニューを作成していますage。分類は次のように階層的です。

  • 18-25(親、ID 183)
    • 18(子供)
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 26-30(親、ID 184)
    • 26日
    • 27日
    • 28
    • 29日
    • 30

子(18、19など)のみをリストし、親(18-25、26-30)などはリストしません。現在get_termsparent引数を使用していますが、複数の親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>';
?> 

get_terms2回呼び出して、結果の2つの配列をマージしますか?
マークダンカン

@Markありがとう、このようにすることを考えましたが、IDを配列にマージしても、手動でリストするのと同じであるため、どのように機能するかわかりません。183、184、これはt動作します。
Andrew

受け入れられた回答を読んだ後、トップレベルのものを除くすべての用語が欲しいものの外観から、質問が完全に明確ではなかったことがわかりました(1回のget_terms呼び出しで実行できます)。あなたは.. 2つの特定の親用語のすべての子を望むたかのようにあなたの質問は読んで
マーク・ダンカン

回答:


14

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

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

@マニーに感謝し、御馳走を働いた。私はあなたが提供したものを取り、それを私が求めていた選択メニューにつぶしました。素晴らしいもの。
Andrew

問題ない。よかったです。
マニーフルールモンド、2011

1
より効率的な回答については、以下のkarimhossenbuxの回答を参照してください。
dotancohen 2016年

$term->nameは無効ですget_term_link()。ID、スラッグ、またはオブジェクトのみを受け入れます
Pieter Goosen

14

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

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

親には0に等しい「親」フィールドがあり、子にはその親IDがあることに注意しました。


4
受け入れられた回答は、N個のget_terms()呼び出しを実行し、多項式時間で実行されます。この回答は、単一のget_terms()呼び出しを実行し、線形時間で実行されます。これははるかに良い答えです。
dotancohen 2016年

@dotancohen出力で最上位の用語を除外せずにこれを行うことができますwpse_exclude_top。クエリ引数にパラメーターを追加して、最上位の用語を削除できます;-)。しかし、私は同意します。これは、受け入れられた回答よりも高速です
Pieter Goosen

1
@PieterGoosen:Pieterに感謝します。私は、文字列の4.4.2のソースコードをgrepped wpse_exclude_topexclude_topが、それらを見つけることができませんでした。グーグルもそれについて知りません。どこに記載されていますか?
dotancohen

1
@dotancohen私の答え;-)
Pieter Goosen

4

最上位の親を除外するには、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()ですが、スラッグ、ID、または完全な用語オブジェクトのみ、用語名は受け入れないでください。パフォーマンスのためにget_term_link()、用語オブジェクトが使用可能な場合は、常に用語オブジェクトを常に渡してください(この場合


2

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

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

childless引数をtrueに設定すると、深さは1レベルのみになるため、3レベル以上の分類では機能しません。
GeckoSEO

-1

複数の親の子を表示する場合は、これを試すことができます。言及用語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>';
    }
  }
}

1
このコードが機能する理由を説明してください。また、ハードコーディングされたソリューションが最善の方法ではないことも確信しています。
s_ha_dum

質問はIDで言及します。このため、関連する考えに答えました。
Jakir Hossain、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.