数字4桁URLが404になる問題の解決方法

全般

前に投稿記事のURLを自動で連番化し採番を行う方法について説明したが、今回はURLを自動で連番入力をするカスタマイズを行った際にいずれ起きてしまう問題についての解説と注意喚起を行いたい。

スポンサーリンク

なぜ数字4桁が含まれるURLは避けるべきなのか

この記事を執筆している現在の私のWordPress環境では、パーマリンク設定を「投稿名」にし、スラッグの部分に数字4桁を入力する「ドメイン名/数字4桁」のURLに設定した記事を投稿しても、その記事が404になる現象はおきていない。しかし、かつて「https://example.com/1234」のようなURLに設定したページは404になってしまうため避けることが推奨されていた。

そうなってしまう理由は、WordPressの仕組みの上で、数字4桁のパーマリンクは西暦として処理してしまうからだ。つまり、「/1234」は「1234年に投稿した記事の一覧ページ」を意味することになってしまい、「/5678」は「5678年に投稿した記事の一覧ページ」の意味になってしまうのだ。タイムトラベルするなり内部の設定を変更するなりしないと投稿すること自体がありえないような現象を、WordPress側は勝手に勘違いして探しに行ってしまうというわけだ。


しかし、本当の問題はここからになる。

ドメイン名/英単語/数字4桁のURLは404になってしまう

まずパーマリンク設定を「カスタム構造」に設定し、入力欄に「posts/%postname%」と入力して変更を保存してほしい(postsの部分はlogsでもnotesでもmemosでもentriesでもなんでもいい)。

そして、クラシックエディタープラグインを有効化したのち、新規投稿でタイトルだけを適当につけた後、スラッグに「1234」と入力する。そのあと下書きを保存してから公開して、「投稿を表示」を押すか表示されているパーマリンクを押してその公開した記事を開いてみてほしい。

もし現行エディターのGutenbergを使用している場合は、タイトルだけを入力して下書きを保存した後、パーマリンクの項目のURLスラッグを「1234」と入力しなおして、もう一度下書きを保存してから公開した投稿記事を開いてみよう。

記事を開くと404ページになっていることが確認できただろうか?

では、また新しく新規投稿で新規記事の編集画面に入り、今度はスラッグの部分に今年の西暦を入力してほしい2019年なら2019、2020年なら2020というように。それから下書きを保存してから公開し、その記事を開いてほしい。

今度は、今年に投稿した記事の一覧が表示されるページが表示されているはずだ。


つまるところ、ドメイン名と4桁の連番の間に何か任意の文字を挿んでしまうと、WordPress側は勝手に西暦何年に投稿した記事の一覧と処理してアーカイブのページを表示してしまうのだ。

もうちょっとこの現象を説明すると、これは「ドメイン名/サブディレクトリ」のサイトが西暦何年に投稿した記事の一覧を表示する処理がなされているはず。普通に考えると、「ドメイン名/連番」と「ドメイン名/任意の英単語/連番」はそれぞれ全く別のサイトのようなものであるため、ドメイン名と連番の間に英単語を挿むと上記のこのような現象が生まれてしまっているのである。

そして、パーマリンク設定をこのように行ってしまうと、いつかは1000記事に到達してしまう(速い人なら約1年以内、遅い人でも約5年後くらい)。この時、1000番以降の記事はすべて404ページになってしまうのだ。

「ドメイン名/連番」だと質素だし…なんのページなのか検索エンジンも張られた直リンを見た人も理解してくれなさそうだし…と考えて、良かれと思ってパーマリンク設定をカスタム構造で「ドメイン名/posts/連番」のような形にしてしまうと、後々このような問題が起きてしまう

この問題は「ドメイン名/posts-連番」でも起きてしまうことも覚えておいてほしい。これはスラッシュ(/)とハイフン(-)は同じものだとWordPressはみなしているからだ。

それでは、このいずれ来るこの問題を解決する方法を説明したい。

ドメイン名/英単語/連番のURLに起きる404を解決する方法

だいたい3通りほどの方法があるため、一つずつ紹介していきたい。

ただし、「ドメイン名/英単語/連番」の形を保てない方法も含むのでそこは理解してもらいたい。

%year%(年)を途中に含める

パーマリンク設定のカスタム構造でドメイン名/年/英単語/連番」もしくは「ドメイン名/英単語/年/連番」と設定することで、投稿記事がWordPress側でアーカイブページと処理されてしまうことを避ける方法である。

カスタム構造に「%year%/posts/%postname%」か「posts/%year%/%postname%」と入力してあらかじめ投稿年を表示することで、4桁の連番は年のアーカイブとみなされなくなる。こうすることによって4桁の連番が存在しないアーカイブとみなされて404ページに飛ぶことを回避するという方法である。

しかし、この方法ではURLが長くなるじゃん!という人もいるだろう。そもそもURLの数字だけの部分が2回も続くのは正直クドく感じられるし、この記事を読んでいる人の中には、いつ投稿したかという情報をURLに表示したくないなぁ…という人もいるかもしれない。そのため、この方法は少し考え物である。

連番の桁を5桁から始める

以前の記事で、functions.phpにコードを書き込むことで、URLの連番化を自動で行う方法を解説した。そして、そのコードが行う処理は「現在までに投稿した記事の中に数字のみのスラッグがある場合、その中の最大の数字を取得して1を足した番号が事前に入力される」というものである。

つまり、いままでスラッグに入力された最大の数字が「1」であれば次に新しく投稿する際はスラッグ部分に「2」が自動で入力されており、「10」と入力してそれが最大であるならば次は「11」となる。

ということは、一番最初の記事を投稿する際、スラッグに「10000」と入力しておいたら次に投稿する記事のスラッグは「10001」となり、その次は「10002」となる。「1」から始めた場合、いずれ「1000」に到達し、そこから「9999」までの9000記事が404ページと化してしまうなら、そもそも「10000」から始めたらいいのでは?ということだ。

しかし、この方法もあまりスマートではないという感は否めない。また、検索エンジンが「なにコイツ10000から始めて水増しに見せかけてんだ?」と訝しがる可能性もある。なのでこれもあまりお勧めはできないが、一番単純な方法で4桁数字の404化を回避できる方法ではある。

functions.phpにコードを書き加えてリライトルールを変更する

さて、上記に二つの例を紹介したが、どれも根本的に解決しているとはいいがたい。なのでここではfunctions.phpファイルを編集することで解決させる解決法を説明する。

さて、ここまでこの記事を読んでくれた人の中には、このような疑問を持っているだろう。なんで数字ベースは「archives/123」といった、「英単語/数字」の形をしたパーマリンクなのに、4桁の番号でも404ページにならないのか?と。これは、WordPressが内部で「archives」は他の英単語とはちょっと違うんだよ!という処理を行っているからである。

こういった「URLをパラメーターに変換する、またその逆も然り」といったものは「リライトルール」と呼ばれている。

つまり、このリライトルールによって英単語/4桁数字のURLは年のアーカイブページとみなす」といった設定の処理が内部で行われているのなら、その部分を無効化する処理をfunctions.phpに書き加えて「年のアーカイブページを表示する処理を無効化する」ことで投稿記事を表示したらいいという話だ。

それでは、下に説明を開始する。


まずは、Rewrite Rules Inspector」というプラグインを導入しよう

このプラグインはもう3年も更新されていないので、作業が終わったら停止するか削除しておこう

そして、そのプラグインを有効化して、左サイドバーの「ツール」から「Rewrite Rules」を選ぼう

では、上から順番にざっくり見て行くと、やがて右側の「Source」に「date」と書かれた項目が出てくるはずだ。もしくは「Rule Source」から「date」を選んでもいい。

ここに書いてある一連のリライトルールにより、WordPressはURLを自動で判断しアーカイブページに飛ばす処理を行っているのだ。

ここでひとつ、一番下にある一番短いこのコードを見ることにしよう。

posts/([0-9]{4})/?$	index.php?year=$matches[1]	date

このコードの内容を簡単に解説すると、「posts」の部分はパーマリンク設定のカスタム構造で設定した「英単語」の部分であり、「([0-9]{4})」の部分が「年(year)」を表している。そして、[0-9]は0から9までの数字を、{4}はそれが4桁の順列になるという事である。

つまり、このリライトルールは「/0000/」から「/9999/」までのURLは、WordPressが自動で処理して年のアーカイブページを表示するようにしておきますよ!ということを意味しているのだ。なんともお節介なヤツである…。

ということは、この「([0-9]{4})」が「年(year)」を表す処理を無効化してやれば、連番が4桁になってしまっても404化せず投稿記事がちゃんと表示されるという訳だ。


それでは、「外観」から「テーマエディター」を開き、「テーマの編集」を開いたら、子テーマの「テーマのための関数(functions.php)」を開こう。

そして、この下記のコードをコピペしよう(参考元サイト)。そのさい、英単語と書かれている部分は「現在あなたがパーマリンク設定で設定していて、リライトルールにも表示されている英単語」に置き換えることを忘れないようにしてほしい

//リライトルールが作成された時に、数字4桁のURLが年のアーカイブページ扱いになることを無効化する(スラッシュ)
function mycus_year_rewrite_rules_invalid($rules) {
  unset($rules['英単語/([0-9]{4})/?$']); 
  return $rules;
}
add_filter('rewrite_rules_array','mycus_year_rewrite_rules_invalid');

もし、スラッシュ(/)のかわりにハイフン(-)を使用しているならこれをコピペする。

//リライトルールが作成された時に、数字4桁のURLが年のアーカイブページ扱いになることを無効化する(ハイフン)
function mycus_year_rewrite_rules_invalid($rules) {
  unset($rules['英単語-([0-9]{4})/?$']); 
  return $rules;
}
add_filter('rewrite_rules_array','mycus_year_rewrite_rules_invalid');

ちなみに、私は「ドメイン名/posts/%postname%(連番)」の形をとっているので下記のようにしてコードを入力している

//リライトルールが作成された時に、数字4桁のURLが年のアーカイブページ扱いになることを無効化する(スラッシュ)
function mycus_year_rewrite_rules_invalid($rules) {
  unset($rules['posts/([0-9]{4})/?$']); 
  return $rules;
}
add_filter('rewrite_rules_array','mycus_year_rewrite_rules_invalid');

[‘posts/([0-9]{4})/?$’]となっていることがわかっていただけたであろうか?

そして、このコードを入力したのち、「ファイルを更新」を押してファイルが更新されたことを確認する

それから、必ず「パーマリンク設定」を開いて、「変更を保存」を押す

変更を保存しなければ、functions.phpによるリライトルールの変更が反映されないからだ。必ず行おう

そして、実際に数字4桁のスラッグを持つ投稿記事を作成して公開し、このように表示されていれば成功だ。

こうすることで、いつか来る問題を解消することが出来る。

ちなみに、このphp編集を行うと「年のアーカイブの一覧」を表示することが出来なくなる。しかし「年月のアーカイブの一覧」はきちんと表示される。私個人としては、別にアーカイブページは表示しなくてもいいと思っているのだが、そこのところは心に留め置いてほしい。


今回は、投稿記事のURLが連番になるようにパーマリンクを設定した際に、いずれ起きてしまう問題を解消する方法を解説した。

自分はまだまだ大丈夫だよ!と思う人もやっておくに越したことはないだろう(私もまだまだなのだが…)。

これが参考になれば幸いである。