こんにちは!コーダーのゆうしです。
WordPressのシングルページ(single.php)で「他の記事一覧を表示したいけど、今見ている記事は除きたい」という場面はよくありますよね。記事詳細ページの下部に関連記事や新着記事を並べるときに特に使います。この記事ではWP_Queryの post__not_in を使ってシンプルに実装する方法を解説します。
実装コード
<?php
$current_post_id = get_the_ID(); // 現在表示中の記事IDを取得
$args = [
"post_type" => 'post', // 投稿タイプ
"posts_per_page" => 3, // 表示する記事数
"post__not_in" => [$current_post_id] // 現在表示中の記事をここで除外
];
$post_query = new WP_Query($args);
?>
<?php if ($post_query->have_posts()) : ?>
<?php while ($post_query->have_posts()) : $post_query->the_post(); ?>
<!-- ループの中身をここに記述してください。 -->
<?php endwhile; ?>
<?php endif;
wp_reset_postdata(); ?> コード解説
ポイントは2箇所です。
① 現在の記事IDを取得する
$current_post_id = get_the_ID();get_the_ID() で現在表示中の記事IDを取得します。single.php内のメインループの中で呼び出す必要があるので、WP_Queryを書く前に記述してください。
② post__not_inで除外する
'post__not_in' => [$current_post_id],post__not_in に除外したい記事IDを配列で渡します。複数除外したい場合は配列に追加するだけでOKです。
'post__not_in' => [$current_post_id, 5, 10], // IDが5と10の記事も除外する例パラメータのカスタマイズ
post_type や posts_per_page はサイトに合わせて変更してください。
| パラメータ | 内容 |
|---|---|
| post_type | 対象の投稿タイプ。カスタム投稿の場合はそのスラッグに変更 |
| posts_per_page | 表示件数。-1 で全件取得 |
| post__not_in | 除外したい記事IDの配列 |
カテゴリを絞りたい場合は tax_query を追加することで同一カテゴリの記事のみ表示することもできます。
wp_reset_postdata()を忘れずに
WP_Queryを使ったループの後は必ず wp_reset_postdata() を呼び出してください。これを忘れるとメインループのグローバル変数が上書きされたままになり、ページ内の他の箇所で予期しない挙動が起きることがあります。
躓きやすいポイント
get_the_ID()が正しく取得できない
get_the_ID() はメインループの中でないと正しくIDを取得できません。WP_Queryの $args を定義する前の行に書いておくのが確実です。
除外しているのに記事が表示される
post__not_in はキャッシュプラグインと干渉することがあります。キャッシュが残っていると除外が効いていないように見えることがあるので、キャッシュをクリアして確認してみてください。
まとめ
post__not_in に現在の記事IDを渡すだけで、今見ているページを除いた記事一覧を簡単に作れます。シングルページの下部に「他の記事も見る」的な導線を作りたいときにそのまま使えるコードなので、ぜひ活用してみてください。
ご不明な点やコーディングのご依頼はお問い合わせからお気軽にどうぞ。

