はじめに
WordPressで動的ルーティングを実装する方法のサンプルです。
問題
WordPressの修正案件。
地域の出し分けをカスタム投稿でやってほしいとのこと。
差分少ないし、記事を何十も作るのダルメシアンだったので、動的ルーティング使って解決。
ただLaravelやReactの感覚でいたから、予想の10倍は苦労した。
解決方法
functions.php
function custom_rewrite_rule()
{
add_rewrite_rule(
'^area/([^/]*)/([^/]*)/?',
'index.php?pagename=city&prefecture=$matches[1]&city=$matches[2]',
'top'
);
}
add_action('init', 'custom_rewrite_rule');
function custom_query_vars($vars)
{
$vars[] = 'prefecture';
$vars[] = 'city';
$vars[] = 'area_redirect';
return $vars;
}
add_filter('query_vars', 'custom_query_vars');
function custom_template_include($template)
{
if (get_query_var('prefecture') && get_query_var('city')) {
$new_template = locate_template(array('city.php'));
if (!empty($new_template)) {
return $new_template;
}
}
return $template;
}
add_filter('template_include', 'custom_template_include');
function custom_wpseo_title($title)
{
if (!get_query_var('area_redirect')) {
$city = get_query_var('city');
$title = urldecode(esc_html($city));
}
return $title;
}
add_filter('wpseo_title', 'custom_wpseo_title');
解説
1
WordPressの起動時に実行。
ルーティングを行うURLをURLパラメーターに変換する。
function custom_rewrite_rule(){}
add_action('init', 'custom_rewrite_rule');
2
変換したパラメーターを受け取る
function custom_query_vars($vars){}
add_filter('query_vars', 'custom_query_vars');
3
URLパラメーターを持つ時にテンプレートファイルの呼び出し。
今回はcity.phpに、地域ごとに出し分ける記述を書く。
(例えば市町村ごとの事例とかお客様の声とか)
function custom_template_include($template) {}
add_filter('template_include', 'custom_template_include');
4
titleタグの修正。
これを書かないと、404扱いになります。
filterのキーはSEOプラグインによって変わるので調べてください。
function custom_wpseo_title($title) {}
add_filter('wpseo_title', 'custom_wpseo_title');
おわりに
全体像は掴んでるけど、細かい処理までは追ってないです。
正直、なんで動くか厳密には把握してないし、あくまで参考程度にしてください。
個人的には4でドツボったので、誰かの役に立てば。