最初にコード全体を見せて、次にそれぞれの説明をしていきます。
参考情報
- 月別アーカイブを特定のカテゴリーのみにしたい(teratail.com)
- WordPressの投稿データを、カテゴリー別に引っ張ってくるSQL(Qiita)
コード
青文字が考えた部分です。それ以外は変更していません。
<?php // カテゴリーなし(slug名)のみの月別アーカイブ表示
$year_prev = null;
$slug = 'カテゴリーなし';
// 日本語のエンコード処理
$slug = urlencode($slug);
// エンコードした場合、%が入る。SQLでは %は %% とエスケープが必要if(preg_match("/%/", $slug)):
$slug = str_replace('%','%%', $slug);
endif;
// SQLクエリ
$query = $wpdb->prepare("SELECT DISTINCT MONTH( post_date ) AS month ,
YEAR( post_date ) AS year,
COUNT( id ) as post_count FROM $wpdb->posts
WHERE post_status = 'publish' and post_date <= now( )
and post_type = 'post'
and id IN(
SELECT object_id FROM wp_term_relationships
WHERE term_taxonomy_id = (
SELECT term_taxonomy_id FROM wp_term_taxonomy AS tt
INNER JOIN wp_terms AS tm ON tt.term_id = tm.term_id
WHERE tm.slug = '%s'
)
)
GROUP BY month , year
ORDER BY post_date DESC",$slug);
$months = $wpdb->get_results($query);
foreach($months as $month) :
$year_current = $month->year;
if ($year_current != $year_prev){
if ($year_prev != null){?>
</ul>
<?php } ?>
<h3><?php echo $month->year; ?></h3>
<ul class="archive-list">
<?php } ?>
<li>
<a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>"> <span class="archive-month"><?php echo date("n月", mktime(0, 0, 0, $month->month, 1, $month->year)) ?></span> </a>
</li>
<?php $year_prev = $year_current;
endforeach; ?>
</ul>
以下、青色部分について説明していきたいと思います。