BLOG

taxonomyをいろんなカスタム投稿で使いまわし

| BLOGWordPress

お仕事ではカスタム投稿タイプを分けて作ることが僕は多いのですが、同じタームで使い回せるときでも分けて作ることが多かったわけです。

でもここ最近は、少しでもいろいろな手間を省くためということを考えて、使い回せるものは使い回すを心がけてます。
DBの関係もありますよね。

ってなことで、使いまわしたときにちょっとありゃってなった一点をご紹介します。

使いまわしたときは、hide_emptyがうまく機能しない

製品情報では金属ってタームに投稿はあるけど、NEWSでは金属ってタームには投稿は無いってときでも、使いまわした場合は、投稿ありますってなってしまうようで、カウントとっても全カスタム投稿でのカウントをとっちゃうようになるみたいです。

get_termsとかはpost_typeの指定とかないので、ちょっとadd_filterとかつかってカスタムしないといけないので、その方法をご紹介。

まずは、functions.phpに

function hoge_terms_clauses($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_type IN ('.implode(',', $post_types).')';
            $clauses['orderby'] = 'GROUP BY t.term_id '.$clauses['orderby'];
        }
    }
//     print_r($clauses);exit;
    return $clauses;
}
add_filter('terms_clauses', 'hoge_terms_clauses', 10, 3);

こいつをそのままコピペして

$args = array(
  'hide_empty'    => false,
  'post_type'     => array('custome_post_type'),
);

$custome_cats = get_terms('[タクソノミー名]', $args);

というふうにすればおk
ポストタイプを複数指定したいときは、お決まりの配列で問題ありません。

$args = array(
  'hide_empty'    => false,
  'post_type'     => array('custome_post_type', 'post_type_custome'),
);

$custome_cats = get_terms('[タクソノミー名]', $args);

こんな感じですかね。
これで問題なく動作しました。

DBの高速化や、表示速度の問題なので、いろいろとデータが増えるのはよくないので、使い回せるものは使いまわしたほうが、いいですよね。タームの登録も一回ですみますしw