web-dev-qa-db-ja.com

投稿タイプごとの分類数

以下は私がポストタグ(分類法)の数/数を出力するのに使うコードです。分類数の特徴である投稿の種類に基づいて(総数ではなく)数を分割できるようにします。

だから私はデフォルトの "post" Postタイプ、 "blogs"、& "pics"を持っています。タクソノミーカウントに次のようなものを表示したいと思います。 xブログ| ×写真

            <?php
            $tags = get_tags( array('name__like' => "a", 'order' => 'ASC') );
            foreach ( (array) $tags as $tag ) { ?>
                <li>                            
                    <a href="<?php echo get_tag_link( $tag->term_id ) ?>">          
                        <span class="name"><?php echo $tag->name ?></span>
                        <span class="number"><?php echo $tag->count ?></span>
                    </a>
                </li>
            <?php } ?>
3
Carpy

私はこの小さな関数を作成したので、私は用語ごとにタイプごとの投稿数を取得する必要がありました:

function get_term_post_count_by_type($term,$taxonomy,$type){
    $args = array( 
        'fields' =>'ids', //we don't really need all post data so just id wil do fine.
        'posts_per_page' => -1, //-1 to get all post
        'post_type' => $type, 
        'tax_query' => array(
            array(
                'taxonomy' => $taxonomy,
                'field' => 'slug',
                'terms' => $term
            )
        )
     );
    $ps = get_posts( $args );
    if (count($ps) > 0){return count($ps);}else{return 0;}
}

そしてこの関数を入手したら、コードを少し変更してください。

<?php
$ptypes = array('post','blog','pic'); //array with all of your post types
$tags = get_tags( array('name__like' => "a", 'order' => 'ASC') );
foreach ( (array) $tags as $tag ) { ?>
<li>                            
        <a href="<?php echo get_tag_link( $tag->term_id ) ?>">          
            <span class="name"><?php echo $tag->name ?></span>
        <span class="number">
            <?php 
                $count = 1;
                foreach($ptypes as $t){
                    echo get_term_post_count_by_type($tag,'post_tag',$t) . " " . $t;
                    if (count($ptypes) != $count){
                        echo " | ";
                        $count = $count + 1;
                    }
                }
            ?>
            </span>
    </a>
    </li>
<?php } ?>
3
Bainternet

何千もの投稿があるのであれば、すべての投稿をロードしないようにposts_per_page1に設定するのが賢い方法です。

WP_Queryはif ( empty( $q['posts_per_page'] ) )をチェックするため、これを0に設定しても機能しません。 0empty()なので、WP_Queryはそれを使いません。

WP_Queryは見つかった投稿の数を数えるので、すべての投稿を選択してそれらをすべてメモリにロードする代わりに使用できるので、この機能は一般に認められているものよりも効率的です。

/**
 * Count number of any given post type in the term
 *
 * @param string $taxonomy
 * @param string $term
 * @param string $postType
 * @return int
 */
function count_posts_in_term($taxonomy, $term, $postType = 'post') {
    $query = new WP_Query([
        'posts_per_page' => 1,
        'post_type' => $postType,
        'tax_query' => [
            [
                'taxonomy' => $taxonomy,
                'terms' => $term,
                'field' => 'slug'
            ]
        ]
    ]);

    return $query->found_posts;
}
1
Jonathan

私は各用語の入れ子になったループの中でこれを使っています:

$terms = get_the_terms( $post->ID , 'yourtaxonomynamehere' );
if($terms) {
    foreach( $terms as $term ) {
        echo $term->count;
    }
}
?>
1
Mike Averto