Wordpressのget_terms()で特定のカスタム投稿タイプの公開記事のみcountの対象にする方法
- 投稿日:2021/10/15 |最終更新:2021/10/18
- Wordpress
- カスタム投稿タイプ, カスタムタクソノミー, ターム
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()に含まれてしまうので、公開済の記事のみに限定したほうが良いかと思います。
ログイン状況を確認して含む記事を出し分けすることも考えましたが、ログインしていない状態を確認するのにわざわざログアウトしなければならないのは不便じゃないかと思ったので、上記の処理にしています。