web-dev-qa-db-ja.com

特定の投稿タイプにのみ属するタグを表示する

次のコードは現在、私のサイトのすべてのタグをインデックス付けしています(標準の投稿に追加されたか、カスタムの投稿に添付されているかを問わず) this

このコードを特定のカスタム投稿からのタグの索引付け(そしてそのカスタム投稿内の分類法)に限定したいのですが、最初のコードに必要な調整ができません($ argsと$ argsの設定方法がわかりません)。カスタム投稿にget_terms()を使うことはできないと思います)。

任意の提案をいただければ幸いです。

    $list = '';
$tags = get_terms( 'post_tag' );
$groups = array();
if( $tags && is_array( $tags ) ) {
    foreach( $tags as $tag ) {
        $first_letter = strtoupper( $tag->name[0] );
        $groups[ $first_letter ][] = $tag;
    }
    if( !empty( $groups ) ) {
        foreach( $groups as $letter => $tags ) {
            $list .= "\n" . '<div class="index-letter">' . apply_filters( 'the_title', $letter ) . '</div>';

            foreach( $tags as $tag ) {
                $url = attribute_escape( get_tag_link( $tag->term_id ) );
                $count = intval( $tag->count );
                $name = apply_filters( 'the_title', $tag->name );
                $list .= "\n" . '<li><a href="' . $url . '">' . $name . '</a> (' . $count . ')</li>';
                }
            $list .= "\n" . '</li>';
        }
    }
}else $list .= "\n" . '<p>Sorry, but no tags were found</p>';?>
2
Gecko Boy

私は/からの@StephenHarrisからの次のコードの使用に成功しました - この答え 。私はオリジナルのコードに少しTweakをしましたが、最も重要なのは、デフォルトで返されたオリジナルのcount_typeからCOUNT*に新しいcountオブジェクトに名前を付けることです。

つまり、この関数は、通常使用する get_terms とまったく同じように機能します。しかしながら、post_typeと呼ばれる追加の引数があり、投稿タイプ名の配列または文字列を受け付けます。 post_type引数が設定されている場合、関数はterms_clausesフィルタを使用してその特定の投稿タイプのみによる用語を取得します

NOTE:これまでに言及されていない投稿タイプを設定する際の大きな注意点として、この関数はキーcountと(現在はCOUNT*から命名される)count_typeを持つ2つのcountオブジェクトを返します。 countは、特定の投稿タイプの件数ではなく、特定の用語全体の投稿件数を取得します。与えられた投稿タイプの正しい数を表示するには、正しい数を表示するcount_typeを使用する必要があります。

例として、投稿タイプが設定されている場合に返されるオブジェクトは次のとおりです。

object(stdClass)#583 (10) {
  ["term_id"]=>
  string(3) "145"
  ["name"]=>
  string(7) "testing"
  ["slug"]=>
  string(7) "testing"
  ["term_group"]=>
  string(1) "0"
  ["term_taxonomy_id"]=>
  string(3) "145"
  ["taxonomy"]=>
  string(8) "post_tag"
  ["description"]=>
  string(0) ""
  ["parent"]=>
  string(1) "0"
  ["count"]=>
  string(1) "4"
  ["count_type"]=>
  string(1) "2"
}

count4、これはすべての投稿タイプからの合計投稿数、count_type2、これは指定された投稿タイプ内の特定のタグを持つ投稿数です。

これがあなたのfunctions.phpに入るコードです。( やはり、元のコードのための@StephenHarrisに感謝します

function get_terms_per_post_type( $taxonomies, $args=array() ) {
    //Parse $args in case its a query string.
    $args = wp_parse_args($args);

    if( !empty( $args['post_type'] ) ){

        $args['post_type'] = (array)$args['post_type'];

        add_filter( 'terms_clauses', function ( $pieces, $tax, $args){
            global $wpdb;

            //Don't use db count
            $pieces['fields'] .= ", COUNT(*) AS count_type" ;

            //Join extra tables to restrict by post type.
            $pieces['join'] .= " INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id 
                                 INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id ";

            //Restrict by post type and Group by term_id for COUNTing.
            $post_type = implode( ',', $args['post_type'] );
            $pieces['where'] .= $wpdb->prepare( " AND p.post_type IN(%s) GROUP BY t.term_id", $post_type );

            remove_filter( current_filter(), __FUNCTION__ );

            return $pieces;

        }, 10, 3 );

    }

    return get_terms($taxonomies, $args);           
}

あなたはあなたのテンプレートファイルで次のようにそれを使うことができます

$terms = get_terms_per_post_type( 'post_tag', array( 'post_type' => 'post' ) );

foreach ( $terms as $term ) {
    echo "$term->name ( $term->count_type ) </br>";
}
2
Pieter Goosen