URLリライトし、独自追加した「URLクエリ文字列」へ値受渡(検証の例)
WordPressは内部的にURLを常にリライトして記事や固定ページのURLを認識しています。
特定のURLに対して、URLクエリ文字列などを用いて、値の受け渡しをする場合には、
ちょっとしたコツが必要になってきます。
ここでは「WordPressのURL」に下部のディレクトリパスを与えて、
URLクエリ文字列として値を受け取る流れをご紹介します。
WordPressはCMSとしては非常に便利で使いやすいこともあって多くの人が利用しています。
しかしCMS(ブログ)として使う分にはいいのですが、
少し凝ったアプリケーションなどを組み込みたいと思った時には苦労するかもしれません。
URLの扱いなどがハマる部分なのではないかと思います。
概要
URLリライトし、独自追加した「URLクエリ文字列」へ値受渡(検証の例)
おそらく何を言っているのかさっぱり伝わらない事と思います。
動きとしては、以下の記事でご紹介したものと同じなのですが。
上記のリンク先の記事のURLは「https://rensrv.com/wp/query_string_get/」で、
WordPressの投稿として作成されています。
この投稿に対して「https://rensrv.com/2018/05/query_string-approach-is-reversed/hogehoge/」と、
「hogehoge/」を付加してリンクを開くと、
投稿に埋め込んんだショートコードが値を受け取って、
「hogehoge」と記事内に表示するといった事です。
クリックしてみれば、表示されるのが分かりますし、
ブラウザバーで「hogehoge」を「なんでもいいの?」とか変えても値を渡せます。
「https://rensrv.com/2018/05/query_string-approach-is-reversed/なんでもいいの?/」
地味にやりたいなぁと思って、挫折してる人結構いると思うんです。
私も長らく放置してきたものですから。。。
WordPressの投稿にURLクエリ文字列で値を渡す
WordPressの投稿にURLクエリ文字列で値を渡したいと思う事ありませんか?
「この記事に対して渡されたパラメータの値で、ショートコードで出力するタグの値を変えたい」とか。
URLクエリ文字列が見えて構わないパターン
ただ単純にURLクエリ文字列で値を渡して、
URLで値が丸見えで良ければ、誰でも簡単に実現する事ができると思います。
皆大好き「$_SERVER[“QUERY_STRING”]」や「$_GET」で簡単に取れますので。
値の受け取り方自体はいろいろあります。
$_SERVER[“QUERY_STRING”]
$_GET
$GLOBALS->WP->QUERY_VARS
GET_QUERY_VAR( $VAR, $DEFAULT )
$wp_query->query_vars
だけど、それだとURLが以下のように「?my_var=123&no_setting_var=000」のように、
URLクエリパラメータ形式になってしまいます。
これでは、Google先生にあまり好かれるような形式ではなくて困ります。。。
URLクエリ文字列をディレクトリで表現するパターン
となると、URLリライトを定義して、
ディレクトリ構造をWordPressに認識させて、内部的にURLクエリ文字列で値を渡すという事になります。
これが簡単そうで、意外と面倒くさいというか、
ヘルプを読んでいても、ちょっとふわっとした書き方で終わっていたりして悩みました。
WordPress自体のデータの取得方法については詳しいんですけどね。
悩んだ結果、ぶっちゃけ「.htaccess」でやっちゃう人の方が多いんだろうなとも思います。
WordPressに「カスタムクエリ文字列」を定義し認識させる
まずWordPressが内部的に認識しているクエリ文字列に対して、
「カスタムクエリ変数」の定義を行う必要があります。
今回は「my_var」というカスタムクエリ変数名を追加しています。
以下のようにfunctions.phpへ記述する事で、
WordPressは「my_var」というURLクエリ文字列にて値の受け取りができるようになります。
1 2 3 4 5 |
function add_query_vars_filter( $vars ){ $vars[] = "my_var"; return $vars; } add_filter( 'query_vars', 'add_query_vars_filter' ); |
動作環境としてご紹介しているWordPress(以下「動作環境」)で、
既に定義済み「カスタムクエリ変数」は以下で確認できます。
http://url-query-string-erase.rensrv.com/globals/public_query_vars/
WordPressに「リライトルール」を定義し認識させる
またWordPressのリライトルールとして、
「動作環境」には以下の設定を行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function test_flush_rewrite_rules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); } function test_custom_endpoint( $wp_rewrite ) { $feed_rules = array( 'globals/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=41&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2), '_serverquery_string/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=44&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2), '_get/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=51&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2), 'get_query_var-var-default/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=54&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2), 'wp_query_query_vars/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=54&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2), '2018/04/hello-world/([0-9]{3})/([0-9]{3})/?$' => 'index.php?p=156&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2), '2018/05/post_get_value/([0-9]{3})/([0-9]{3})/?$' => 'index.php?p=156&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2) ); $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules; return $wp_rewrite->rules; } add_filter( 'generate_rewrite_rules', 'test_custom_endpoint' ); add_filter('init', 'test_flush_rewrite_rules'); |
ごちゃごちゃとしていますが基本は以下の
5つの固定ページのパスと、
2つの投稿のパスへ
リライト定義をしています。
'globals/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=41&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2),
'_serverquery_string/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=44&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2),
'_get/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=51&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2),
'get_query_var-var-default/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=54&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2),
'wp_query_query_vars/([0-9]{3})/([0-9]{3})/?$' => 'index.php?page_id=54&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2),
'2018/04/hello-world/([0-9]{3})/([0-9]{3})/?$' => 'index.php?p=1&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2),
'2018/05/post_get_value/([0-9]{3})/([0-9]{3})/?$' => 'index.php?p=156&my_var='. $wp_rewrite->preg_index(1) .'&no_setting_var='. $wp_rewrite->preg_index(2)
他の部分はすべて同じ構造になっています。
投稿や記事のURLの後ろに「/nnn/NNN/」形式でパスを繋げると、
「nnn」の文字は「my_var=nnn
」としてURLクエリ文字列として、
「NNN」の文字は「no_setting_var=NNN
」としてURLクエリ文字列としてURLを生成されて、
要求パスがリライト(リダイレクトではない)されます。
尚、投稿(記事)のURLへリライトする場合は「page_id=
」で指定し、
固定ページのURLへリライトする場合は「p=
」で指定しています。
これが環境に寄るものか、WordPressバージョンによるものなのかは分かりませんが、
内部でリライトされる順序などによって認識されない場合があるようです。
少なくとも「当サイト(rensrv.com)」と「動作環境」では、
このように指定しないとうまくリライトされませんでした。
リライトと値渡しの仕組み
上記の環境によって以下のURLにアクセスを行った際には、
それぞれパラメータとして解釈され値が渡されます。
固定ページの例
http://url-query-string-erase.rensrv.com/_serverquery_string/123/456/
http://url-query-string-erase.rensrv.com/_get/123/456/
http://url-query-string-erase.rensrv.com/globals/123/456/
http://url-query-string-erase.rensrv.com/wp_query_query_vars/123/456/
http://url-query-string-erase.rensrv.com/get_query_var-var-default/123/456/
投稿(記事)の例
http://url-query-string-erase.rensrv.com/2018/04/hello-world/123/456/
http://url-query-string-erase.rensrv.com/2018/05/post_get_value/123/456/
各ページのURLでスラッシュに囲まれたそれぞれの部分
赤部分は「my_var=123」に渡される値 になります。
緑部分は「no_setting_var=456」に渡される値 になります。
どちらも「[0-9]{3}」の正規表現でマッチングしている為、
「/nnn/」の数字3桁のみがURLクエリ文字列として認識します。
但し実際には、
緑部分としている「no_setting_var=」には何を指定しても受け取る事はできません。
これは「カスタムクエリ変数」に対して「no_setting_var」を登録していない為で、
値が受け取れないことを確認する為のものです。
こちらも、それぞれの受け取り方にて値の取得を検証していますが、
WordPress内部のリライト定義で実現する機能であるため、
一般的な「$_SERVER[“QUERY_STRING”]」や「$_GET」では、
値が全く取れていないことが確認できます。
$_SERVER[“QUERY_STRING”]
$_GET
$GLOBALS->WP->QUERY_VARS
GET_QUERY_VAR( $VAR, $DEFAULT )
$wp_query->query_vars
投稿側では一括して各値の取得と表示をしていますので、
てっとり早いかもしれません。
どうでしょう?
このアプローチならばWordPressのパスの下にさらにディレクトリ階層を持たせて、
それぞれパラメータとして認識させて、
受け取ったショートコード側で、記事の値を変化せる事も容易になります。
WordPressでそこまでする必要は無いと言えばないけども。
以下の記事の中で値を取って、表示する簡単な例は確認できます。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日: