前提・実現したいこと
2種類のカスタム投稿で一つのタクソノミーを共用しています。
カスタム投稿ごとにターム一覧と記事数を取得したいのですが、2種類のカスタム投稿の合算記事数が出力されてしまいます。
こちらのページを参考に試行錯誤してみましたが、記事数は合算のままです。
どの部分がまずいのでしょうか。
phpは初心者です。
知恵をお貸しください!!
ー設定詳細ー
■カスタム投稿その1
カスタム投稿名:shop
タクソノミー:area_cat(共用)
■カスタム投稿その2
カスタム投稿名:blog
タクソノミー:area_cat(共用)
ー現在の表示ー
shop tokyo(area_catのターム) 10件の記事あり
blog tokyo(area_catのターム) 5件の記事あり
area_catのtokyoのタームの数を取得すると15という数字になってしまう
ー理想の表示ー
shop tokyo(10)
blog tokyo(5)
と、表示したい
該当のソースコード
functions.php
//共通タクソノミー使用でもトータルカウントされないようにする function df_terms_clauses($clauses, $taxonomy, $args) { if (!empty($args['post_type'])) { global $wpdb; $post_types = array(); 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']; } } return $clauses; } add_filter('terms_clauses', 'df_terms_clauses', 10, 3);
index.php
<div> <p>関東</p> <ul class="area"> <?php $post_type = 'shop'; $taxonomy = 'area_cat'; $args = array( 'parent' => 0, 'slug' => array('tokyo','kanagawa','saitama','chiba','tochigi','ibaraki','gunma'), 'pad_counts' => false, 'hide_empty' => false ); $terms = get_terms( $taxonomy , $args ); if ( count( $terms ) != 0 ) { foreach ( $terms as $term ) { $term = sanitize_term( $term, $taxonomy ); $term_link = get_term_link( $term, $taxonomy ); if ( is_wp_error( $term_link ) ) { continue; } $slug = $term->slug; ?> <?php echo '<li><a href="' . esc_url( $term_link ) . '" >' . $term->name .'<span class="count">(' .$term->count. ')</span></a></li>'; $posts = get_posts( array( 'post_type' => $post_type, 'taxonomy' => $taxonomy, 'term' => $slug, 'meta_key' => 'order_num' )); foreach($posts as $post){ ?> <?php } wp_reset_query(); ?> <?php } } ?> </ul> </div>
あなたの回答
tips
プレビュー