【WP】wp_get_archives()で取れそうで取れない記事がある“年一覧”

【WP】wp_get_archives()で取れそうで取れない記事がある“年一覧”

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;
?>

もしご利用されるのであれば、投稿タイプ環境に合わせて変更してください。