WordPress カスタム投稿タイプの年別アーカイブが404になる

  • WordPress

WordPress の年別アーカイブページを作っていた時に、カスタム投稿タイプ名/2019/のようなURLがnot foundになってしまいハマったので、メモしておきます。

問題

投稿タイプ「post」では、アーカイブページは下記のような形になります。

  • 年別 … https://sample.com/2019
  • 月別 … https://sample.com/2019/01

今回はカスタム投稿タイプ「news」を作成し、アーカイブページでは下記のようなリンクを作れるのかと考えました。

  • 年別 … https://sample.com/news/2019
  • 月別 … https://sample.com/news/2019/01

この時、年別アーカイブページのみ 404 not found となってしまい表示することができませんでした。

原因

ざっくりとしか調べていませんが、カスタム投稿タイプの年別アーカイブページは詳細ページのパーマリンク構造として認識するようになっているためなのかと思います。

例えば、パーマリンク構造を「https://sample.com/%postname%」に設定しているとします。この時、記事のパーマリンクに/1000/のような数字を設定すると、URLは、

https://sample.com/1000

になると思います。まぁ、1000年に投稿された記事があるとは思いませんが…。このように数字のみだと年別アーカイブページなのか、「1000」という記事のリンクなのか判別できなくなりますね。

では、投稿タイプ「post」はなぜこのリンクの競合が起きていないのか?というと、記事のパーマリンクに数字を設定した時「ハイフン+連番数字」がつくようになっていたからでした。投稿の際に「1000」と数字を設定することはできるのですが、実際に公開してみると「1000-2」というパーマリンクに書き換わっていました。

この書き換えによって、数字のパーマリンクはある意味封印されるので、年別アーカイブページのリンクと競合することは無いということです。

一方、カスタム投稿タイプでは…

僕が作成したカスタム投稿タイプ「news」の方では、「1000」というパーマリンクを記事に設定すると、そのまま「1000」として投稿されました。これでは「2019」のような数字を設定した時に年別アーカイブページとの区別が付きません。

つまり、カスタム投稿タイプでは数字のみのパーマリンク構造はすべて詳細ページのURLとして認識されるようになっています。

投稿タイプ「post」であるような、ハイフン差し込み処理が走ればhttps://sample.com/news/1000などの数字リンク構造を年別アーカイブページとしてリライトルールを書き換えれるのかもしれませんが、出来るのかどうかは分かりませんでした。

対処

GETパラメータを使用する方法です。

カスタム投稿タイプの年別アーカイブページのURLをパラメータで指定します。例えば投稿タイプ「news」の「2019」年のアーカイブページだとしたら、

https://sample.com/2019?post_type=news

のような形です。

WordPress カスタム投稿タイプの年別アーカイブについて投稿タイプ「post」のフォーマットとは少し異なるため、違和感もありますが元々wordpressはGETパラメータでどの記事を取得するか制御できるので、この形なら大体の記事のアーカイブを作ることができるはずです。