質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

WordPressの特定のカスタム投稿タイプにBasic認証を実装したい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 232

3omi0

score 29

実現したいこと

WordPressの特定のカスタム投稿タイプのアーカイブページ、シングルページにBasic認証を実装したいと考えております。
検索して見つけた下記の方法では実現できませんでした。
ご教示いただけると幸いです。

前提

・カスタム投稿タイプ:works
・シングルページパーマリンク:sample.com/worsk/{{数字}}
・WordPressはsample.com/wpにインストールして、サイトアドレスをsample.comに変更しています。

試したこと

①function.phpでBasic認証のための関数を定義
①-1 関数を定義
//function.phpに記述
function basic_auth($auth_list,$realm="Restricted Area",$failed_text="認証に失敗しました"){ 
    if (isset($_SERVER['PHP_AUTH_USER']) and isset($auth_list[$_SERVER['PHP_AUTH_USER']])){
        if ($auth_list[$_SERVER['PHP_AUTH_USER']] == $_SERVER['PHP_AUTH_PW']){
            return $_SERVER['PHP_AUTH_USER'];
        }
    }

    header('WWW-Authenticate: Basic realm="'.$realm.'"');
    header('HTTP/1.0 401 Unauthorized');
    header('Content-type: text/html; charset='.mb_internal_encoding());

    die($failed_text);
}
//header.phpの一番上に記述
<?php
if(is_post_type_archive("works") || is_singular("works")):
    $userArray = array(
        "user" => "pass"
    );
    basic_auth($userArray);
endif;
?>

⇒結果:ローカル環境では成功したが、本番環境ではBasic認証が通らなかった。

参考サイト様
プラグインなしで特定カテゴリーにベーシック認証を【WordPress】

①-2 .htaccessに記述

確認したところサーバーのPHPバージョンが標準でfastCGIが設定されているため、正常に動作しなかったためと推測。
sample.com/.htaccessに下記を追加。

#sample.com/.htaccessに2行追加
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*) #追加
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] #追加
RewriteBase /wp/
…

⇒結果:変わらず、Basic認証通らない。

参考サイト様
プラグインなしで特定カテゴリーにベーシック認証を【WordPress】

①-3 PHP_AUTH_USERとPHP_AUTH_PWを変更

fastCGIでは$_SERVER['PHP_AUTH_USER']と$_SERVER['PHP_AUTH_PW']が使えないそうなので、下記のように変更。

#sample.com/.htaccessに追加した2行を変更
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*) #変更
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] #変更
//phpに追加
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));

phpに追加した1行は、参考サイト様には追加位置が記載されていなかったので、下記の3通りを試行。
・header.phpの最上部
・function.phpの最上部
・function.phpで作成した関数basic_auth内の一番上

⇒結果:変わらず、Basic認証通らない。

参考サイト様
PHP as cgi/fastCGI でPHP_AUTH_USER が使えないので対処方法

⇒⇒上記以外の復帰方法が見つからなかったので、PHP関数の案は断念。

②ルート直下にフォルダを作成し、.htaccessでBasic認証をかける
②-1 「works」のフォルダを作成

sample.com/worksのフォルダを作成し、index.php、.htaccess、.htpasswdを設置。

//sample.com/works/index.phpに記述
define( 'WP_USE_THEMES', true );
require( '/{{絶対パス}}/wp/wp-blog-header.php' );
//sample.com/works/.htaccessに記述
define( 'WP_USE_THEMES', true );
AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /{{絶対パス}}/works/.htpasswd
require valid-user
//sample.com/works/.htpasswdに記述
user:(暗号化したpassword)

参考サイト様
プラグインなしで特定カテゴリーにベーシック認証を【WordPress】

⇒結果:sample.com/worksでリダイレクトループが発生。

②-2 リダイレクトループ回避の記述

function.phpの最下部に下記を記述

//function.phpに記述
remove_filter('template_redirect', 'redirect_canonical');

参考サイト様
WordPressのカテゴリ単位・フォルダ単位でBasic認証を設定する方法

⇒sample.com/worksを叩くと、狙った通りBasic認証を求められ、設定したアイパスで無事通過。
しかし、シングルページ(sample.com/works/000)に入ろうとすると、再びBasic認証を求められ、設定したアイパスでは通過できなかった。

⇒⇒上記以外の復帰方法が見つからなかったので、フォルダの案も断念。

以上が試した方法になります。

ここまでお読みいただきありがとうございました。
アドバイス等ありましたら、ご教示いただけますと幸いです。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る