WordPressで次のような処理が必要でした
- 投稿ページを個別にリダイレクト
- ある規則に沿ってページリダイレクト
- ただしプラグインは使いたくない
本当はプラグインを入れるのが確実だけど、どうしてもプラグインなしでリダイレクト(Redirect)したい場面があります。(PHPコードでどうにかしたい)
そんなマニアックな悩みへの解決策です。
ただし自己責任で行ってください。
目次
個別ページごとにリダイレクトする方法
例えばこんなケースを考えてみましょう。
↓ リダイレクトさせたいWP投稿ページURL
https://example.com/hoge/post-1234
↓ これを次のURLにリダイレクトさせたい
https://example.com/hoge/jikosyoukai
後から投稿URLを変えたいパターンです。
WordPress投稿画面では記事作成すると post-1234 みたいなスラッグが自動生成され、それに気づかないで記事投稿することがあります。そんな時に個別URLだけリダイレクトさせたいみたいな…
※ より正確に書くなら 自動生成されたスラッグで公開 ⇒ Googleにインデックスされる ⇒ 検索流入でアクセスがある ← こういうスラッグを手動変更できない状況を想定
そんな時は次の手順でリダイレクト可能です。
1.使用してるテーマのfunctions.phpを開く
ここではPHPコードで何とかします。
だから初めにテーマのfunctions.phpを開きましょう。
↓ 外観 -> テーマファイルエディター を開く
↓ 右のファイル一覧から function.php オープン
ただし親テーマを直接編集するのは良くありません。
念のために子テーマを作っておいてください。
▼ プラグインによるWP子テーマの作り方
なくてもいいけど親テーマを更新したら親テーマへの変更はすべて消えちゃいます。それを防ぐために子テーマという仕組みがあるんですね。
とりあえずfunctions.phpを開ければヨシ
2.リダイレクト用のPHPコードを追加する
ここでは次のリダイレクトをします。
- リダイレク元ページURL
https://example.com/hoge/post-1234
- リダイレクト先ページURL
https://example.com/hoge/jikosyoukai
その場合はfunctions.phpにこんなコードを追加します。
↓ 個別にリダイレクトさせるコード例
function redirect_page() {
if (isset($_SERVER['HTTPS']) &&
($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'
) {
$protocol = 'https://';
}else {
$protocol = 'http://';
}
$currenturl = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$request_uri = $_SERVER['REQUEST_URI'];
switch ($request_uri) {
case '/hoge/post-1234':
$urlto = home_url('/hoge/jikosyoukai');
break;
default:
return;
}
if ($currenturl != $urlto)
exit( wp_redirect( $urlto ) );
}
add_action( 'template_redirect', 'redirect_page' );
何してるかは大まかに分かりますよね?
分からないなら手を出さないでください。
リダイレクトを正規表現的に行うPHPコード例
ここからはさらに応用的な話です。
もっと汎用的なリダイレクト処理をしてみます。
例えば次のリダイレクトルールを考えます。
- リダイレクト前 : 投稿日時が含まれるURL
https://example.com/2022/11/19/my-post
- リダイレクト後 : 日時を含まないURL
https://example.com//my-post
初めはスラッグ規則を「投稿日時+投稿名」にしていたけど、あとからパーマリンク設定を変えて「投稿名」だけにしたケースです。
その場合、汎用的なリダイレクトで対処可能です。
↓ より汎用的なリダイレクトPHPコード例
function redirect_page() {
if (isset($_SERVER['HTTPS']) &&
($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'
) {
$protocol = 'https://';
} else {
$protocol = 'http://';
}
$currenturl = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$request_uri = $_SERVER['REQUEST_URI']; //wp_make_link_relative($currenturl);
$redirect_pattern_1 = '/[0-9]{2}\\/[0-9]{2}\\/[0-9]{2}/i';
if(preg_match($redirect_pattern_1, $request_uri) !== 0){
$urlto = home_url(preg_replace($redirect_pattern_1, '', $request_uri));
}else{
return;
}
if ($currenturl != $urlto)
exit( wp_redirect( $urlto ) );
}
add_action( 'template_redirect', 'redirect_page' );
かなり分かりにくいですね…
本当に原始的にリダイレクトルールを定義してます。
普通にリダイレクトプラグイン使うのが確実
身もふたもないけど次の結論に至りました。
《《 普通にプラグイン使う方が楽 》》
だって自分でPHPコードを書いてしまうと、
- リダイレクトの度にコード追加が必要
- WordPress構成を破壊するリスクがある
- 不具合が出たらすべて自己責任になる
ここまでリスクを取る価値はあるのか…
リダイレクト規則が1つか2つなら問題ないかも
でも複数のリダイレクトルールが必要なら、
大人しくプラグインを使うのが賢いと思います。
▼ この記事のRedirectionプラグインが優秀!
プラグインを使うのが確実ですね。
フク郎
最新記事 by フク郎 (全て見る)
- トレンドブログが資産に?放置でアクセス急増の事例 - 3月 14, 2024