日付ページでサブクエリを使用するときは、年月を指定してあげる必要がある

はじめに

今朝、当サイトで以前作成した「サンプル」という投稿を一覧から削除した。

その時に、post__not_inで一覧から削除したい投稿のIDを指定した。

そうすると、年月ごとの一覧ページで意図した年月の記事が表示されなくなってしまった。

年月ごとの一覧ページ

年月ごとの一覧ページとは、以下のようなページのことだ。

https://ki-hi-ro.com/2023/08/

この例の場合、2023年8月に投稿した記事のみが表示されている。

意図した記事が表示されなかった時のソースコード

<?php
$my_query = new WP_Query(
  array(
    'post__not_in' => array(3874),
    )
  )
);
if ( $my_query->have_posts() ) : 
  while ( $my_query->have_posts() ) :
    $my_query->the_post();
?>
  <div class="all-article__link front-sec__flex-item">
    <?php echo get_template_part("template-parts/blog-list"); ?>
  </div>
endwhile;
endif; 
wp_reset_postdata();
?>

サブクエリの引数「post__not_in」で、除外したい記事をIDで指定したら、意図した年月の投稿が表示されなくなってしまった。

例えば、2022年3月のページなのに、2023年6月の投稿が表示されてしまったりしていた。

意図した年月の投稿が表示されなくなってしまっていた原因

サブループを使用したことで、日付ページのメインループが効かなくなってしまったためと考えられる。

メインループとは、それぞれのページが持っている基本的なループのことで、日付ページの場合は、そのページの年月の記事のみが表示されるようになる。

例えば、2023年8月のページなら2023年8月の記事のみが表示される。

意図した年月の投稿を表示させた方法

<?php
$my_query = new WP_Query(
  array(
    'post__not_in' => array(3874),
    'date_query' => array(
       array(
        'year'  => get_query_var('year'),
        'month' => get_query_var('monthnum'),
      ),
    )
  )
);
if ( $my_query->have_posts() ) : 
  while ( $my_query->have_posts() ) :
    $my_query->the_post();
?>
  <div class="all-article__link front-sec__flex-item">
    <?php echo get_template_part("template-parts/blog-list"); ?>
  </div>
endwhile;
endif; 
wp_reset_postdata();
?>

サブループの「date_query」で年月を指定することで、意図した年月の投稿が表示されるようになった。

get_query_var('year')で、そのページの年が取得できる。

月を取得する場合は、get_query_var('monthnum')とする。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です