サイト運営をしていると、こんな状況が発生することがあります。
- サイトを閉鎖する(または一時停止する)
- メンテナンス中で通常ページを見せたくない
- 全ページを「お知らせ」や「移転案内」へ誘導したい
- ただし 管理画面(WordPressのダッシュボード)だけは使えるように残したい
このようなケースで便利なのが、
✅ 「WordPressの管理画面以外は特定ページへリダイレクトする」設定です。
この記事では、実案件のURLなどは出さずに、サンプルURL(example.com)を使って、仕組みと実装方法をわかりやすく解説します。
「管理画面以外リダイレクト」の仕組みとは?
✅ 目的
Webサイトにアクセスがあった際に、以下のような挙動にします。
- 管理画面(/wp-admin/)やログイン画面(/wp-login.php)はリダイレクトしない
- それ以外のページ(トップ・固定ページ・投稿・カテゴリ等)は指定したURLへ転送する
例)
| アクセス先 | 挙動 |
|---|---|
| https://example.com/ | → お知らせページへ転送 |
| https://example.com/service/ | → お知らせページへ転送 |
| https://example.com/wp-admin/ | 転送しない(管理画面へアクセス可能) |
| https://example.com/wp-login.php | 転送しない(ログイン可能) |
こういう時に役立つ(導入シーン)
この機能は以下のような状況で非常に効果を発揮します。
サイト閉鎖・移転のお知らせ
サイトをそのまま放置すると、ユーザーは混乱します。
全ページを「閉鎖のお知らせ」へ統一することで迷子を防げます。
一時停止(工事中)
制作途中、デザイン刷新中などで「見られたくない」場合に便利です。
セキュリティ面の簡易対応
サイト公開を止めたいけど、管理者はWordPressに入りたい…
という要望を叶えられます。
実装方法は2種類(おすすめあり)
このリダイレクトは主に2つの方法で実現できます。
方法A:functions.phpで実装(おすすめ)
WordPressのテンプレート側(テーマ)で制御する方法です。
カスタマイズとして最も扱いやすく、動作の調整もしやすいです。
特徴
- WordPressの仕組みに沿って実装できる
- 「管理者だけ除外」など柔軟な制御が可能
- コードを残しておけば復旧もしやすい
サンプルコード(URLは sample)
/**
* 管理画面以外を特定URLへリダイレクトする
*/
add_action('template_redirect', function () {
// 管理画面やログイン画面は除外
if (is_admin()) return;
if (strpos($_SERVER['REQUEST_URI'], 'wp-login.php') !== false) return;
if (strpos($_SERVER['REQUEST_URI'], 'wp-admin') !== false) return;
// WordPress内部処理も除外(必要な例外)
if (defined('DOING_AJAX') && DOING_AJAX) return;
if (defined('REST_REQUEST') && REST_REQUEST) return;
if (defined('DOING_CRON') && DOING_CRON) return;
// 転送先(お知らせページなど)
$redirect_url = 'https://example.com/news/notice/';
// 無限ループ防止(すでに転送先なら何もしない)
$current_url = home_url(add_query_arg([], $GLOBALS['wp']->request));
if (untrailingslashit($current_url) === untrailingslashit($redirect_url)) return;
// リダイレクト実行
wp_redirect($redirect_url, 301);
exit;
});
方法B:.htaccessで実装(サーバー側)
Apacheサーバーの .htaccess で制御する方法です。
WordPressより先に処理されるので強力かつ高速です。
特徴
- WordPressが動く前に転送できる(高速)
- ただし設定ミスするとサイトに入れなくなる可能性あり
- 仕様変更が少し難しい
サンプル設定(URLは sample)
RewriteEngine On
# 管理画面は除外
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{REQUEST_URI} !^/wp-login\.php [NC]
RewriteCond %{REQUEST_URI} !^/wp-json [NC]
RewriteCond %{REQUEST_URI} !^/wp-cron\.php [NC]
# 転送先自身は除外(無限ループ防止)
RewriteCond %{REQUEST_URI} !^/news/notice/?$ [NC]
RewriteRule ^(.*)$ https://example.com/news/notice/ [R=301,L]
「除外すべきページ」について
管理画面だけ除外するのではなく、以下も除外しておかないと不具合の原因になります。
wp-json(REST API)admin-ajax.php(Ajax処理)wp-cron.php(Cron)
これらがリダイレクトされると、
- プラグインの動作不良
- 管理画面での保存エラー
- 表示崩れ
- API連携の停止
などが起きる可能性があります。
そのため、上記コードでは「内部処理系」を除外しています。
リダイレクト設定の注意点(かなり重要)
無限ループ防止が必要
「転送先ページまで転送される」状態だと無限ループになります。
→ なので 転送先ページ自身は除外する条件が必須です。
301 / 302 の使い分け
- 301:恒久的(閉鎖・移転向け)
- 302:一時的(メンテ中向け)
Googleの評価やインデックスにも影響するため、意図に合わせて選びましょう。
まとめ:閉鎖・メンテナンス時に最強の設定
WordPressサイトを「お知らせページだけ表示」にしつつ、
管理画面は触れる状態にしたい場合、
管理画面以外をリダイレクトする設定が非常に便利です。
- 短期間のメンテ → 302
- 閉鎖/統合 → 301
そして実装は、
- 迷ったら functions.phpで実装がおすすめ
- より強制力を求めるなら .htaccess
という選び方がわかりやすいです。

