WORDPRESSのURLをカスタマイズして、GETで送るパラメータをかっこよく取得する方法です。
結果から言うと「add_rewrite_rule()」という関数を使います。
ちゃんと追ってやれば簡単ですが、ちゃんとやらないとできません。
詳しくはオフィシャルがとっても詳しいです。
Rewrite API/add rewrite rule
https://wpdocs.osdn.jp/Rewrite_API/add_rewrite_rule
こんな風なURLでアクセスさせたいページがあったとしたら、
http://example.com/leaf/95functions.phpにこのように記述しろ、とあります。
function custom_rewrite_basic() {
add_rewrite_rule('^leaf/([0-9]+)/?', 'index.php?page_id=$matches[1]', 'top');
}
add_action('init', 'custom_rewrite_basic');※([0-9]+)とか入っていますが、正規表現ですね。この場合は、数字の文字列を取得しますよ、っていう感じです。そこに入った数字は$matches[1]として使えます。
ですが、やってみるとなかなかできない…。
書かれてある通りやってもできない。
原因は重要な注意書きを読み飛ばしたことでした。
重要: リライトルールの変更後は、忘れずにリライトルールデータベースの内容をフラッシュし、再作成してください。WordPress の 管理画面から、「設定」->「パーマリンク設定」を選択し、何も変更せずに「変更を保存」をクリックしてください。これで同じページに対して、以下の形式でアクセスできます。
はい、簡単ですね。パーマリンクを更新することが必要だったわけです。
でも、作業をしているときにいちいちパーマリンク更新も面倒ですよね。
そんなときは、下のようにflush_rewrite_rules()をfunctions.phpに記述しておくと作業が楽になります。
add_action('init', function(){
flush_rewrite_rules(false);
});
作業が終わったら取ってしまいましょう。
以下はわたしが作業した時の例です。
function custom_rewrite_tag() {
add_rewrite_tag('%item%', '([^&]+)');//商品IDとしていますが、なんでもいいです。
add_rewrite_tag('%form_number%', '([^&]+)');//使用するフォームのID
}
add_action('init', 'custom_rewrite_tag', 10, 0);function custom_rewrite_urls() {
add_rewrite_rule('^form/([0-9]+)/item/([0-9]+)/?','index.php?page_id=11&form_number=$matches[1]&item=$matches[2]','top');
//page_id=11というのは、固定ページのIDで、フォーム用に1ページこさえたものです。
}
add_action('init', 'custom_rewrite_urls', 10, 0);add_action('init', function(){
flush_rewrite_rules(false);//パーマリンクの更新用。作業が終わったらadd_actionごと削除ね。
});
この例はちょっとだけややこしいです。
Contact form 7 を使って、フォームをいくつも用意する必要があったのですが、いちいち一つのフォームごとに固定ページを作るというのはどうもスマートじゃないですね。なので、ひとつの固定ページであらゆるフォームを表示切るようにしたくなったわけです。
フォーム用に1ページこさえて(例だとpage_id=11です)、そこにアクセスしてきたらform_numberのパラメータでcontact form 7のIDを取得。
itemも取得して、それを使って商品タイトルだのなんだのを引き出せばよいかなという感じです。
$form_number = esc_html($wp_query->query_vars['form_number']);
//一応esc_html()でエスケープしておきましょう。悪いコードを打ってきたりする輩がいないとも限らないので。
$item_id = esc_html($wp_query->query_vars['item']);
echo "商品IDは".$item_id."です。これを使って商品名などなど引っ張りますよ";
echo do_shortcode( '[contact-form-7 id="'.$form_number.'" title="Contact form 1"]' );
という感じです。
取り掛かりは難しいと思ったけど、終わってみるとそれほどじゃないって感じです。
頑張ってください。質問があればコメントで。