WordPress リライトルール
| WordPress通常のパーマリンク設定では実現しない時に、このアドレスでアクセスした時に、どの記事/ページにアクセスするというようなリライト設定をする。
URL的にこっちよりこっちのほうがっていうのは、まぁそのままWordPressの機能を使うだけなら問題ないのですが、ブログではなくサイトを作る際にはたまに出てきます。
フォームを作ったけど、URLを分けてほしいとかっていうようなときです。
例えば、記入するページ、確認ページ、完了ページというような感じです。
分けて作ればいいんですが、PHPで作るときちょっと面倒なので一括で作ったりしちゃってますw
ってなわけでそんなときに便利なリライトルールをご紹介します。
通常のリライト
簡単に設定する方法としてこんな感じです。
// functions.php
add_rewrite_rule('posttype/([^/]+)/([^/]+)/?$', 'index.php?category_name=$matches[1]', 'top');
こちらで設定した場合は。管理画面上のパーマリンクの設定で保存をし直す必要があります。
あれ?うまく行かないな、こうかな?ってときでも変えたら、管理画面でパーマリンクの保存です。
なんでなんでしょうねwちょっと面倒なので下記のような方法もあります。
rewrite_rules_arrayで設定
複数のリダイレクト設定をする場合はこっちのが手っ取り早いかも
管理画面でのパーマリンク設定で保存をする必要はありません。
// functions.php
add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');
// ルールを追加するときはflush_rules()を忘れないように
function flushRules(){
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
// 新しいルールを追加
function wp_insertMyRewriteRules($rules){
$newrules = array();
$newrules['(project)/([^/]+)/?$'] = 'index.php?post_type=project&project_categoy=$matches[1]';
return $newrules + $rules;
}
// 変数idを追加して、WordPressが認識できるようにする
function wp_insertMyRewriteQueryVars($vars){
array_push($vars, 'id');
return $vars;
}
下記の設定は特に変える必要はないみたい。
// functions.php
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');
下記の関数にルールを記述するとよいらしい。
// functions.php
add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
リライトのルールの設定は基本的には正規表現を利用してリライトを指せる
() -> $matches[n] で引っ張れるのでまんま正規表現的に飛ばせる。
// functions.php
// 編集するのはこの部分
$newrules['(project)/([^/]+)/?$'] = 'index.php?post_type=project&project_categoy=$matches[1]';
// 条件を増やしたいときはそのまま増やす。
$newrules['(project)/([^/]+)/?$'] = 'index.php?post_type=project&project_categoy=$matches[1]';
$newrules['(company)/([^/]+)/?$'] = 'index.php?post_type= company& company_categoy=$matches[1]';
// 配列でやっているので連想配列的に書くのもOK
$newrules = array(
'(project)/([^/]+)/?$' => 'index.php?post_type=project&project_categoy=$matches[1]',
'(company)/([^/]+)/?$' => 'index.php?post_type=company&company_categoy=$matches[1]',
);
まとめ
wordpressで思った通りのPathにならなかった場合はこういうふうにでも一応Pathを通すことができる。
できる限りは、defaultでやったほうが、今後のカスタマイズ性能上がるのだろうけどもね。