web-dev-qa-db-ja.com

複数の親からの子供の言葉?

カスタムポストタイプをフィルタリングするために同位体を使用しています。しかし、私はただ2人の特定の両親の子供分類学が欲しいです。私はそれが1人の親のためにうまく働くことを持っています、しかし私は2人の親を考慮に入れるためにどのように配列を修正するべきかわかりません。

$terms = get_terms('speight_plans', array('parent' => 16)); // you can use any taxonomy, instead of just 'category'
    $count = count($terms); //How many are they?
        if ( $count > 0 ){  //If there are more than 0 terms
            foreach ( $terms as $term ) {  //for each term:
                echo '<button class="button" data-filter=".'.$term->slug.'">' . $term->name . '</button>';
                //create a list item with the current term slug for sorting, and name for label
            }
        }

やってみた

array('parent' => 16, 15));

しかし、それでもまだ親16の子供たちを示していました。

あなたが余裕があることができるどんな援助でも大いに感謝されるでしょう。

4
Laura Sage

SQLクエリが実行される前に、生成されたSQLクエリを terms_clauses filter でフィルタリングできます。これから行うことは、wpse_parentsと呼ばれる新しいパラメータを導入することです。これは、子を取得するための親用語IDの配列を受け入れます。この新しいパラメータは、組み込みパラメータparentとまったく同じように機能します。これは、親の直接の子のみが返されるためです。

フィルター

コードは、特定のコードが何をしているのかを簡単に理解し、基本的に説明するためにコメントされています。すべてのコードには少なくともPHP 5.4が必要です。

add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args )
{
    // Bail if we are not currently handling our specified taxonomy
    if ( !in_array( 'speight_plans', $taxonomies ) )
        return $pieces;

    // Check if our custom argument, 'wpse_parents' is set, if not, bail
    if (    !isset ( $args['wpse_parents'] )
         || !is_array( $args['wpse_parents'] )
    ) 
        return $pieces;

    // If  'wpse_parents' is set, make sure that 'parent' and 'child_of' is not set
    if (    $args['parent']
         || $args['child_of']
    )
        return $pieces;

    // Validate the array as an array of integers
    $parents = array_map( 'intval', $args['wpse_parents'] );

    // Loop through $parents and set the WHERE clause accordingly
    $where = [];
    foreach ( $parents as $parent ) {
        // Make sure $parent is not 0, if so, skip and continue
        if ( 0 === $parent )
            continue;

        $where[] = " tt.parent = '$parent'";
    }

    if ( !$where )
        return $pieces;

    $where_string = implode( ' OR ', $where );
    $pieces['where'] .= " AND ( $where_string ) ";

    return $pieces;
}, 10, 3 );

ちょっと注意してください、フィルタはそれが設定されるparentchild_ofパラメータを許さないような方法で造られます。これらのパラメータのいずれかが設定されていると、フィルタは早期に無効になり適用されません。

基本的な使い方

第15項と第16項の子用語をクエリする必要がある場合は、次のクエリを実行して目的を達成できます。

$args = [
    'wpse_parents' => [15, 16]
];
$terms = get_terms( 'speight_plans', $args );
2
Pieter Goosen

get_term_children()関数について考えることができます。その関数を2回使用して、2つの親用語の2つの子配列のIDを取得できます。それから、それらを1つの配列にマージしてその配列をget_termsに渡すことができます。

get_terms('speight_plans', array('include' => $child_terms_arr));
0
Tung Du