通常は.htaccessへ書くのが妥当なんでしょうが、いちいち.htaccess開いて編集するのが大変ですよね。
以下のコードは有効化しているテーマのfunctions.phpへ追記して、リダイレクトさせたいページの旧パーマリンクと新パーマリンクを列記すれば301リダイレクトされるようにするコードです。
これで大量のリダイレクトの記述が必要だったり、後々編集する場合にも便利になりますね。
function pwcn_301_redirects() {
// 古いパーマリンクと新しいパーマリンクのマッピングを配列で定義
// 新旧パーマリンク先頭の/はそのままにする
// コード例では末尾に/があるが、現在のパーマリンク構造を見てありなしの判断をすること
$redirects = array(
'/old-page-1/' => '/new-page-1/',//前者は古いパーマリンク、後者は新しいパーマリンク
'/old-page-2/' => '/new-page-2/',
'/old-page-3/' => '/new-page-3/',
);
// 現在のリクエストURIを取得
$request_uri = $_SERVER['REQUEST_URI'];
// リダイレクトが必要かチェック
if (array_key_exists($request_uri, $redirects)) {
// 新しいURLを取得
$new_url = home_url($redirects[$request_uri]);
// 301リダイレクトのためのHTTPレスポンスコードを設定
wp_redirect($new_url, 301);
exit();
}
}
add_action('template_redirect', 'pwcn_301_redirects');
上記コードの「’/old-page-1/’ => ‘/new-page-1/’」の部分を変更(または追加削除)していくと、旧パーマリンク宛にあったアクセスが新パーマリンクでアクセスされるようになります。
また、301リダイレクト(永久リダイレクト)として処理されますから、検索エンジンにもURLが変更となったことを明示できます。
補足 投稿IDから投稿名なら一括で変更させることもできるけど..
前述のコードの代わりに以下のコードを使うことで、投稿ID(%post_id%)をパーマリンクにしていたサイトを投稿名(%postname%)に変更した場合にすべての投稿をリダイレクトさせることもできますが、意図しない結果となることがあるので、面倒でも1件1件追加したほうが無難でしょう。
function pwcn_301_redirects() {
// 現在のリクエストURIを取得
$request_uri = $_SERVER['REQUEST_URI'];
// 投稿IDを取得
if (preg_match('/\/([0-9]+)\/?$/', $request_uri, $matches)) {
$post_id = intval($matches[1]);
// 投稿が存在するか確認
$post = get_post($post_id);
if ($post) {
// 新しいスラグを取得
$new_slug = $post->post_name;
// 新しいURLを生成
$new_url = home_url('/' . $new_slug);
// 301リダイレクトのためのHTTPレスポンスコードを設定
wp_redirect($new_url, 301);
exit();
}
}
}
// add_action('template_redirect', 'pwcn_301_redirects');
補足 別ファイルで管理したほうがいいかも..
今回のように.htaccessではなくfunctions.phpから301リダイレクトをかけるケースでは、たくさんの投稿のリダイレクトを行うことが多く、テーマのfunctions.phpへ直接コード追加するとコードが長くなって使いづらいかも知れません。
そんな時は別のphpファイルをテーマフォルダ内に追加して、functions.phpからはそのファイルの内容を実行するという形にした方がいいでしょう。
以下はテーマフォルダ内に「redirects」というphpファイルを追加した場合に有効化しているテーマのfunctions.phpへ追加するコードです。
include get_theme_file_path( '/redirects.php' );
コメントを残す