特定ディレクトリでBasic認証を使う場合

WPは既存のディレクトリがある場合、そちらを優先して参照するため、既存のディレクトリにBasic認証を使用する場合、少し工夫が必要になる。

  1. /hoge/ ディレクトリを作成
  2. /hoge/ ディレクトリに wp 直下の index.php をコピーする
  3. コピーした index.php で読み込んでいる「wp-blog-header.php」のパスを修正する
  4. /hoge/ に .htaccessを設置しBasic認証をかける
  5. リダイレクトループが発生した場合は下記で解除する
remove_filter('template_redirect', 'redirect_canonical');

Basic認証がかかったページを wp_remote_get() で取得する場合

/* 参考 https://memo.dogmap.jp/tag/basic-%E8%AA%8D%E8%A8%BC/ */

$user = 'user';
$password = 'password';
$url = 'https://hoge.com';

$args = array(
  'headers' => array(
    'Authorization' => 'Basic '.base64_encode("$user:$password")
  )
);
$result = wp_remote_get($url, $args);

ユーザー認証をBasic認証に利用する

/* 参考 https://memo.dogmap.jp/tag/basic-%E8%AA%8D%E8%A8%BC/ */

<?php
function basic_auth(){
    nocache_headers(); // キャッシュを削除
    if ( is_user_logged_in() )
        return;

    // WordPress のユーザー認証で BASIC 認証ユーザー/パスワードをチェック
    $user = isset($_SERVER["PHP_AUTH_USER"]) ? $_SERVER["PHP_AUTH_USER"] : '';
    $pwd  = isset($_SERVER["PHP_AUTH_PW"]) ? $_SERVER["PHP_AUTH_PW"] : '';
    if ( !is_wp_error(wp_authenticate($user, $pwd)) ) {
        return;
    }

    // BASIC 認証が必要
    header('WWW-Authenticate: Basic realm="Please Enter Your Password"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Authorization Required';
    die();
}
add_action('template_redirect', 'basic_auth');