WPに組み込むデザインで、こんな感じで年で分かれるデザインがあったのです。
<section>
<article>
<h3>2018年</h3>
<dl>
<dt>タイトル</dt>
<dd>本文</dd>
<dt>タイトル</dt>
<dd>本文</dd>
<dt>タイトル</dt>
<dd>本文</dd>
</dl>
</article>
</section>
<section>
<article>
<h3>2017年</h3>
<dl>
<dt>タイトル</dt>
<dd>本文</dd>
<dt>タイトル</dt>
<dd>本文</dd>
<dt>タイトル</dt>
<dd>本文</dd>
</dl>
</article>
</section>
....
記事はWP_Queryを使ってyearで絞り込めばいいので…、
<?php foreach ( $yearArr as $yearly ) : ?>
<section>
<article>
<h3><?php echo $yearly; ?>年</h3>
<dl>
<?php
// パラメータ
$args = array(
'post_type' => '投稿タイプ',
'post_status' => 'publish',
'year' => $yearly,
'posts_per_page' => -1,
'orderby' => 'date',
'order' => 'DESC',
);
// SQL
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
?>
<dt><?php the_title(); ?></dt>
<dd><?php the_content(); ?></dd>
<?php
endwhile;
endif;
// SQL クリア
wp_reset_postdata();
?>
</dl>
</article>
</section>
<?php endforeach; ?>
こんな感じにforeachで回せたら、きれいでいいですよね!問題は・・・記事のある年が入っている$yearArrをどう用意するか。wp_get_archives()で取得できるかな、と思ったのですが、wp_get_archives()で受け取れるのはHTMLテキストのみで、せめてHTMLを配列で受け取れたらstrip_tags()でデータだけにできるのに・・・。
というわけで、記事がある年のみを取得する$wpdbをポチポチ書きました。
<?php
global $wpdb;
// 記事がある年を取得
$sql = 'SELECT
DATE_FORMAT( post_date, '%%Y' ) AS yearly
FROM ' . $wpdb->posts . '
LEFT JOIN ' . $wpdb->postmeta . ' ON ' . $wpdb->postmeta . '.post_id = ' . $wpdb->posts . '.id
WHERE post_type = %s
AND ' . $wpdb->posts . '.post_status = 'publish'
GROUP BY DATE_FORMAT( post_date, '%%Y' )
ORDER BY post_date DESC';
$query = $wpdb->prepare( $sql, '投稿タイプ' );
$result = $wpdb->get_results( $query );
// 年単位で回す
if ( $result && count( $result ) > 0 ) :
foreach ( $result as $row ) :
$yearly = isset( $row->yearly ) ? $row->yearly : date( 'Y' );
?>
<section>
<article>
<h3><?php echo $yearly; ?>年</h3>
〜
</article>
</section>
<?php
endforeach;
endif;
?>
もしご利用されるのであれば、投稿タイプは環境に合わせて変更してください。