直近の投稿一覧を取得する

直近の投稿一覧を取得する

WordPressで投稿記事の下など直近の記事をいくつか表示したい場面があると思います。

そんな際に使用できるサブクエリの書き方を紹介します。ほとんどコピペで使用できるようにしています。

直近の記事を取得する

最近の投稿を取得する条件は以下の通り

  • 投稿タイプから取得
  • 日付順に取得
  • 降順に並び替え
  • 現在表示している投稿は含めない
  • 指定の数取得

言葉に表すとこのようになります。実際は状況に合わせて投稿タイプをカスタム投稿にしたり、そのほかの条件を加えたりしてください。

上の条件をクエリ取得の条件におこすと以下のようになります。

  global $post;
	$post_ID = ( is_single() ) ? $post->ID : 0;
	$args = [
		'post_type'      => 'post',  //投稿タイプから取得
		'orderby'        => 'date',  //日付順に取得
    'order'          => 'DESC',  //降順に並び替え
    'post__not_in'   => [ $post_ID ], //現在表示している投稿は含めない
		'posts_per_page' => 3  //指定の数取得
 	];

投稿IDは投稿ページであれば投稿IDを取得し、それ以外は0としている3項演算子での記述です。

post__not_inは含めない投稿IDを配列で指定する必要があります。

これをクエリとして、ループで取得すると以下のようになります。

 global $post;
	$post_ID = ( is_single() ) ? $post->ID : 0;
	$args = [
		'post_type'      => 'post',  //投稿タイプから取得
		'orderby'        => 'date',  //日付順に取得
    'order'          => 'DESC',  //降順に並び替え
    'post__not_in'   => [ $post_ID ], //現在表示している投稿は含めない
		'posts_per_page' => 3  //指定の数取得
 	];
 $query = new WP_Query( $args );
 if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); //グローバル変数に展開
  //ループ表示処理
 endwhile;
  endif;
  wp_reset_postdata(); //サブクエリによるグローバル変数の上書きをリセット

ループで表示させたい内容をループの中に入れることで表示することができます。

実際に画像やタイトルリンクを取得する形にしたいと思います。

function my_related_post() {
    global $post;
	 $post_ID = ( is_single() ) ? $post->ID : 0;
	 $args = [
	   'post_type'      => 'post',  //投稿タイプから取得
		  'orderby'        => 'date',  //日付順に取得
       'order'          => 'DESC',  //降順に並び替え
    'post__not_in'   => [ $post_ID ], //現在表示している投稿は含めない
		'posts_per_page' => 3  //指定の数取得
 	 ];
 $query = new WP_Query( $args );
 if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); //グローバル変数に展開
  //ループ表示処理
 endwhile;
  endif;
  wp_reset_postdata(); //サブクエリによるグローバル変数の上書きをリセット
}
<?php 
function my_recent_post() {
    global $post;
	$post_ID = ( is_single() ) ? $post->ID : 0;
	$args = [
		'post_type'      => 'post',  //投稿タイプから取得
		'orderby'        => 'date',  //日付順に取得
      	'order'          => 'DESC',  //降順に並び替え
    	'post__not_in'   => [ $post_ID ], //現在表示している投稿は含めない
		'posts_per_page' => 3  //指定の数取得
 	];
	$query = new WP_Query( $args );
	?>
	<div class="recent-post">
		<h3 class="recent-post__title">最近の投稿</h3>
		<div class="recent-post__body">
	<?php
	if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); //グローバル変数に展開
	?>
	  <a href="<?php echo the_permalink(); ?>" class="card">
			<figure class="card__imgWrapper">
				<img src="<? echo esc_url( get_the_post_thumbnail_url( $post->ID, 'middle' ) ); ?>" class="card__img">
			</figure>
			<h4 class="card__title"><?php echo the_title(); ?></h4>
			
		</a>
	<?php endwhile; endif; ?>
		</div>
	</div>
	<?php
  	wp_reset_postdata(); //サブクエリによるグローバル変数の上書きをリセット
}

直近投稿のタイトルを先につけておき、ループでそれぞれの投稿にかかわる部分を取得しています。