【簡易会員サイト向け】会員番号など特定多数のIDを持ったユーザーのみに閲覧制限をかける。

例えば何かのファンクラブで既に会員番号を発行してある場合、その会員にだけ閲覧出来るサイトを作る場面などあると思います。
そんな時に便利なやり方を紹介します。

【1】会員用ログイン用のユーザーIDとパスワードのセットを1つ作る

しくみとしては単純で、入力された会員番号と、ウェブサイトに登録してある会員リストを照合して、同じ番号があれば、予め用意したWordPressのユーザーIDとパスワードでログインするという形になります。

なので、まずはログイン用のユーザーID、パスワードを発行します。

ここでは

ユーザーID : member
パスワード : memberpass

としておきましょう。

【2】ユーザーのリストはpost_contentやoptionなどに , 区切りで登録しておく

会員リストを , 区切りで登録します。
とりあえず今回はログイン画面にするページを固定ページで作成し、その固定ページの本文欄に入力(登録)した場合で解説をすすめます。

【3】ログイン画面の固定ページ用テンプレートを用意する

固定ページ「ログイン」画面用のテンプレートファイルを page-login.php として用意します。

そこにまず

[sourcecode language="php"]
<form name="logincodeform" id="logincodeform" action="" method="get">
<input type="text" name="login_code" id="login_code" class="input" value="" size="20" />
<input type="submit" class="" value="ログイン" />
</form>
[/sourcecode]

というフォームを記述します。
そうすると、内容を入力されてログインボタンを押されると、同じページのURLに

?login_code=入力された内容

というパラメータが付いた同じページが表示されます。これを受け取って、登録されているリストを比較して、同じだったらWordPressのwp-login.phpに予め用意したユーザーIDとパスワードを投げます。

page-login.phpは以下のような感じ。

[sourcecode language="php"]
<?php
/*
※もっとスマートな実装方法があれば教えてください。

【1】 閲覧ユーザー用のIDを1つ発行
予め
ID : member
パスワード : memberpass
のユーザーを購読者権限で発行
【2】 ユーザーのリストはpost_contentやoptionなどに , 区切りで登録しておく
【3】 テキストを入力させてgetに投げてページを再読み込み
【4】 ログインコードリストを配列に格納
【5】 入力されたコードがログインコードリストにあった場合は
予め用意したログインIDとパスワードで自動的にログイン
*/
?>
<form name="logincodeform" id="logincodeform" action="" method="get">
<input type="text" name="login_code" id="login_code" class="input" value="" size="20" />
<input type="submit" class="" value="認証" />
</form>

<?php
// パラメターからcodeを取得
if(isset($_GET['login_code'])) {
$login_code = $_GET['login_code'];

// ログイン判定用の変数を設定
$loginCodeJudge = '';

// オプションで作成したフィールドにログインコードを保存した場合
// $optionsArry = get_option( 'login_code_options' );
// $optionsArry = $optionsArry['login_code_arry'];

// 記事本文欄にログインコードを保存する場合
if ( have_posts() ) while ( have_posts() ) : the_post();
$optionsArry = $post->post_content;
endwhile;

// 文字列を配列にして$loginIDsに格納
$loginIDs = explode(",", $optionsArry);
foreach ($loginIDs as $key => $value) {
// 入力された値がログインIDリストの中にあった場合
if ($login_code == $value) { ?>

<form name="loginform" id="loginform" action="<?php echo site_url(); ?>/wp-login.php" method="post">
<input type="hidden" name="log" id="user_login" class="input" value="member" size="20" />
<input type="hidden" name="pwd" id="user_pass" class="input" value="memberpass" size="20" />
<input type="hidden" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="ログイン" />
<input type="hidden" name="redirect_to" value="ログインしたらリダイレクトさせるURL" />
<SCRIPT language="JavaScript">document.loginform.submit();</SCRIPT>
</form>

<?php } else {
// 違っていたらログイン判定用の変数に"miss"を代入
$loginCodeJudge = "miss";
} // if ($login_code == $value)
} // foreach
if ($loginCodeJudge = "miss")
echo '<p class="alert">ログインコードが違います</p>';
} ?>
[/sourcecode]

あとはログインしていない場合はログイン画面にリダイレクトするように、functions.phpに書いておく。

[sourcecode language="php"]
/*-------------------------------------------*/
/* 表示をログインユーザーに限定する
/*-------------------------------------------*/
function require_login() {
/*
条件分岐でURLが一致するページだけはログインしなくても閲覧可能に(リダイレクトしない)。
一般向けのログイン画面が /login/ なので /login も除外
再読み込みの際には /login?login_code=**** となるので、
/login以降の文字列があるページはログインページにリダイレクトしないように /login/* とする
*/
if ( ! is_user_logged_in()
&& ! preg_match( '/^(wp-login\.php|async-upload\.php)|wp-login|login.*/', basename( $_SERVER['REQUEST_URI'] ) )
&& ! ( defined( 'DOING_AJAX' )
&& DOING_AJAX )
&& ! ( defined( 'DOING_CRON' )
&& DOING_CRON ) ) {
// ログインしてなくて、ログイン画面以外のページを見ようとしたら以下のURLにリダイレクトする
$redirectUrl = site_url().'/login/';
$LocationRedirectUrl = 'Location: '.$redirectUrl;
header($LocationRedirectUrl);
exit;
}
}
add_action( 'init', 'require_login' );
[/sourcecode]

※まがりんさんのブログで紹介されてたソースを改造
http://www.warna.info/archives/827/

Follow me!

投稿者プロフィール

kurudrive
名古屋のウェブ制作会社数社に10年程度務めた後、株式会社ベクトル設立。
企画・運営・コンサルティング〜WordPressを中心としたシステム開発まで幅広く携わる。
[ 著書 ]
・いちばんやさしいWordPressの教本(共著)
・現場でかならず使われているWordPressデザインのメソッド(共著)
[ 最近のWordPressコミュニティでの活動 ]
2018 WordCampOsaka セッションスピーカー
2017 WordCampKyoto セッションスピーカー
2016 WordCampTokyo LT
2016 WordCampKansai ハンズオン世話役
2015 WordCampTokyo セッションスピーカー
2015 WordCampKansai セッションスピーカー
2014 WordFesNagoya 実行委員 & セッションスピーカー
2013 WordCampTokyo セッションスピーカー(パネラー)
2013 WordFesNagoya 実行委員 & セッションスピーカー
2013 WordCrabFukui セッションスピーカー

シンプルでカスタマイズしやすいWordPressテーマ

Lightningは twitter Bootstrap ベースのシンプルでカスタマイズしやすいWordPressテーマです。
プラグイン VK All in One Expansion Unit とセットで使う事でビジネスサイトにもブログにも活用できます。