2023.09.07

|

2025.04.11

WordPressサイト全体にBasic認証(ユーザー名(ID)とパスワードで制限)をかけてみる

バックアップサイト、開発中のテスト環境、または限定公開したい会員向けページなど、「WordPressのログイン機能を使うほどじゃないけど、外部からはアクセスさせたくない」

そんなときに便利なのが Basic認証 です。

今回は、.htaccess を使わずに、functions.phpに書くコードだけでサイト全体にBasic認証をかける方法を紹介します!

そもそもBasic認証って?

画像のように、サイトにアクセスしたときに、ブラウザのポップアップでユーザー名とパスワードを聞いてくる、あの仕組みです。

サーバーレベルでかけることも多いですが、WordPressのコードで制御することも可能です。

こんなときに便利
  • テスト環境やバックアップサイトを一時的に非公開にしたい
  • 特定の人にのみ見せたい情報を置いておきたい
  • WordPressのユーザー登録や管理までは必要ない(そこまで大げさではない)

コードを実装してみる

functions.php もしくは「Code Snippets」などのプラグインに、以下のコードを追加します

function custom_login_protection() {
    if (!is_user_logged_in()) { // WordPressログイン済みなら除外
        $username = '【ユーザー名】'; // ← ここに任意のユーザー名を入力
        $password = '【パスワード】'; // ← ここに任意のパスワードを入力

        if (
            !isset($_SERVER['PHP_AUTH_USER']) ||
            !isset($_SERVER['PHP_AUTH_PW']) ||
            $_SERVER['PHP_AUTH_USER'] !== $username ||
            $_SERVER['PHP_AUTH_PW'] !== $password
        ) {
            header('WWW-Authenticate: Basic realm="Restricted Area"');
            header('HTTP/1.0 401 Unauthorized');
            echo 'このサイトを見るには認証が必要です。';
            exit;
        }
    }
}
add_action('template_redirect', 'custom_login_protection');

 

上記のコードの

【ユーザー名】【パスワード】 の部分には、任意の英数字の文字列を入力してください。

例)

$username = 'user';

$password = 'abc123';

ポイント

  • is_user_logged_in() を使っているので、WordPressにログイン済みの場合には認証を求めません。
  • ユーザー名とパスワードは、適宜変更して使用してください。
  • template_redirect フックを使っているので、すべてのフロントエンドページに適用されます。
  • 管理画面(/wp-admin/)やAPIには影響ありません。

.htaccess との違い・使い分け

方法 特徴 向いてるケース
.htaccess サーバー側で直接制御、ログイン中でも必須 HTMLなどWP以外のファイルも守りたいとき
functions.php WPが動いているときだけ有効、WPログイン中は回避 テスト環境・確認用など柔らかく守りたいとき

「パスワードを共有して一時的に見せたい」ならfunctions.php(スニペットでの入れ込み)が手軽でおすすめです。

まとめ

  • パスワードは公開されてもいい前提で使いましょう(超機密性の高い内容には向きません)
  • サイトにログインしてる人には表示されないため、用途に応じて is_user_logged_in() を外してもOK

 

  • 公開はちょっと困るけど、ユーザー登録まではしなくていい
  • 簡易的なメンバー専用ページなどをつくりたい
  • サイト全体に簡易的なパスワードを設置したい

そんな時に使えるのが、このBasic認証です。

また、必要な時に簡単に追加して、必要性がなくなった際には、サッと外せるのが便利です。
WordPressサイトのゆるめの非公開対応として、使ってみてください。