どうも、個人ビジネス部PHP専門のコウイチです。

 

今回は、パーマリンクに関して少し突っ込んだ内容を解説しようと思います。

 

パーマリンクが何か、分からない方は、別の記事で解説しているので、そちらをご覧ください。

 

【WordPress】最初にやっておくべきパーマリンクの設定方法を解説

[blogcard url="https://businessdepartment.jp/wordpress/permalink/"]

 

今回の記事は、パーマリンクを以下のように運用したい場合に役立つ内容です。

 

  • 記事ページに対して、ディレクトリのようにカテゴリ名を使ったURLでアクセスさせたい。

(例)https://example.com/[カテゴリ名]/[サブカテゴリ名(あれば)]/[記事タイトル]/

  • カテゴリ名自体を後から変更しても、記事のURLは変えたくない。(※ここ重要!)

 

このようなパーマリンクは、ユーザーにも検索エンジンにも優しいです。

URLを人が見ればそのサイトの構造が把握でき、検索エンジンも、サイト構造を理解しやすくなるからです。

 

普通にやるなら

このように、パーマリンク設定で「/%category%/%postname%/」をセットすればよいですよね?

 

その通りです。

そうすれば、先ほど例に出したような

(例)https://example.com/[カテゴリ名]/[サブカテゴリ名(あれば)]/[記事タイトル]/

というURLは実現できます。

 

しかし、これでは途中でカテゴリ名自体を変えた時に、記事のURLまで変わってしまいます。

これはまずいのです。今までアクセスできていたページにアクセスできなくなるわけで、検索エンジンの記事の評価もリセットされてしまうのですから。

 

では、カテゴリ名自体を仮に変えたとしても、URLを変えずに済むためためには、記事編集画面の上部のパーマリンク編集エリアで、カテゴリ名を手打ちするしかありません。

 

そのためには、パーマリンク編集エリアにスラッシュを入力する必要があります。

しかし、デフォルトの状態では、パーマリンク編集エリアにスラッシュを入力することができません。

スラッシュを入力するためには、functions.phpにソースコードを追記しなければならないのです。

 

この記事では、短いコードでこうしたパーマリンク構造を実現する方法を、ご紹介します。

ググってみても、なかなかドンピシャな記事を見つけることができませんでした。

是非参考にしてください!

 

パーマリンクにスラッシュ「/」を含めることができない

WordPressでは、記事編集画面の上部でパーマリンクを編集する際、スラッシュ「/」を含めることができません。

 

このように、スラッシュを入力してOKを押しても、勝手にハイフンに変換されてしまいます(;゚Д゚)

勝手にハイフンに変換されないようにする

functions.phpにコードを追記

sanitize_title_with_dashesというフィルタで、パーマリンクの手動入力時にハイフンに変換しています。

ですので、このフィルターを除去します。

 

ただし、フィルタを除去するだけでは、パーマリンクの文字列が日本語の場合、URIエンコードされずにDBに保存されます。

そのためページにアクセスした際、URIエンコードされた文字列と、DB上のエンコードされていない文字列が比較され、一致せず、ページがNot Foundになってしまうという現象が起こります。

 

それを防ぐため、自前でしっかりとURIエンコードフィルタを追加しておきます。

 

functions.phpに以下のコードを追加しましょう。

結果

 

めでたく、パーマリンクにスラッシュが入力できるようになりました。

しかし、そのままではページが「Not Found」になる

このまま記事ページを表示してみてください。「ページが見つかりません」となってしまうはずです。

なぜなら、スラッシュが含まれるパーマリンク文字列は、既存のパーマリンクのリライトルールにヒットしないからです。

リライトルールとは何か?

WordPressでは、例えば以下のような記事URLがあったとしますよね。

https://example.com/WordPress

このURLにアクセスすると、

https://example.com/index.php?name=WordPress

このようなURLに自動変換されて、ページにアクセスする仕組みとなっています(この変換は一例です)。

 

このように、URLを書き換えるルールを「リライトルール」と言います。

 

こうすることによって、あたかも

https://example.com/WordPress

というURLで、記事にアクセスしているかのように見せかけているのです。

 

パーマリンクのリライトルールは、正規表現文字列をキーとした連想配列で保存されていて、

と書くと表示することができます。

 

表示してみた例がこちら↓

かなり多くのルールが登録されていることが分かります。

上にあるルールほど優先されて、URLが置換される仕組みです。

 

で、この、パーマリンクの既存のリライトルールには、スラッシュを含まないパーマリンクにヒットするリライトルールが存在しています。

["([^/]+)(?:/([0-9]+))?/?$"] =>  "index.php?name=$matches[1]&page=$matches[2]"

これです。黄色の部分が、スラッシュを含まない文字列を表しています。

 

これを、スラッシュを含むことを許すルールに書き換えます。

["^(.+)(?:/([0-9]+))?/?$"] ⇒ "index.php?name=$matches[1]&page=$matches[2]"

このように書き換えてしまえば問題なさそうです。

functions.phpにコードを追記

functions.phpに、以下のコードを追加します。

post_rewrite_rulesフィルターは、パーマリンクを生成するリライトルールのフィルターです。

コールバック関数の引数からリライトルールの連想配列を受け取ることができるので、foreach文の中でリライトルールを書き換えています。

 

スラッシュをはじいているパターンをすべて書き換えているので、思わぬ動作をする可能性もあります。ご自身でページがちゃんと表示されるか、確認してくださいね。

 

これで、しっかりと記事のページが表示されるはずです。