MTでアーカイブマップング変更時、又はサイトリニューアル時のリダイレクト指定の裏技
公開日 : 2014-05-07 21:25:10
URLが変わらないのがもちろん一番なんですけどね。変わってしまうとき、URLのリダイレクト設定をしなければならないことがあります。
旅行ブログ、ノーマルブログの「ブログ記事」「ブログ記事一覧(カテゴリー)」のアーカイブマッピングを変更しました。
そのため、テーマを更新するとブログ記事ページとカテゴリーページのURLが変わります。旧URLから新URLへリダイレクトさせるテンプレートを用意しました。
プラグインを書いてダイナミックパブリッシングエラーテンプレートを利用する
.htaccessでリダイレクトする例が紹介されています。これはこれでいいのですが、.htaccessの場合、すべてのリクエストに対して処理が入るので、ちょっとでも負荷を減らしたいという時の裏技? として、ダイナミックパブリッシングエラーテンプレートを使う方法をご紹介します。
以下のファイルを用意します。
plugins/MyRedirect/php/function.mtmyredirect.php
ダイナミックパブリッシングエラーテンプレートの先頭に、以下のようにタグを記述します。
<mt:MyRedirect>
# <mt:MyRedirect>は存在しません、とか言われますが気にしなくていいです。
# スタティック用のタグがないだけで、ちゃんとこれで動作するので。
DynamicMTMLが有効なら、エラーページのURLを簡単に得る方法があるのですが、そうでなければ以下のようなテンプレートにして、エラーメッセージからパスを取得しても良いでしょう。
<mt:ErrorMessage setvar="error_message">
<mt:MyRedirect error="$error_message">
function.mtmyredirect.php の内容は以下のような感じです。
stash( 'bootstrapper' ); // DynamicMTMLが有効なら // $app->url; // $app->request; $error = $args[ 'error' ]; // DynamicMTML無効なとき、横着してパスを得る $url = preg_replace( "/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+).*$/", "$1", $error ); // リダイレクト処理 if ( $new_url ) { // パターンにマッチしたら header( 'Status: 301 Moved Permanently' ); header( 'Location: ' . $new_url ); exit(); } } ?>
データベースにアクセスしてリダイレクト対象かをチェックしてもいいですが、テンプレートで、CSVやJSONを吐いておいて、リダイレクトの対象かどうかを見るようなやり方がお勧めです。
.htaccessを用いる方法と比較すると、ページが見つからない時だけ処理されますので、全てのリクエストに処理が走る方法と比較すると負荷の面でお勧めです。但し、このPHPの処理自体が重い処理になってしまうと本末転倒ですので、必要に応じて使い分けてください。
また、リダイレクト先が存在しない場合、無限ループになったりしないよう、ページの存在チェックを入れることをお勧めします。