投稿・固定ページにリダイレクト機能を設置するWordPressカスタマイズ方法

WordPressサイトを運営していて、たまにこんなことがあります。

この投稿の内容はもう古いので、別の効果的なページにリダイレクトで跳ばしたい。

この機能を、コピペ一発で実装できるコードを書きました。

以下のように投稿・固定ページ管理画面から「リダイレクトURL」を設定するだけで目的のページへ跳ばせる仕様です。

リダイレクトカスタマイズ例

このように「管理者側から手軽にリダイレクト変更できる仕様」の利点は、

やっぱやめた戻そう。

となった時にでも、「リダイレクトURL」入力欄を空欄に戻せば、手軽に元に戻せることです。

以下では、このカスタマイズ方法を紹介します。

スポンサーリンク
レクタングル(大)広告

投稿・固定ページリダイレクトカスタマイズ

投稿・固定ページに入ってきた流入を、対象URLにリダイレクトするカスタマイズはこちら。子テーマのfunctions.phpにコピペで追記することで実装できます。

///////////////////////////////////////
// カスタムボックスの追加
///////////////////////////////////////
add_action('admin_menu', 'add_redirect_custom_box');
if ( !function_exists( 'add_redirect_custom_box' ) ):
function add_redirect_custom_box(){

  //リダイレクト
  add_meta_box( 'singular_redirect_settings', 'リダイレクト', 'redirect_custom_box_view', 'post', 'side' );
  add_meta_box( 'singular_redirect_settings', 'リダイレクト', 'redirect_custom_box_view', 'page', 'side' );
}
endif;

///////////////////////////////////////
// リダイレクト
///////////////////////////////////////
if ( !function_exists( 'redirect_custom_box_view' ) ):
function redirect_custom_box_view(){
  $redirect_url = get_post_meta(get_the_ID(),'redirect_url', true);

  echo '<label for="redirect_url">リダイレクトURL</label>';
  echo '<input type="text" name="redirect_url" size="20" value="'.esc_attr(stripslashes_deep(strip_tags($redirect_url))).'" placeholder="https://" style="width: 100%;">';
  echo '<p class="howto">このページに訪れるユーザーを設定したURLに301リダイレクトします。</p>';
}
endif;

add_action('save_post', 'redirect_custom_box_save_data');
if ( !function_exists( 'redirect_custom_box_save_data' ) ):
function redirect_custom_box_save_data(){
  $id = get_the_ID();
  //リダイレクトURL
  if ( isset( $_POST['redirect_url'] ) ){
    $redirect_url = $_POST['redirect_url'];
    $redirect_url_key = 'redirect_url';
    add_post_meta($id, $redirect_url_key, $redirect_url, true);
    update_post_meta($id, $redirect_url_key, $redirect_url);
  }
}
endif;

//リダイレクトURLの取得
if ( !function_exists( 'get_singular_redirect_url' ) ):
function get_singular_redirect_url(){
  return trim(get_post_meta(get_the_ID(), 'redirect_url', true));
}
endif;

//リダイレクト処理
if ( !function_exists( 'redirect_to_url' ) ):
function redirect_to_url($url){
  header( "HTTP/1.1 301 Moved Permanently" );
  header( "location: " . $url  );
  exit;
}
endif;

//URLの正規表現
define('URL_REG_STR', '(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)');
define('URL_REG', '/'.URL_REG_STR.'/');

//リダイレクト
add_action( 'wp','wp_singular_page_redirect', 0 );
if ( !function_exists( 'wp_singular_page_redirect' ) ):
function wp_singular_page_redirect() {
  //リダイレクト
  if (is_singular() && $redirect_url = get_singular_redirect_url()) {
    //URL形式にマッチする場合
    if (preg_match(URL_REG, $redirect_url)) {
      redirect_to_url($redirect_url);
    }
  }
}
endif;

このカスタマイズは、「投稿・固定ページに入ってきた訪問者」に対してだけ、リダイレクトする仕様です。

カテゴリーページや、アーカイブページへの利用はできませんのでご了承ください。

動作確認

上記のPHPコードを子テーマのfunctions.phpに貼り付けて、「投稿管理画面」を開くと、サイドに「リダイレクト」ボックスが表示されます。

リダイレクトボックスが表示された投稿管理画面

あとは「リダイレクトURL」テキストボックスに対して、リダイレクト先のURLを入力すればOKです。

リダイレクト先のURLを入力する

あとは、対象ページに流入があった場合に「リダイレクトURL」に入力されたURLに対して、301リダイレクトされます。

まとめ

とりあえず「リダイレクトが設定できるカスタマイズがしたい」という場合であれば、コピペ一発でできるので、比較的簡単にできるかと思います。

なので「もう情報が古くなってしまってあまり意味を成さないページ」があるのであれば、「関連性があって効果的なページ」にアクセスを流入させるというのもありかと思います。

うまくいかない場合は、コピペした箇所を元に戻す(削除する)だけです。

でも一応、functions.phpを編集する前は、ファイルのバックアップをしておいてください。

『投稿・固定ページにリダイレクト機能を設置するWordPressカスタマイズ方法』へのコメント

  1. 名前:shirono 投稿日:2019/09/09(月) 09:20:21 ID:4f26f30bc

    素晴らしいコードをありがとうございました!
    まさにこれを探していました。

  2. Avatar photo 名前:わいひら 投稿日:2019/09/09(月) 22:14:51 ID:9b89e1086

    お役に立てたようであれば良かったです^^

  3. 名前:橋本 歳司 投稿日:2020/03/18(水) 14:52:21 ID:8dff75ee1

    コードを使わせていただき助かっております。
    ちなみにリダイレクト時にブランクページに飛ばすことは可能でしょうか??

  4. Avatar photo 名前:わいひら 投稿日:2020/03/20(金) 22:23:03 ID:056ff698c

    「ブランクページ」というのは、いろいろな意味にとれるので言葉としてちょっと曖昧なように思います。
    橋本さんが想定されている「ブランクページ」というのはどういったものでしょうか。
    「ブランクページ」というのがどういったないようにもよるかと思います。

  5. 名前:橋本 歳司 投稿日:2020/04/01(水) 13:05:19 ID:303a000e4

    すみません、説明不足で。
    a href=”#” rel=”nofollow ugc”
    という意味です。
    何卒よろしくお願い申し上げます。

  6. 名前:橋本 歳司 投稿日:2020/04/01(水) 13:06:00 ID:303a000e4

    再送します。
    target=”_blank”
    ということです。
    何卒よろしくお願い申し上げます。

  7. Avatar photo 名前:わいひら 投稿日:2020/04/06(月) 23:01:49 ID:5379feef4

    リダイレクトで開くときに、新しいタブで開くということでしょうか?
    それはちょっと無理なんじゃないかと思います。

  8. 名前:大堀 僚介 投稿日:2020/10/06(火) 20:42:14 ID:5d0f4657c

    わいひらさん

    突然のメッセージ失礼いたします。先日まで、私のサイトでわいひらさんのリダイレクトコードを使わせてもらっていました。とても重宝していてありがたく使わせてもらっていたのですが、サイトの多言語化のためにGTranslateというプラグインを入れたところ、このコードとの相性が悪いと言われてしまったので泣く泣くコードを削除しました。

    もしかしたら同じような経験をされている方がいらっしゃるかも…と思い、私の体験談をシェアしたいと思います。読者の方のご参考になれば幸いです。

    今後もためになる情報を楽しみにしております。ありがとうございました!

  9. Avatar photo 名前:わいひら 投稿日:2020/12/27(日) 17:46:42 ID:2623db2e1

    プラグインの場合は相性問題でそういうこともあると思います。
    URLとかが変わるプラグインとかだと厳しいかもしれません。
    教えていただきありがとうございます!

  10. 名前:mizu 投稿日:2022/07/04(月) 20:58:39 ID:2c696b52c

    管理画面の投稿や固定ページで項目は表示されたのですが項目名や追加された部分の文字が文字化けしてしまいますWordPress 6.0になりますが何か仕様が変わってしまっているのでしょうか

  11. Avatar photo 名前:わいひら 投稿日:2022/07/05(火) 22:28:02 ID:cfac6be14

    症状が「文字化け」だけですと、どういう状態かが分からず申し訳ないですがたしかなことはわかりません。
    なので推測ですが、エディターとかで編集したのであれば文字コードがUTF-8になっていないとかの可能性はあるのかもしれません。