プラグインを使わず会員制のサイト(ページ)を作る方法

会員限定の情報ページやクーポン発行など一般の人には見せたくないページなど用途によって閲覧制限を設けたい場合は次の処置を施します

サイト全体に閲覧制限を設定する方法

ログインしないとサイトそのものが見れない仕様にしたい場合は以下のコードをfunction.phpに記述する

function require_login() {
    if ( ! is_user_logged_in() && ! preg_match( '/^(wp-login\.php|async-upload\.php)/', basename( $_SERVER['REQUEST_URI'] ) ) && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX )  && ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
        auth_redirect();
    }
}
add_action( 'init', 'require_login' );

ログインの有無によって表示を変える

ページの一部分をログインしている人としていない人に違うコンテンツを表示したい場合は任意の場所に下のコードを使用。

<?php if(is_user_logged_in() == TRUE){?>
	//ここにログイン時のコンテンツを入れる
<?php }else{?>
	//ここにログインしていない時のコンテンツを入れる
<?php }?>

特定のユーザー(ID)によって表示を変える

何らかの限定ページなど特定のユーザーにだけ表示させたい場合は任意の場所に次のコードを使用

<?php if($current_user->ID == "1"){?>
	//ID『1』のユーザーがログインしている時にだけ表示
<?php }else if(is_user_logged_in() == TRIE){?>
	//それ以外のユーザーがログインしている場合に表示
<?php }else{?>
	//ログインしていない時に表示</p>
<?php }?>

single.phpなどでmoreタグ以降の内容を制限する方法

会員の人は全文読めて、非会員者は記事の冒頭だけを見せる仕様にするにはsingle.php内にある<?php the_content(); ?>部分を以下に書き換える

<?php if (is_user_logged_in()) { ?>
	<?php the_content(); ?>
<?php } else { ?>
	<?php global $more; $more = false; ?>
	<?php the_content('',FALSE,''); ?>
	<p>全てのコンテンツを表示するにはログインが必要です</p>
	<div>
		<p>ログイン</p>
		<form method="post" action="<?php echo wp_login_url() ?>?redirect_to=<?php echo esc_attr($_SERVER['REQUEST_URI']) ?>">
			<p><label for="login_username">ユーザー名:</label><br>
			<input type="text" name="log" id="login_username" value=""></p>
			<p><label for="login_password">パスワード:</label><br>
			<input type="password" name="pwd" id="login_password" value=""></p>
			<p><input type="submit" value="ログイン"></p>
		</form>
	</div>
<?php } ?>

基本的にはこれだけで表示分けが可能ですが、いざ運用しようとするとログインに関する問題がありますので、下で合わせて紹介します


ログインしてもダッシュボードにアクセスさせない方法

wordpressでログインをすると機能制限はあるもののだれでも管理画面に入ることができます。

しかし、閲覧制限を設けたいだけで、管理画面には入ってほしくない場合もありますので、その時は購読者が管理画面に入れないように以下のコードをfunction.phpに記述します。

add_action( 'auth_redirect', 'subscriber_go_to_home' );
function subscriber_go_to_home( $user_id ) {
	$user = get_userdata( $user_id );
	if ( !$user->has_cap( 'edit_posts' ) ) {
		wp_redirect( get_home_url() );
		exit();
	}
}

購読者がログインしてもツールバーを表示させない方法

wordpressでログインすると権限に関わらず一様に画面上部にツールバーが表示されます。サイト管理者などには必要ですが、閲覧するだけの購読者に取っては邪魔になるので、非表示設定をしておきましょう。

add_action( 'after_setup_theme', 'subscriber_hide_admin_bar' );
function subscriber_hide_admin_bar() {
	$user = wp_get_current_user();
	if ( isset( $user->data ) && !$user->has_cap( 'edit_posts' ) ) {
		show_admin_bar( false );
	}
}

購読者用のログイン・ログアウトコンテンツを作る

上で邪魔なツールバーを消してしまった事で購読者がログアウトできない状態になりましたので、代わりにページのサイドもしくはフッターなど任意の場所にログイン&ログアウトのコンテンツを設けましょう

<p>ログイン</p>
<?php if (is_user_logged_in()) : ?>
	<p>こんにちは!<?php global $current_user; echo $current_user->display_name ?>さん<br>
    ログアウトは &raquo; <a href="<?php echo wp_logout_url() ?>&amp;redirect_to=<?php echo esc_attr($_SERVER['REQUEST_URI']) ?>">こちら</a></p>
<?php else : ?>
    <form method="post" action="<?php echo wp_login_url() ?>?redirect_to=<?php echo esc_attr($_SERVER['REQUEST_URI']) ?>">
        <p><label for="login_username">ユーザー名:</label><br>
        <input type="text" name="log" id="login_username" value=""></p>
        <p><label for="login_password">パスワード:</label><br>
        <input type="password" name="pwd" id="login_password" value=""></p>
        <p><input type="submit" value="ログイン"></p>
    </form>
<?php endif; ?>

また、ログインすると通常は管理画面(ダッシュボード)に移行してしまいますので、それを防ぎ、尚且つそのページに留めたい場合はfunction.phpに次の記述をします。

function mts_check_login() {
	global $current_user;

	get_currentuserinfo();
	extract($current_user->wp_capabilities);
	if ($subscriber) {
		wp_redirect(get_bloginfo('url'));
	}
}

add_action('admin_init', 'mts_check_login');

パスワードをお忘れですか?を表示させない方法

閲覧制限を設けているだけのサイトだと、ひとつの購読者アカウントを共有させた方が管理コストも抑えられて良いのですが、厄介なのが「パスワードをお忘れですか?」をクリックされてしまう可能性があるということです。

これによりゲストアカウントに紐付けたメールアドレスに大量にパスワードリセットのリクエストメールが来てしまいますので、消去しておくことをお勧めします

//ログインページで外部のCSSファイルを読み込ませる記述をfunction.phpに追記
function custom_login() {
    $files = '<link rel="stylesheet" href="'. get_bloginfo('template_directory') .'/スタイルシートのパス">';
    echo $files;
}
add_action('login_enqueue_scripts', 'custom_login');

指定したスタイルシートでdisplay:noneを設定する

#login #nav {
display:none;
}

一定の時間が過ぎると自動ログアウトさせる方法

パブリックPCなどからログインされる事を想定すると必ずしもユーザーがログアウトしてその端末を離れてくれるとは限りません。

そこで、最後のセッションから一定の時間が経過すると自動ログアウトするようにfunction.phpに次のコードを記述しておく事をおすすめします。

add_action( 'admin_init', 'mytheme_admin_init' );
function mytheme_admin_init() {
	add_filter( 'auth_cookie_expiration', 'mytheme_auth_cookie_expiration', 10, 3 );
	$user = wp_get_current_user();
	wp_set_auth_cookie( $user->ID, true );
}
function mytheme_auth_cookie_expiration( $expiration, $user_id, $remember ) {
	if ( $remember ) $expiration = 604800; //一週間後=604800秒後にログアウト
	return $expiration;
}

プラグインなどの有効化・停止の操作時にエラーが発生する場合がありますので、その際はこのコードを必ずコメントアウトしてから操作するようにして下さい。

この記事が気に入ったら
いいね ! お願いします(><;)

投稿者:和禅雅

この記事へのコメント