[WordPress]世界一わかりやすいRewriteRuleについて。

まず最初に結論から申し上げます

まず最初に結論を書きますが、リライトルールは簡単に説明すると上記の通りです。
理解出来る人にはこの時点で理解出来ると思います。

これで理解出来ない人も多いとは思いますが、この段階では「そうゆうもんなんだなぁ。」位に覚えておいて下さい。

そして、理解できなかった人は是非最後まで記事を読んで、ここまで戻ってきて見て下さい。上記の画像が少しは理解出来るかもしれません。

ここから本編スタート

WordPressで制作されたサイトを見て、詳細ページからスラッシュ区切りで1つづつ消していくと404ページが出現するサイトがあります。

個人的にこれが物凄く気持ちが悪いです。

なんでURLに存在しないページの階層あるねん

ってなりますね。

きっとあなたもなりますよね?

正しいURLを作成するのに必須なリライトルールについて説明します。

はっきり言うとリライトルールはちょと難しいです。

世界一わかりやすく説明するので、事実を一部分かりやすく湾曲すると思います。ご了承下さい。

静的サイトのURLはそんなに難しくない

静的サイトの場合、URLの構成ってすごく簡単です。

ディレクトリの中にディレクトリがあって、その中にファイルがあって…
その場合/ディレクトリ名/ディレクトリ名/ファイル名でアクセスする事が出来ます。

上記の様に階層場合は、そのままスラッシュで区切ればURLになります。

しかしワードプレスの場合はちょっと勝手が違います。

ワードプレスは実は/index.php?~~~のみで構成されてる?

普段あまり意識した事無いと思いますが、ワードプレスをインストールしたときにconfig.phpやwp-adminやwp-contentが入ってる階層にあるindex.php。
実はこのindex.phpこそワードプレスの全てのページを表示させています。

このindex.phpにgetでパラメータを与える事で、様々なページを表示させてくれます。

https://~~~~~/index.php?post_type=post&p=2

例えば上記のようなURLがあったとします。するとWP内で色々動き、任意のページを表示してくれます。

なぜかって?

今は聞かないで下さい。

そうゆうものなんです。

GETってなんだ??パラメーターってなんだ?

formを作る際にmethod=POST や GETって書いたの覚えてますか?
詳しい説明は省きますが、あのGETと同じ物です。

URLのファイル名などの末尾に「?」を付け、続けて「パラメータ名=値」の形式で記述する。「&」で区切ることで複数のパラメータを送信することもできる。URLの一部であるためあまり長い情報は送れず、クライアントからファイルを送信するなど大きなデータを送信したい場合はPOSTメソッドを用いる。

https://e-words.jp/w/GET%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89.html

と偉い人がおっしゃっています。

URLにGETでパラメーターを持たすには、URLの語尾に?をつけてあげます。
続けてtype=postの様に記述してあげる事でそのページにパラメーターを持たす事が出来ます。

ワードプレスはそのパラメータを受け取り、加工したり条件分岐したりする事が出来ます。
話がややこしくなるのでコードは書きません。

ただし、URLでパラメーターを付与するこの型は是非覚えて置いて下さい。

パラメーターを受け取ったサーバー側がいろいろ処理して表示したいページを表示しています。
どの様な環境下でもページを表示する事ができるのが強みです。
これを”Ugly” Perma linkと呼びます。(あんまり覚えなくてOK)

たまに「ワードプレスは動的」「動的なサイト」など表現する人がいますが、このugryパーマリンクを見ると動的なサイト感が凄く出てて分かりやすいですね。

ugly perma link → https://~~~~~/index.php?post_type=post&p=2

ワードプレスでこんなURL見たこと無い!!!!

実は皆さんが普段使うサイトは.htaccessが使用出来る場合がほとんどなので、URLを変更する事が可能です。
ここも詳しく書くと話が難しくなるので簡単に書きますが、mod_rewriteやLighttpd機能を利用する事でURLを私達の普段見慣れた形に整形してくれます。

れを“pretty” Perma linkと呼びます。

このURLが普段私達が見てるワードプレスのURLの形になりますね。

pretty Perma link → https://~~~~~/tokyo/shinjuku/12

【寄り道】正規表現について

リライトルールを追加しようとする時、最初に立ちはだかる壁が正規表現です。
正規表現はエディターの検索機能などにも搭載しています。
今後必ず使う機会が訪れるので、ここで軽く覚えておくのもいいでしょう。

そしてここで正規表現の説明をすると、もう1記事書けてしまうので参考サイトを御覧ください。

参考サイト → https://userweb.mnet.ne.jp/nakama/

【 本題 】リライトルールの追加方法

リライトルールは予めWPにセットされています。
「こうゆうパターンの時は、こうゆうURLにしてね!」と予めセットされています。
これを書き換える、または追加する事でURLを任意のURLに変更出来るわけです。

以下が予めセットされているリライトルールになります。

array(141) {
  ["waza/([^/]+)/([^/]+)?$"]=>
  string(38) "index.php?post_type=waza&p=$matches[2]"
  ["sitemap(-+([a-zA-Z0-9_-]+))?\.xml$"]=>
  string(40) "index.php?xml_sitemap=params=$matches[2]"
  ["sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$"]=>
  string(49) "index.php?xml_sitemap=params=$matches[2];zip=true"
  ["sitemap(-+([a-zA-Z0-9_-]+))?\.html$"]=>
  string(50) "index.php?xml_sitemap=params=$matches[2];html=true"
  ["sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$"]=>
  string(59) "index.php?xml_sitemap=params=$matches[2];html=true;zip=true"
  ["^wp-json/?$"]=>
  string(22) "index.php?rest_route=/"
  ["^wp-json/(.*)?"]=>
  string(33) "index.php?rest_route=/$matches[1]"
  ["^index.php/wp-json/?$"]=>
  string(22) "index.php?rest_route=/"
  ["^index.php/wp-json/(.*)?"]=>
  string(33) "index.php?rest_route=/$matches[1]"
  ["^wp-sitemap\.xml$"]=>
  string(23) "index.php?sitemap=index"
  ["^wp-sitemap\.xsl$"]=>
  string(36) "index.php?sitemap-stylesheet=sitemap"
  ["^wp-sitemap-index\.xsl$"]=>
  string(34) "index.php?sitemap-stylesheet=index"
  ["^wp-sitemap-([a-z]+?)-([a-z\d_-]+?)-(\d+?)\.xml$"]=>
  string(75) "index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]"
  ["^wp-sitemap-([a-z]+?)-(\d+?)\.xml$"]=>
  string(47) "index.php?sitemap=$matches[1]&paged=$matches[2]"
  ["waza/?$"]=>
  string(24) "index.php?post_type=waza"
  ["waza/feed/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(41) "index.php?post_type=waza&feed=$matches[1]"
  ["waza/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(41) "index.php?post_type=waza&feed=$matches[1]"
  ["waza/page/([0-9]{1,})/?$"]=>
  string(42) "index.php?post_type=waza&paged=$matches[1]"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(95) "index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]&post_type=waza"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(95) "index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]&post_type=waza"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$"]=>
  string(96) "index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]&post_type=waza"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$"]=>
  string(78) "index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&post_type=waza"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(79) "index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]&post_type=waza"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(79) "index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]&post_type=waza"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$"]=>
  string(80) "index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]&post_type=waza"
  ["waza/date/([0-9]{4})/([0-9]{1,2})/?$"]=>
  string(62) "index.php?year=$matches[1]&monthnum=$matches[2]&post_type=waza"
  ["waza/date/([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(58) "index.php?year=$matches[1]&feed=$matches[2]&post_type=waza"
  ["waza/date/([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$"]=>
  string(58) "index.php?year=$matches[1]&feed=$matches[2]&post_type=waza"
  ["waza/date/([0-9]{4})/page/?([0-9]{1,})/?$"]=>
  string(59) "index.php?year=$matches[1]&paged=$matches[2]&post_type=waza"
  ["waza/date/([0-9]{4})/?$"]=>
  string(41) "index.php?year=$matches[1]&post_type=waza"
  ["waza/author/([^/]+)/page/?([0-9]{1,})/?$"]=>
  string(66) "index.php?author_name=$matches[1]&paged=$matches[2]&post_type=waza"
  ["waza/author/([^/]+)/?$"]=>
  string(48) "index.php?author_name=$matches[1]&post_type=waza"
  ["category/(.+?)/feed/(feed|rdf|rss|rss2|atom|smartnews)/?$"]=>
  string(52) "index.php?category_name=$matches[1]&feed=$matches[2]"
 
~ 省略 〜

  ["[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom|smartnews)/?$"]=>
  string(49) "index.php?attachment=$matches[1]&feed=$matches[2]"
  ["[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$"]=>
  string(50) "index.php?attachment=$matches[1]&cpage=$matches[2]"
  ["[^/]+/([^/]+)/embed/?$"]=>
  string(43) "index.php?attachment=$matches[1]&embed=true"

}

URLを正規表現でマッチさせて、当てはまるリライトルールを適用します。
この際上にあるものほど優先順位が高くなります。

URLに関する記事は過去に書いてますのでそちらをご覧下さい。

以下のプラグインを使用することによって、pretty URLを簡単に取得する事ができます。

Debug Bar
管理バーにクエリーやキャッシュ、その他役に立つデバッグ情報を表示するデバッグメニューを追加します。

デバッグバーを有効にするとアドミンバーにデバッグが追加されているので、それをクリックすると下記の様な画面が開きます。

上記画面の簡単な見方を説明します。

一致したリライト・ルール

waza/([^/]+)/([^/]+)?$

現在のURLとマッチしてるリライトルールを表示してくれます。

一致したリライト・クエリー

一致したリライトルールに対応してるpretty URLを表示してくれてます。

現在URLに対応してるpretty URLを確認する

https://~~~/waza/◯◯/◯◯

のパターンとURLが一致した時に,

post_type=waza&p=77

が適応されていることがデバックから知る事が出来ました。

実はこのURLは既に変更されているURLです。

リライトルールの変更の仕方

どうやってリライトルールを変更したか簡単に説明します。

function.phpで以下のコードを記述しています。

function myUrlRewrite($rules){
    $myRule = array();
    $myRule['waza/([^/]+)/([^/]+)?$'] = 'index.php?post_type=waza&p=$matches[2]';
  
    return array_merge( $myRule, $rules );
}
add_action('rewrite_rules_array', 'myUrlRewrite' );

rewrite_rules_arrayのフックを使用します。フックに関しても説明は省きます。
簡単に言うとワードプレスの便利機能のうちの1つです。

このフックを使用して$rulesに追加してあげると、リライトルールが追加されます。

 $matches[2] $myRule[‘waza/([^/]+)/([^/]+)?$’]の部分の $myRule[‘waza/([^/]+)/([^/]+)?$’]ここの部分が代入されます。

まとめ

以上、リライトルールをざっくり説明してみました。

出来る限りわかりやすく書いてみましたが、、リライトルールは正規表現も相まって、非常に難しいです。

しかしリライトルールを扱える様になると、パーマリンクリンク(サイト)をキレイに構築する事が可能です。

この記事は最初に結論を書いてしまったので、もう一度最初の画像を見てみて下さい。
最初よりは理解が深まってるかと思います。

タイトルとURLをコピーしました