【WP】ページがねぇよ!(404 Not Found)って「Search Console」に怒られる

2018年5月22日Google404,Google Search Console,エラー,スラッグ,パーマリンク,ワードプレスGoogle,404,Google Search Console,エラー,スラッグ,パーマリンク,ワードプレス

え~~、今回はWordPressで、カテゴリーのスラッグに日本語(マルチバイト文字)を使ったときに発生した症状のお話。

その症状なんですが~…

WordPressって、カテゴリーごとにページを持ってるんです。そして、その幾つかがグーグル様の「Search Console」に「404 Not Found」エラーとして上がってきたんですね~。

実はこれって、以前から通知されてたエラーで気にはなってたんですが解決方法が見つからず保留してたものなんです。

今回はとりあえず解決できたかな?な対応が取れたので、忘れる前に記事に残しておきます。

まずはエラーを確認する

Search Consoleのダッシュボードから確認できるんですが、こんな感じでエラーが通知されます。

Search Console のダッシュボード
Search Console のダッシュボード

で、詳細確認のためクロールエラーを開くと…

クロールエラーを確認する
クロールエラーを確認する

今回は3つのページがやり玉に挙げられてました。

多分もう少し時間が経つと他のページも出てくるはずなんですが、先日アドレス移行をしたばかりなので今はこれだけです。

ちなみにコイツラを開いてみると…

URLを開いて確認する
URLを開いて確認する

404エラー。しかし実はページは存在する

原因を探ってみる

こんなことになる理由ですが、結論としてはこれです。

日本語部分の大文字小文字問題。

「日本語なのに大文字小文字ってなんだよ?」となりそうですが、実はあの日本語は仮の姿で実体は「%xx」ってのが正体なわけです。

「%xx」は「パーセントエンコーディング(URLエンコーディングって言うときもある)」と言われるコード体系で、今回のようにURLに日本語などを使うときに用いられる表現方法なんです。

詳しくはウィキペディアくんが教えてくれます。

で、この「%xx」の「xx」の部分なんですが、16進表記(0~9とA~Fの組み合わせ)になっていて、ここのアルファベット部分の大文字と小文字が今回の原因になります。

え~つまりだ、グーグル様は日本語部分のパーセントエンコーディングをすべて大文字にしてチェックにくるんですが(これが一応正しい)、うちのWordPressちゃんは小文字でしか受け付けない、ちょっと困ったちゃんなんですね。

URLの違い
URLの違い

その結果が「404 Not Found」ページがねぇよ?となってくるわけです。

もう少しだけ補足すると、この現象が確認できるのは、カテゴリーのスラッグが日本語だった場合に発現するようです。投稿記事のスラッグは日本語でも問題なく表示できてました。(私の環境では…ね)

そして今回施した対策です

今回の対策にあたって、下記サイトを参考にさせてもらいました。

[blogcard url=https://www.konetacho.com/post/38.html]

そして具体的な対策方法ですが、WordPress本体のPHPファイル「class-wp.php」を修正することで対応しました。

本体側のファイル修正なので、WordPressのバージョンアップでリセットされちゃうんですが…

そうはいっても他に有効な手段も見つけられなかったので、一旦はこの方法で対策しようと思います。

以下、実際に行った手順になります。

WordPressのPHPファイル「class-wp.php」をダウンロードする

FTPでダウンロードします。それとオリジナルはどこかにバックアップ推奨です。

「class-wp.php」ファイルは「/wp-includes」の中にあります。

「class-wp.php」をダウンロードする
「class-wp.php」をダウンロードする

PHPソースの該当箇所に大文字と小文字を区別しないようスイッチを追加する

修正箇所ですけど、私が触ったときは「218~221行目」でしたが、WordPressのバージョンなどにより異なる場合もあると思います。

「preg_match」ってメソッドを使ってる箇所なので、それで検索すると見つけやすいかもしれません。

if ( preg_match("#^$match#", $request_match, $matches) ||
  preg_match("#^$match#", urldecode($request_match), $matches) ) {
  if ( $wp_rewrite->use_verbose_page_rules &&
    preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) {

↓↓↓これを修正↓↓↓

// 検索パターンにiスイッチを追加し大文字と小文字の区別をなくす
if ( preg_match("#^$match#i", $request_match, $matches) ||
  preg_match("#^$match#i", urldecode($request_match), $matches) ) {
  if ( $wp_rewrite->use_verbose_page_rules &&
    preg_match( '/pagename=\$matches\[([0-9]+)\]/i', $query, $varmatch ) ) {
  • 9行目の「"#^$match#"」→「"#^$match#i“」
  • 10行目の「"#^$match#"」→「"#^$match#i“」
  • 12行目の「’/pagename=\$matches\[([0-9]+)\]/’」→「’/pagename=\$matches\[([0-9]+)\]/i'」

という感じで3箇所修正しました。

修正が終わったら「class-wp.php」ファイルをアップロードする

「class-wp.php」を元の場所に上書きします。

「class-wp.php」をアップロードする
「class-wp.php」をアップロードする

404エラーになったURLを開いてテストする

最初に開いてエラーになったページを再び開いてみます。

もう一度URLを開いて確認する
もう一度URLを開いて確認する

お~~!開いた開いた!

無事表示できました!

というわけで完了!

WordPressのファイルを直に触っちゃってるのでメンテナンス性は悪いですが、一応、目的は達成できたのでこれで良しとしておきます。

もっといい方法が見つかったら追記します。∠( ゚д゚)/