■リダイレクト
■リライトルールの概要
WordPress パーマリンク リライトルール/ Web Design Leaves
https://www.webdesignleaves.com/pr/wp/wp_permalink_rewrite.html
add_rewrite_endpoint() を使うことにより、処理のエンドポイントを追加できる
これと wp_redirect() などリダイレクト命令を組み合わせることにより、
「特定ページにアクセスされたら、特定ページにリダイレクト」ができる
■処理のエンドポイントを追加
functions.php に以下のコードを追加したとする
add_rewrite_endpoint( 'my-endpoint', EP_ROOT );
「管理画面 → 設定 → パーマリンク設定」で、何も変更せずに「変更を保存」をクリックする
この状態で /my-endpoint/ というURLにアクセスすると、トップページ(EP_ROOT)が表示される
functions.php に以下のコードを追加したとする
add_rewrite_endpoint( 'foo', EP_PERMALINK | EP_PAGES );
function my_foo_template_redirect() {
$foo = get_query_var( 'foo' );
if(!empty($foo)) {
echo 'パラメータの値: ' .$foo;
exit;
}
}
add_action( 'template_redirect', 'my_foo_template_redirect' );
「管理画面 → 設定 → パーマリンク設定」で、何も変更せずに「変更を保存」をクリックする
/contact/ というページが存在するとして、この状態で /contact/foo/hello/ というURLにアクセスすると以下が表示される
パラメータの値: hello
functions.php に以下のコードを追加したとする
add_rewrite_endpoint( 'foo', EP_ALL );
function my_foo_template_redirect() {
$foo = get_query_var( 'foo' );
if(!empty($foo)) {
echo 'パラメータの値: ' .$foo;
exit;
}
}
add_action( 'template_redirect', 'my_foo_template_redirect' );
「管理画面 → 設定 → パーマリンク設定」で、何も変更せずに「変更を保存」をクリックする
この状態で /foo/hello/ というURLにアクセスすると以下が表示される
パラメータの値: hello
■リダイレクト
※「Simple 301 Redirects」プラグインなどを使うことでもリダイレクトはできるので、それらの利用も検討するといい
template_redirect の詳細については以下を参照
どのテンプレートを読み込むかを決定する直前(ページを表示する直前)に実行されるとのこと
この時点ではまだレスポンス(ヘッダ)を返していないので、
wp_redirect() や wp_safe_redirect() などを使って任意の URL にリダイレクトさせることができる
WordPress functions.php / Web Design Leaves
https://www.webdesignleaves.com/pr/wp/wp_functions_php.html#template_redirect
これを利用して例えば functions.php に以下のコードを追加したとする
add_rewrite_endpoint( 'foo', EP_ALL );
function my_foo_template_redirect() {
$foo = get_query_var( 'foo' );
if(!empty($foo) && $foo == 'contact' ) {
wp_redirect( home_url( '/contact/' ) );
}
}
add_action( 'template_redirect', 'my_foo_template_redirect' );
「管理画面 → 設定 → パーマリンク設定」で、何も変更せずに「変更を保存」をクリックする
この状態で /foo/contact/ というURLにアクセスすると /contact/ にリダイレクトされる
■リライトとリダイレクトの組み合わせ例
まとめとして、以下のようなプログラムにすると
function rewrite_staff() {
add_rewrite_rule(
'^staff-list$',
'index.php?post_type=staff',
'top'
);
add_rewrite_rule(
'^staff-list/tokyo$',
'index.php?post_type=staff&tab1=kantou-area&tab2=tokyo',
'top'
);
add_rewrite_rule(
'^staff-list/kanagawa$',
'index.php?post_type=staff&tab1=kantou-area&tab2=kanagawa',
'top'
);
}
add_action( 'init', 'rewrite_staff' );
function redirect_staff() {
if ( is_archive( 'staff' ) && preg_match('/^\/staff\//', $_SERVER['REQUEST_URI'])) {
if (empty($_SERVER['QUERY_STRING'])) {
$query = '';
} else {
$query = '?' . $_SERVER['QUERY_STRING'];
}
wp_redirect( home_url( '/staff-list/' . $query ) );
}
}
add_filter( 'template_redirect', 'redirect_staff' );
・/staff-list/ にアクセスすると /staff/ の内容が表示される
・/staff-list/tokyo/ にアクセスすると /staff/?tab1=kantou-area&tab2=tokyo の内容が表示される
・/staff-list/kanagawa/ にアクセスすると /staff/?tab1=kantou-area&tab2=kanagawa の内容が表示される
・/staff/ にアクセスすると /staff-list/ にリダイレクトされる。クエリがあれば、それも含めてリダイレクトされる
となる
つまりSEO対策として
/staff/
/staff/?tab1=kantou-area&tab2=tokyo
/staff/?tab1=kantou-area&tab2=kanagawa
というURLを以下のように変更したことになる
/staff-list/
/staff-list/tokyo/
/staff-list/kanagawa/