single.phpを作っても治らない!WordPressのお知らせリンクが日付アーカイブになる原因と解決策
どんな状況だったか
トップページのテンプレート(front-page.php)にWP_Queryを使って最新の投稿を取得し、お知らせセクションとして表示する実装を追加しました。
$astha_news_query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5,
'post_status' => 'publish',
'category_name' => 'oshirase',
]);
if ( $astha_news_query->have_posts() ) :
while ( $astha_news_query->have_posts() ) : $astha_news_query->the_post(); ?>
<a class="home-news-item" href="<?php the_permalink(); ?>">
<time><?php echo get_the_date('Y年n月j日'); ?></time>
<p><?php the_title(); ?></p>
</a>
<?php endwhile;
wp_reset_postdata();
endif;
コード自体は特に問題なく動いていて、トップページにはタイトルと日付のリンク一覧が表示されていました。
ところがリンクをクリックすると、個別記事ではなく投稿一覧(アーカイブ)が表示されてしまいました。
一覧に表示されている投稿をクリックしても、同じ画面でループするというありさまです。
WHY?
最初に試したこと:single.phpを追加してみた
「個別記事ページが表示されないなら、single.phpがないせいかもしれない」と考えて、子テーマに新規作成してデプロイしました。
child-theme/
└── single.php ← 新規作成
しかし、デプロイ後も表示は変わらず、アーカイブページが出続けます。
なぜsingle.phpでは直らなかったのか
single.phpが呼ばれるのは、WordPressが「このURLは個別投稿のページだ」と判断した場合、つまりis_single()がtrueのときだけです。
今回のURLはWordPress側が日付アーカイブとして解釈しており、is_date()がtrueになっていました。
そのためWordPressはsingle.phpではなくarchive.php(または親テーマのindex.php)を使い続けていたわけです。
single.phpの有無とは無関係に、URLのルーティング自体がアーカイブに向いてしまっているのが本当の問題でした。
原因:パーマリンク設定が日付アーカイブと衝突していた
投稿のURLを日付にしたかったので、パーマリンク設定を以下のようにしていました。
/%year%/%monthnum%%day%/
この設定では、2026年5月8日に投稿した記事のURLが次のように生成されます。
https://example.com/2026/0508/
%monthnum%(05)と%day%(08)がセパレーターなしで連結されるため、このURLはWordPressのルーティングから見ると2026年5月8日の日付アーカイブと見分けがつかない形式になっています。
個別記事のURLに直接アクセスしても、日付アーカイブとして処理されてしまい、single.phpが一切呼ばれないという状況でした。
解決策:パーマリンクに記事を一意に識別できる要素を加える
解決のポイントは、URLの中に記事名(%postname%)か投稿ID(%post_id%)を含めることです。
日付だけでなく記事を特定できる要素が入ることで、WordPressが正しく個別記事のURLとして認識できるようになります。
設定例
| 設定 | URL例 | 備考 |
|---|---|---|
/%postname%/ | /corporate-renewal/ | シンプルで推奨 |
/%year%/%postname%/ | /2026/corporate-renewal/ | 年別に整理したい場合 |
/%year%/%post_id%_%monthnum%%day%/ | /2026/123_0508/ | 今回採用した構造 |
変更手順
- WordPress管理画面 → 設定 → パーマリンク を開く
- 「カスタム構造」を選択し、
%postname%または%post_id%を含む構造に変更する - 「変更を保存」をクリック
今回は既存のURL構造をなるべく崩さない形で対応するために、次の構造を採用しました。
/%year%/%post_id%_%monthnum%%day%/
この設定にしたことで、the_permalink()が返すURLが日付アーカイブのパターンと衝突しなくなり、WordPressが正しくis_single() = trueと判断するようになりました。
修正後の動作確認
設定変更後、次のすべての動作を確認しました。
- 記事URLに直接アクセス →
single.phpが呼ばれ、詳細ページが表示される - 日付アーカイブURL(
/2026/05/08/)→ 引き続きアーカイブページとして正常に表示 - トップページのお知らせ一覧からのリンク → 詳細ページへ正しく遷移
個別記事ページとアーカイブページ、それぞれが意図どおりに機能するようになりました。
まとめ
今回の問題を整理すると、次のようになります。
| 項目 | 内容 |
|---|---|
| 症状 | お知らせリンクをクリックすると詳細ではなく日付アーカイブが表示される |
| 最初の仮説 | single.phpがないことが原因 |
| 本当の原因 | パーマリンク構造が日付アーカイブURLと衝突していた |
| 解決策 | %postnameまたは%post_idをパーマリンクに含める |
single.phpの不在とパーマリンク構造の問題は、別々の問題でした。
同じ症状が出た場合は、single.phpの確認と同時にパーマリンク設定も確認することをおすすめします。
パーマリンクに記事を一意に識別できる要素(%postname%や%post_id%)が含まれているかどうかを確認してみてください。
設定が難しそうだし間違えるのが心配・・・。
やりたいことは決まっているけど、どうやったら実現できるのかがわからない。
そんなときは、
知っている人や詳しい人に聞きながら進めるのが間違いないと思います!
IT関係の問題は専門用語も多く出てきて、説明を読んでもチンプンカンプンといったことはよくあります。
言葉の意味もわからずに設定してもうまく動かなかったり、間違った設定をしてしまう可能性もゼロではありません。
もし、安全に短時間で問題を解決したいと感じられたら、弊社のITサポートのご利用をご検討ください。
お客様の声
今なら通常5500円(税込)のところ1100円(税込)でサポートがご利用いただけます。
※割引料金でご利用いただく場合は、バナーをクリックして表示されるサポート申し込みページからお申し込みください。
[adrotate banner="23″]
ディスカッション
コメント一覧
まだ、コメントがありません