主に技術的なことを書くブログ

浅めにマークアップ&フロントエンドの技術的なことをメモしていましたが、ざっくばらんに書いています。

Wordpress のパーマリンク設定のカスタム構造の postname を .html から スラッシュ終わりにしたら、スラッグが数字のみのページが 404 になる

Wordpressパーマリンク設定のカスタム構造のパスを、 .html 終わりから f:id:nakagaw:20171026104630p:plain

/ 終わりに変更したら f:id:nakagaw:20171026104500p:plain

スラッグが数字のみのページが 404 になってしまいました。

いろいろ調べたのですが、

パーマリンクの使い方 - WordPress Codex 日本語版

一日に一投稿しか公開しないので %year%%monthnum%%day% というパーマリンクを使用したいと思うかもしれませんが、このリンクはその日の全投稿のアーカイブとして生成されることに注意してください。個別投稿へのリンクは、少なくとも %year%%monthnum%%day%%hour% にする必要があります。

これば別のプラグイン

ローカルタグ URL で 404 エラーが発生する場合は、WordPress の生成する内部書き換え規則がでしゃばり過ぎて UTW の書き換え規則よりも先に呼び出されるからです。この現象は通常、(/%postname%/ のような) カスタムパーマリンク構造を使用している時にのみ起こります。

あたりはものすごく臭うものの、ちょっとずれてて。 こんな誰もがハマりそうなところで全く情報がないのがもやっとしてます。

一番ちかいのが

WordPressのパーマリンク設定で絶対にやってはいけないこと – 数字だけの記事ファイル名

これかなっとおもったけど、4桁とか全く関係なく、数字だと何桁でもアウトな感じで、だいぶはまってたのですが。 この特定のURLを入力すると、どんな Riweire rule がかかってるかを調べるプラグインをおしえてもらって、調査してみると、、

wordpress.org

.html 終わりの場合

Rule:

(.+?)/([^/]+).html(?:/([0-9]+))?/?$

Rewrite 後:

index.php?category_name=$matches[1]&name=$matches[2]&page=$matches[3]

https://example.com/category-hoge/category-fuga/20171026.html
↓ 内部的にはこうなる
https://example.com/index.php?category_name=category-hoge/category-fuga&name=20171026
=> ページあり

/ 終わりの場合

Rule:

(.+?)/([^/]+)(?:/([0-9]+))?/?$

Rewrite 後:

index.php?category_name=$matches[1]&name=$matches[2]&page=$matches[3]

https://example.com/category-hoge/category-fuga/20171026/
↓ 内部的にはこうなる
https://example.com/index.php?category_name=category-hoge&name=category-fuga&page=20171026
=> Not found

アンダースコアひとつでもはいってると
https://example.com/category-hoge/category-fuga/20171026_/
↓ 内部的にはこうなる
https://example.com/index.php?category_name=category-hoge/category-fuga&name=20171026_
=> ページあり

解決策

?&name= のあとにページスラッグがあれば、そのあいだのカテゴリがどんなものであっても、該当のページに辿りつけるみたいなので、

function.php に以下の add_rewrite_rule を追記

// 数字 + スラッシュ で終わるページの 404 なくす
function custom_rewrite_basic() {
  add_rewrite_rule('category-hoge/([^/]+)(?:/([0-9]+))?/?$', 'index.php?category_name=category-hoge/$matches[1]&name=$matches[2]', 'top');
}
add_action('init', 'custom_rewrite_basic');

無事ページが表示されました。

これにハマった人でないと何の話やねん、って感じだと思いますが、そうなったときに見ていただければと思います。

参考: