> Wordpress > Wordpressのget_terms()で特定のカスタム投稿タイプの公開記事のみcountの対象にする方法
Wordpressのget_terms()で特定のカスタム投稿タイプの公開記事のみcountの対象にする方法

Wordpressのget_terms()で特定のカスタム投稿タイプの公開記事のみcountの対象にする方法

Wordpressのget_terms()関数は、指定されたタクソノミー(カスタム分類)またはタクソノミーのリストについて、それに含まれるタームを取得します。 
get_terms()関数を利用して、特定の投稿タイプの投稿に紐付いているタームのみ表示するようにしてみます。
ちなみに非公開の記事は閲覧者からは見えないので、カウントする記事は公開状態のものに限定します。

functions.php変更例

function.phpに下記の通り追記してください。

/**
 * Get_terms()で、特定の投稿タイプのみcountの対象にする
 *
 * @param object $clauses clauses.
 * @param string $taxonomy taxonomy.
 * @param object $args args.
 * @return object $clauses clauses.
 */
function get_terms_posttype($clauses, $taxonomy, $args) {
    if (!empty($args['post_type']))    {
        global $wpdb;
        $post_types = array();
        if( $args['post_type'] ){
            foreach($args['post_type'] as $cpt)    {
                $post_types[] = "'".$cpt."'";
            }
        }
        if(!empty($post_types))    {
            $clauses['fields'] = 'DISTINCT '.str_replace('tt.*', 'tt.term_taxonomy_id, tt.term_id, tt.taxonomy, tt.description, tt.parent', $clauses['fields']).', COUNT(t.term_id) AS count';
            $clauses['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';
            $clauses['where'] .= ' AND p.post_status = "publish" AND p.post_type IN ('.implode(',', $post_types).')';
            $clauses['orderby'] = 'GROUP BY t.term_id '.$clauses['orderby'];
        }
    }
//     print_r($clauses);exit;
    return $clauses;
}
add_filter('terms_clauses', 'get_terms_posttype', 10, 3);

テンプレート内での利用例

$taxonomies = array( 'タクソノミー名' );
$post_type  = array( '投稿タイプ名' );
$args       = array(
    'taxonomy'   => $taxonomies,
    'post_type'  => $post_type  ,
    'orderby'    => 'menu_order',
    'order'      => 'ASC',
    'hide_empty' => true,
);
$terms      = get_terms( $args );

参考にさせていただいた記事はこちら↓です。

Daily GLOCALISM「WordPressのget_terms()で、特定の投稿タイプのみcountの対象にする方法」
https://daily.glocalism.jp/2018/01/20/get-terms-for-specific-post-type-only/

参考サイトと違うところは、$clauses['where'] AND p.post_status = "publish"を追加しているところです。
上記の処理で記事のステータスを公開済に限定しています。
非公開・下書きも含めてしまうと、カテゴリーなどを下書きの記事に紐付けて保存した時点でget_terms()に含まれてしまうので、公開済の記事のみに限定したほうが良いかと思います。

ログイン状況を確認して含む記事を出し分けすることも考えましたが、ログインしていない状態を確認するのにわざわざログアウトしなければならないのは不便じゃないかと思ったので、上記の処理にしています。

この記事が気に入ったらシェアしてください

関連記事

Wordpressのカスタム投稿タイプで一覧・詳細画面を作らない方法

Wordpressのプラグイン「AddToAny Share Buttons」で任意の場所にシェアボタンを設置する方法

Wordpressのプラグイン「AddToAny Share Buttons」で任意の場所にシェアボタンを設置する方法

Wordpress Popular Postsでの表示内容をテーマ内でカスタマイズする方法

Wordpress Popular Postsでの表示内容をテーマ内でカスタマイズする方法

Wordpressの投稿からカテゴリーやタグを削除する方法

Wordpressの投稿からカテゴリーやタグを削除する方法

Wordpressで記事のIDから記事内の一番目にある画像を取得する関数

Wordpressで記事のIDから記事内の一番目にある画像を取得する関数

WP_Query()のmeta_queryでAdvanced Custom Fieldsの「真 / 偽」の登録内容で絞りこむ方法

WP_Query()のmeta_queryでAdvanced Custom Fieldsの「真 / 偽」の登録内容で絞りこむ方法

Comment Form

コメント投稿はこちらをクリックしてください
  • コメントを入力してください。
登録フォーム
Name
Mailaddress
URL
Message
Postkey
(スパム対策に、投稿キー を半角で入力してください。)