WordPress

WordPress ログインフォームをページ上に表示してログインするには

サイトの来訪者を一般と登録ユーザーに分けて、コンテンツを見せたいと思うことはないだろうか?そんなとき WordPress では、「購読者」という権限でユーザー設定すれば、テンプレートでユーザーがログインしているかどうか確認し、コンテンツ表示を制御できる。

ところでユーザーのログインページだが、WordPress のログインページを利用するよりもヘッダーやサイドバーなどにログインフォームを設けて、そこでログイン操作ができればスッキリする。さらに、管理画面も表示禁止にできればもっと嬉しい。

ここでは、サイドバーにログインフォームを表示、ログイン後はログイン前の表示ページに戻りつつ、サイドバーにユーザー名を表示する仕方を見て行きたい。また、登録ユーザーの管理画面表示を禁止する方法も検討する。

サイドバーのテンプレートにログインフォームを設定する

ログインフォーム
サイドバーにユーザー名、パスワード、ログインボタンを図のように配置する。フォームのデータ送信先は、

<?php echo wp_login_url() ?>

で取得できる。ログイン直後に管理画面へ移行しないようにするには、「redirect_to」というパラメータを与えるとよい。もし、ログインしたときと同じ表示ページに戻るには、次のように指定すればよい。

<?php echo wp_login_url() ?>?redirect_to=<?php echo esc_attr($_SERVER[‘REQUEST_URI’]) ?>

では、ユーザー名・パスワードの入力要素に与える「name」属性は何にするかと言えば、WordPress が分かるようにそれぞれ、「log」と「pwd」を指定する。

ログイン中次に、ログインが成功した場合のユーザー名とログアウト処理へのリンクの張り方を見る。

ユーザー名は、テンプレート関数1回で表示する方法がないようなので次のようにした。

<?php global $current_user; echo $current_user->display_name ?>

もう少しおしゃれな方法があればお知らせ下さい m(_ _)m。

さて、ログアウト処理へのリンクであるが、これもログアウト後に元のページに戻るように、次のように指定する。

<a href="<?php echo wp_logout_url() ?>&amp;redirect_to=<?php echo esc_attr($_SERVER['REQUEST_URI']) ?>">こちら</a>

以上をまとめて、テンプレート「sidebar.php」に次のように入力する。

<li><h2>ログイン</h2>
<?php if (is_user_logged_in()) : ?>
	Welcome! <?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>
<?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; ?>
</li>

管理画面へ移行しないようにするには

WordPress では、ログインユーザーはデフォルトで管理画面が表示できるようになっている。これを簡単に禁止する設定はないようなので、フックを利用して表示できないようにする。管理画面を表示するとき、必ず呼び出されるアクションフックがあるので、そこで強制的にトップページなどへリダイレクトするようにする。

これはプログラムになるので、テンプレートに書き込まず、同じテーマディレクトリにある「functions.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');

その他

もし、ログインエラーを起こした場合はどうなるだろうか?

残念ながら、WordPress のログイン画面がエラーメッセージとともに表示されてしまう。これを避けるためには、wp-login.php を参考にログイン処理するプログラムを追加する必要があるようだ。

なお、「ログイン情報の記憶」のチェックボックスや、「パスワードをお忘れですか?」のリンクも追加することが可能である。

同人の方とかでダウンロードする人を制限したい場合、利用できないでしょうか?また、データのダウンロード回数をカウントするプラグインも掲載してるので、是非ご利用下さい。お仕事があればお声掛けも歓迎します(^_^;)。