次のコードは現在、私のサイトのすべてのタグをインデックス付けしています(標準の投稿に追加されたか、カスタムの投稿に添付されているかを問わず) 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>';?>
私は/からの@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"
}
count
は4
、これはすべての投稿タイプからの合計投稿数、count_type
は2
、これは指定された投稿タイプ内の特定のタグを持つ投稿数です。
これがあなたの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>";
}