WordPressで「管理画面だけ残して」それ以外をリダイレクトする方法(閉鎖・告知ページ誘導に便利)

サイト運営をしていると、こんな状況が発生することがあります。

  • サイトを閉鎖する(または一時停止する)
  • メンテナンス中で通常ページを見せたくない
  • 全ページを「お知らせ」や「移転案内」へ誘導したい
  • ただし 管理画面(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

という選び方がわかりやすいです。