定番ブログエンジンの「WordPress」では、管理画面の「設定」→「パーマリンク設定」で記事のURLの書式のカスタマイズが可能だ。記事IDだけのシンプルなURLや、記事のスラグ(識別名)を含む分かりやすいURLなど、好みの形式のURLで記事を公開できる。
しかし、パーマリンクを変更すると古い書式のURLではアクセスできなくなってしまうため、しばらく運営して多くの記事を公開済みのブログでは、なかなか書式の変更に踏み切れない。
旧URLをリンク切れにせずに記事URLの書式を変更したければ、テーマディレクトリの「functions.php」で「rewrite_rules_array」フィルタに関数を登録して、URL認識のルールを追加してやろう。
ただし、このままでは新URLのページと旧URLのページが別々に存在する状態になってしまう。旧URLのアクセスは新URLのページに転送されるようにしたければ、「template_redirect」にリダイレクト処理を行うアクションフック関数を登録しよう。
function oldstyle_permalink_rule($rules){ return(array('(\\d+)'=>'index.php?p=$matches[1]')+$rules); } add_filter('rewrite_rules_array', 'oldstyle_permalink_rule'); function oldstyle_permalink_redirect(){ if(is_single() && get_permalink()!=='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']){ wp_redirect(get_permalink(),301); die(); } } add_action('template_redirect','oldstyle_permalink_redirect');
古い書式の記事URLを新しい書式のURLに転送されるようにするには、テーマディレクトリの「functions.php」に上記のようなコードを追加すればいい。
一つ目のfunctionでは、古い書式のパーマリンクを記事検索クエリに変換するルールを追加している。「=>」の左側は記事URLにマッチする正規表現、右側は正規表現の括弧とクエリ変数の対応を記述する。記事IDは「p」、記事のスラグは「name」、年は「year」、月は「monthnum」、日は「day」のクエリ変数に割り当てればいいぞ。
2つ目のfunctionは、管理画面で設定した正式な書式のURL以外での単一記事ページへのアクセスを正式なURLに転送する処理だ。こちらは上記のままでどんなサイトでも使用できるぞ。
処理を記述したfunctions.phpをアップロードして、管理画面の「設定」→「パーマリンクの設定」で「変更を保存」ボタンを押すと、rewrite_rules_arrayフィルタで追加した書式のURLが認識されるようになる。