パーマリンクカスタム構造を変更すると404エラーが発生する

この記事は最終更新から2年以上が経過しています。情報が古くなっている可能性があります。

オリジナルテーマを作成していると、自分が原因なのかプラグインの問題なのかWordPress自体の問題なのかわからなくなりますよね。
今回は、この間まるっと構築したサイトのパーマリンク設定で404エラーが多発する事象にはまったので、そちらの原因と解決法をご紹介します。

今回は以下の記事を参考にさせていただきました。

パーマリンクを変更したら404エラーが多発した

Wordpressパーマリンク設定、カスタム構造の画面

今回の案件では構築当初からカスタム構造を使用していたのですが、顧客から要望があったため構築完了後にパーマリンク形式を変更することになりました。

①(変更前)/article/%postname%
②(変更後)/article/?p=%post_id%

これで変更ボタンを押したところ、

  • Webサイト上の記事一覧・記事リンクは
  • WP画面の投稿ページ編集画面に記載してあるパーマリンクは
  • ②のURLにアクセスすると404 not found
  • 実際のページの在りかは/?p=%post_id%(デフォルト)

というよく分からない事象が発生(°Д°;

調べて見たところ、この「パーマリンクのカスタム構造を使っても反映されない」という事例は結構有るようで、主に以下の原因によることが多いようです。

  • mod_rewriteが有効になっていない
  • .htaccessにRewriteが書かれていない/.htaccessが作成されていない
  • リライトルールが更新されていない

ご参考)
パーマリンクのカスタム構造でハマった時の色々まとめ | yusk -ユースク-(2011/8/11)
【Tips】WordPressのURLの構造を変更した時、パーマリンクが反映されない時は、リライトルールを更新(flush_rewrite_rules)する。その最も簡単な方法。 / もっと知りたいリンゴあれこれ(2015/2/10)

ちなみに私が現在使っているお名前.comレンタルサーバに限定すると、.htaccessに記載のパスが間違っていたという事例も。

お名前.comのSDサーバでパーマリンク設定を有効にする方法 | 魔ッドアングラー(2012/7/26)

しかし、今回はこれらを一通り確認してみても解決しませんでした

カスタム構造で「?」(クエスチョンマーク)を使うとダメ!

今回の原因は以下の記事で発覚しました。

[WordPress] Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 1 in /wp-includes/class-wp.php on line 204 205 | mkoba のお部屋 : DREAMHIVE Staff Blog(2014/4/21)

こちらによると、

パーマリンク設定のカスタム構造で「?(クエスチョンマーク)」を使おうとすると発生します。
具体的には、デフォルトのパーマリンク形式をカスタム構造で記載するとダメなようです。

/?p=%post_id%

とのこと。

つまり、リライトルール等ではなく、

/article/「?p=123」

このパーマリンクの書き方がダメだったらしい!

ためしに「?」を抜いたところ、すんなり実ページのURLと記事一覧等からのリンクURLが合致しました。
あんなに.htaccessやらサーバの仕様やら調べた時間は一体ヽ(´Д`;)ノ

どうやら、WordPressでパーマリンクを解釈する際に、一部で「?」の手前までがURL、それ以降はパラメーターとして認識されるためにこういった事象が発生してしまうようです。

このため、今回の案件はパーマリンクの文字列を見直すという対応をとることで解決しました。

まとめ

カスタム構造で「?」を使用する人が少ないためか事例が全く見当たらず、調べるのに時間がかかってしまいました。
そもそもカスタム構造はSEOの観点から選択する場合がほとんどだと思うので、あえてこのような形式を使用する理由はほぼ無いのでしょう。

参考にさせて頂いた記事を見ると、WordPress管理画面のカスタム構造を使用しなければ「?」を設定する方法もあるようです。

なので、パーマリンクに「?」を使うべき理由はあるか?サイトの意義・目的を踏まえた上で正しいか?等意味をしっかり考えて選択するといいかと思います。

おまけ:「Warning: preg_match(): Compilation failed: nothing to repeat at offset 1 in <ファイル名>」

(日本語訳)コンパイルに失敗しました。preg_matchの1番目の文字列で繰り返す物がありません

最後に、こちらのエラーメッセージについて。

今回私が遭遇した事象ではこのエラーメッセージは出なかったのですが、このメッセージがでる時は今回同様「パーマリンク構造の破損」が原因の場合が多いようです。

私の場合は「url_to_postid()」を使用したらこのメッセージが表示されました。
こちらもパーマリンクが反映されない事象と同様に、カスタム構造から「?」を抜くことで解消しました。

また、パーマリンクに「?」を入れてない状態でこのエラーメッセージが表示される場合もあるようです。
その場合は以下の手順を実施することで解決する場合があります。

(※Google翻訳)

ステップ0:可能であれば、WPインストールフォルダをバックアップします。

ステップ1:すべてのプラグインを一時的に無効にする(重要なステップ)

ステップ2:WordPressの管理ダッシュボードで、[設定] – > [固定リンク]に移動します。

ステップ3:カスタムパーマリンクのフィールドにあるものを覚えておいてください。

ステップ4:デフォルトのパーマリンクを一時的に有効にするには: [変更を保存]ボタンをクリックします。

ステップ5:ウェブサイトが現在動作していることを確認します(プラグインは無効になっていますが、preg_matchエラーはなくなるはずです)

手順6:手順3で設定したカスタムパーマリンクに切り替えます。 ステップ7:すべてのプラグインを有効にする

Error Warning: preg_match()?? (2015/2)

このエラー英語記事ばかりで発狂しそう
このエラーメッセージでお困りの方、良ければ参考になさってください。

パーマリンク設定、難しいですね。
プラグインで詳細なカスタマイズをする必要がある場合など、この規則が最後で変わると致命的な影響がでかねません。
最初の構造設計でしっかりと固めておきましょう。