制作会社から制作会社じゃない会社に転職が決まりました。制作会社で学んだことを残らず記事にしたいと思います。

パンDKOTORI Blogの公式キャラクター「パンD」です。
コーディングWordPress便利コードカテゴリーページや固定ページ等でBasic認証を利用する[WordPress]

カテゴリーページや固定ページ等でBasic認証を利用する[WordPress]

カテゴリーページや固定ページ等でBasic認証を利用する[WordPress]記事のアイキャッチ画像

WordPressでページ毎にBasic認証を掛ける方法を紹介します。カテゴリーページ、固定ページ、カスタム投稿タイプページ、何でも来いです。

まえがき

WordPressで生成したページの一部にBasic認証を掛けたいという願望を持ったことは無いですか?
私は例えばクライアントに制作中のページを確認してもらいたい時とかに「このページだけBasic認証かけたいな」って思います。

WordPressの「パスワード保護」機能でもいいんですが、オリジナルのテーマだと設定が面倒だったりします。
でも.htaccessでBasic認証かけると、フォルダごと掛かっちゃってWordPressで生成するページ全部がBasic認証下になったりします。

そうじゃなくて個別にbasic認証掛けたいんじゃ~って時は、phpでBasic認証をかけてあげましょう
実際に「phpでBasic認証をかける」という記事は沢山出てきたのですが、ちゃんと実装できるまでにかなりの時間を要したので、みなさんが同じ轍を踏まぬようその辺も含めて共有します。

phpを使ってページ毎にBasic認証を掛ける

実装自体は超簡単です。順を追って説明します。

functions.phpにBasic認証を掛けるための関数を記述

phpでBasic認証を掛けるためのコードをfunctions.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の一番上で条件分岐を使いBasic認証を掛けたいページで関数を呼び出す

header.phpは基本的に全ページに読み込まれていると思うので、一番上で条件分岐を利用して先ほどfunctions.phpに記述したBasic認証の関数を呼び出します。
コードちゃんと書いたのに認証が通らないという方は「何回IDとパスを入力しても認証が通らない」を読んでみてください。

//header.phpの一番上
<?php
if(!is_home()): 
if(is_tax('kotoridialy','study')): 
$userArray = array("admin" => "password"
);
basic_auth($userArray); 
endif;
endif;

2行目のif文でBasic認証を掛けたいページを条件分岐してあげます。
3行目の「admin」及び「password」は、Basic認証のダイアログで入力する「ユーザー名」と「パスワード」です。適宜変更します。

また、「ユーザー名」と「パスワード」は配列になっているので自由に増やせます。

$userArray = array("admin" => "password",
"yamada" => "tarou",
"kotori" => "panda"
);

それでは条件分岐の部分、いくつか例を見ていきましょう。

カテゴリーページにベーシック認証を掛ける場合

if(!is_home()): 
if(is_category('2')) :  //Basic認証を掛けたいカテゴリID
$userArray = array("admin" => "password"
);
basic_auth($userArray); 
endif;
endif;

固定ページにベーシック認証を掛ける場合

if(!is_home()): 
if(is_page('2')): //Basic認証を掛けたいページID 
$userArray = array("admin" => "password"
);
basic_auth($userArray); 
endif;
endif;

カスタム投稿タイプのページにベーシック認証を掛ける場合

if(!is_home()): 
if(get_post_type() === 'kotoridiary'): //Basic認証を掛けたい投稿タイプ名 
$userArray = array("admin" => "password"
);
basic_auth($userArray); 
endif;
endif;

何回IDとパスを入力しても認証が通らない

ちゃんとコードを記述したはずなのに、何回やっても何回やってもユーザーIDとパスワードを聞かれるという場合、.htaccessに新たな記述をすることで解決します。
WordPressが吐き出す.htaccessを下記の様に編集してください。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*) #追加
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] #追加
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

ハイライトになっている3,4行目を追加します。

phpがセーフモード(CGI版)で動作しているとphpでのBasic認証が行えず、Basic認証が正常に通らないみたいです。
上記を.htaccessに追記してサクッと解決しましょう。

まとめ

phpがセーフモードで動いているのが盲点で、結構ハマりました。ぶっちゃけ諦めてWordPressのパスワード保護機能で無理やり限定公開したこともあります笑
忘れないように記事として置いておきます。

参考サイト様

WordPress内の特定カテゴリにBasic認証をかける
WordPressと携帯とPHPのBasic認証(セーフモード版も)

ありがとうございます。

シェアするみんなシェアしてね

フォローするフォローする

いつもKOTORI Blogをご覧いただきありがとうございます。Facebook、Twitterを通じて、皆様と交流していき色んな情報を共有していければな~と思ってます。お気軽に登録してください!

基本フォロー返します。

RSSを登録する

RSSはこちらから。

follow us in feedly

Feedly使ってる人はこちらから。

Buy me a Beer

動く!パンDのLINEスタンプ
好きな人にアプローチスタンプ
パンDのLINEスタンプ

関連する記事関連する記事も読んでみてね

コメント