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

全般

今回は、WordPressの投稿記事で使用するスラッグを「数字4桁(例:/1234)」にした場合に起こる問題と、その解決法について紹介します。

つまるところ、俗に言う「数字4桁URL」問題についての記事になります。

当記事で扱う内容は、「WordPressの投稿記事に使用するスラッグ(投稿URL)を連番化するカスタマイズ」とも大きく関係することになります。

なお、そちらの内容については、以下をご覧ください。

当記事では、以下の3つの用語が出て来ます。

  • URL
  • スラッグ
  • パーマリンク

今回は便宜上すべて同じ意味を持つ単語として扱うことをご理解ください。

前書き:「数字4桁のURL」は何故避けるべきなのか?

まず始めに、なぜ投稿記事のスラッグを4桁の数字にしてはいけないのでしょうか?

この理由は、WordPressの仕組み上、「数字4桁のスラッグを西暦ページとして処理する」仕組みが働いてしまうからです。

もうちょっと詳しく説明すると、「/1234」は「1234年に投稿した記事の一覧ページ」を意味することになってしまい、「/5678」は「5678年に投稿した記事の一覧ページ」の意味になってしまう、という事なんです。

このように、WordPressに勘違いをさせないためにも、数字4桁のURLになってしまうスラッグを付けるべきではないと言われているのです。

補足ですが、当記事を執筆した(している)2020年度より前は、また別の問題により非推奨となっていました。

それは、「404ページになってしまう」という理由によるものでした。

補足:投稿記事のスラッグを「数字4桁」にしてみるには

WordPressでは、投稿記事で使用するスラッグ(URL)に対して、いくつかのオプションが存在しています。

そして、その中には「投稿する際に、自分で好きなスラッグ名を決める」という設定も存在しますので、今回はそれも補足的に説明しておきます。

  1. まず、管理者ページより「パーマリンク設定」ページに行きましょう。
    左側のサイドバーから「設定」→「パーマリンク」を選んだら開くことができます。
  2. そしてページを開いたら、「共通設定」の中から「投稿名」を選択してください。
    もしくは「カスタム構造」を選択し「/%postname%/」タグを選んでも良いです。
  3. 最後に、ページ最下段の「変更を保存」ボタンをクリックします。
パーマリンク設定

以上で、スラッグを自由に決めることが可能になります

スラッグは出来るだけ自分で名づける方が検索エンジンに高い評価をされやすくなると言われています。

私の場合は、ただシンプルに連番処理を行っていますが。

本題:「ドメイン名/英単語/数字4桁」のURLは「404ページ」になってしまう

さて、それでは本題に入りましょう

先ほどまでは、単なる「 https://ドメイン名/数字4桁 」の場合に起きる不具合の説明でしたので。

まず、パーマリンク設定で「カスタム構造」を選択します。

このとき、カスタム構造の入力ボックス欄には「/posts/%postname%」と入力します。


ちなみに、「posts」の部分はどんな英単語でも構いません。「notes」なり「logs」なり、あなたの好きなものを入力しましょう。

それから、新規に投稿記事を作成しましょう。

その際、作成する記事のスラッグには「1234」と入力してください。


スラッグを設定する方法は、エディターの種類によって違いが存在します。

  1. 「 Classic Editor 」の場合(旧エディター)
    エディター画面にあらかじめ入力できるようになっています。
  2. 「 Gutenberg 」の場合(現行エディター)
    エディター画面にあらかじめ存在していますが、一度下書き保存を行わなければ変更することができません。

あなたが使っているエディターの通りに設定してください。

最後に、記事を公開しましょう

そして、エディターに生成された投稿記事リンクをクリックして、公開した記事を開いてみてください。

さて、今あなたの画面はどのようになっているでしょうか?

おそらく、404ページ」が表示されているかと思います。

では、次です。

今度は、先ほど投稿した記事のスラッグを「2021」に直してください

もちろん、「2019」とか「2020」でも良いです。

出来るだけ、今年の西暦を入力してください

そして、先ほどの記事を更新する形で、もう一度公開してください

それから、修正されたリンクより、記事を開いてみましょう。

さて、飛んだ先の画面はどうなっているでしょうか?

今度は、今年に投稿した記事の一覧」がずらりと表示されているはずです。

つまり、こういうわけです。

WordPressは「ドメイン名と4桁の数字の間に任意の文字が存在するURL」を「西暦の投稿記事アーカイブ」として処理する。

こんなことが起きているんですね。

そして、私が以前当サイトで解説した「スラッグの連番化処理」を導入した場合、1000記事に到達したときに、この西暦問題にぶち当たってしまいます(といっても、個人サイトであれば先の長い話ですが)。

そんなわけで、「ドメイン名/連番」よりも「ドメイン名/posts/連番」のほうが見栄えが良いかな……などと考えて後者を選んだ場合、後々このような問題が待ち構えているというわけなんです。

注意点

この問題は、「ドメイン名/任意の文字-連番」の場合でも発生してしまいます。

WordPressは「スラッシュ(/)」と「ハイフン(-)」を同じものとみなすためです。

この現象が起きる理由は、WordPressが「ドメイン名/サブディレクトリ名」のサイトと勘違いするためだと思われます。

  • 「ドメイン名/連番」
  • 「ドメイン名/任意の文字/連番」

この「任意の文字」の有無ひとつで、このようなことになってしまうというわけです。

まあ、根本のほうは「WordPressの西暦ページ処理」なので、変わりはありませんが。

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

それでは、先ほど解説した問題の解決法に入りましょう。

だいたい3通りの方法があるため、順番に紹介していきます。

ただし、「ドメイン名/英単語/連番」の形を保てない方法も含みますので、そのあたりはご理解ください。

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

まずはこちら、「投稿記事のURLに投稿年を設定する」というものになります。

以下にその例を示します。

  1. ドメイン名/年/英単語/連番
    パーマリンク設定の構造は「 /%year%/posts/%postname% 」を取る。
  2. ドメイン名/英単語/年/連番
    パーマリンク設定の構造は「 /posts/%year%/%postname% 」を取る。

つまり、「あらかじめ投稿した年をURLに含めておけば、数字4桁のスラッグ名の誤認識を回避できる」ということになります。なので、スラッグを連番化していても、1000記事目以降の心配はいりません。

ただし、この方法だと「URLが長くなる」「URLに数字だけの箇所が2回も出てくるのは嫌」「そもそもURLに投稿した年月日時を表示したくない」といった場合には対応していません。

なので、これは「URLに投稿年が含まれていても気にしない人」向けの方法と言えます。

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

次はこちら、「連番の桁数を5桁で始める」というものになります。

以前、当サイトで「投稿記事に使うURLを自動で連番化するカスタマイズ」を紹介しました。

このとき、上記で紹介したカスタマイズコードは、以下のような処理を行っています。

現在まで作成した投稿記事から「数字だけのスラッグ」を持つ記事を取得し、次回の記事作成時には「その中から最大のものに1を足した数字」をあらかじめスラッグ欄に入力する

どういう事か例を示すと、始まりの連番が「1」であれば、次に作成する記事のスラッグは「2」になります。同じように「10」なら「11」です。

ということは、「10000」から連番を始めたら「10001、10002、…」と続いて行くことになろますね。

つまり、「1000」から「9999」までのURLが使えないのであれば、連番を「10000」から始めたら良いではないか、ということなのです。

これはかなり単純ですが、効果的な解決法でもあります。

ただ、かなり強引なやり方なので、スマートさに欠ける感じは否めません。また、記事に訪問した閲覧者やインデックスを行っている検索エンジンがURLを見て違和感を覚える可能性もあります。

なので、簡単ではありますが、私はお勧めしません。

スポンサーリンク

リライトルールを変更する

そして、最後がこちら「WordPressのリライトルールを変更する」というものになります。

さて、当記事をここまで読んでくれた人の中には、以下の疑問を持っている人もいるかと思います。

なぜ「 archives/1234 」の形を取る「数字ベース」は4桁の番号でも404ページにならないのか?

つまり、こういう事です。

  1. 数字ベース
    パーマリンク構造は「 ドメイン名/archives/数字 」の形を取る。
  2. カスタム構造」(当記事で取り上げている問題)
    パーマリンク構造は「 ドメイン名/任意の英単語/数字 」の形を取る。

この「archives」と「任意の英単語」、何が違って404にならなかったりなったりするのでしょうか?

その理由は、WordPressが内部で「archivesは特別なんだぞ!」という命令を出しているからなんですね。

こういった「URLをパラメーターと呼ばれる特別な意味を持つものに変換する、またその逆も然り」といったものの事を「リライトルール」と呼びます。

というわけで、3番目の方法は「リライトルールの処理を変更することで、404化を回避する」というものになります。

仕組みをもう少し詳しく説明すると、こういうことです。

  1. プラグインを導入し、WordPress内の「リライトルール」を特定します
  2. 子テーマの「functions.php」に「西暦のリライトルールを無効化するコード」を書き加えます。
  3. 再度「パーマリンク設定」を保存します。
  4. 完成!

こうすることで、わざわざURLに投稿年を含めたり、連番を5桁から始めたりせずに済むのです。

それでは、さっそくやってみましょう。

この方法は「functions.php」を編集するので、必ずファイルやサイトのバックアップを取りましょう

WordPressのバックアップを取得する方法は、以下の記事で解説しています。

①:リライトルールを特定する

まずは、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})/?$ 」の解説
  • 「 posts 」
    パーマリンク設定のカスタム構造で設定した英単語
  • 「 ([0-9]{4}) 」
    「年(year)」を表すパラメーター。

また、「 ([0-9]{4}) 」の部分を分解すると、以下のようになります。

「 ([0-9]{4}) 」の解説
  • 「 [0-9] 」
    0から9までの数字を含める」という意味。
  • 「 {4} 」
    4桁の順列になる」という意味

つまり、このリライトルールの意味は、こういう事です。

URLに4桁の数字(「/0000/」~「/9999/」)が含まれている場合、それを西暦のアーカイブページとして処理する

まあ、なんともおせっかいな話ですが、仕方がありません。

ですが、この処理を無効化してやれば、仮に連番が4桁に達しても404化することはないわけです。

②:「functions.php」を編集する

さて、原因を突き止めたので、次はその無効化を行いましょう。

まず、管理者ページ左側のサイドバーより「外観」から「テーマエディター」をクリックし、「テーマの編集」ページを開いてください。

そして、子テーマが選択されていることを確認したら、右側のサイドバーより「テーマのための関数(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」としていますので、下記のコードを書き加えています。

//リライトルールが作成された時に、数字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');

各自コードを正しく入力したら、一番下の「ファイルを更新」ボタンをクリックしましょう。

③:もう一度「パーマリンク設定」を保存する

それから、もう一度「設定」から「パーマリンク設定」を開いて、一番下の「変更を保存」ボタンをクリックしてください。

これは、「functions.php」に入力したコードを正しくリライトルールに反映させるためです。

ただコードを書き加えただけでは、依然として4桁のスタッグ名は404送りにされてしまうので注意してください。

この作業は必ず行ってください。

④:カスタマイズの反映を確認する

最後に、実際に数字4桁スラッグの投稿記事を作成し、公開してみましょう!

下の画像のように、正しく記事が表示されているのであれば、カスタマイズは成功です!

こうすることで、いつか来たる問題を解決することができました。

ここまで、お疲れさまでした。

ちなみに、このカスタマイズを行うと「年のアーカイブの一覧」を表示することが出来なくなる。しかし「年月のアーカイブの一覧」はきちんと表示される

私個人としては、別にアーカイブページは表示しなくてもいいと思っているのだが、そこのところは心に留め置いてほしい。

終わりに

今回は、パーマリンクを「%postname%」に設定している時に、数字4桁だけのスラッグを持つ投稿記事が404ページ化する問題を解消する方法について解説しました。

また、それと同時に、なぜそのような現象が起きてしまうのか?といったことも解説しました。

まあ、仮にURLを連番化していても1000記事到達には途方もない時間がかかりますが、このカスタマイズを行っておくことで、スラッグ名を「0120」だとか「0101」にしても問題は起きなくなります。

何かと便利になるので、「投稿年のアーカイブは別にいいかな」と思う方は、ぜひやってみてください。

それでは、また。