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 を参考にログイン処理するプログラムを追加する必要があるようだ。

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

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


  • トラックバック 停止中
  • コメント (6)
    • おっさん
    • 2009年 12月3日 7:44pm

    参考にさせていただきました。
    非常に助かりました。

    フォームのサンプルソースですが、
    誤 wp_logint_url
    正 wp_login_url
    だと思いました。

    それだと動いたので。

  1. コメントありがとうございます。
    お役に立ったようで嬉しく思います。

    また、ご指摘ありがとうございました。
    スペルミスを修正しました。

  2. wp_login_urlもwp_logout_urlも、引数にリダイレクト先のパスを渡せますよ!
    http://codex.wordpress.org/Function_Reference/wp_login_url

  3. @西川伸一 さん、ご指摘ありがとうございます。

    本記事ではログイン後のリダイレクト先指定を、GETパラメータで与えるようにしてます。リンクして下さったリファレンスでは、引数に「http://~」でリダイレクト先を渡せることが説明されております。

    記憶は定かでありませんが、本記事を掲載した当時には wp_login_url() のリファレンスがなく、wp-adminでログインする際どうやってるか見て、真似て動作させて動いた結果を記事にしたと思います。

    ご指摘いただいたお陰で当方の認識をリセットすることができました。どうもありがとうございました。m(_ _)m

    • 藤山 誠二
    • 2013年 3月12日 6:53pm

    管理画面に移行しない箇所で
    同じテーマのディレクトリとはどこの事でしょうか?
    使用themeのfunction.phpに追加しても管理画面へ移動します。
    ご教授願えればたすかります。
    wpバージョンは3.5.1になります

  4. @藤山 誠二 さん、コメントありがとうございます。

    藤山さんがコメントして下さった「使用theme」のfunctions.phpでOKです。

    動作しなかったとの事、何か原因があるかと思います。「functions.php」の「s」を付け忘れている、という事はありませんか?

    エラーが発生しているようであれば、wp-config.php の「WP_DEBUG」をtrueに設定すれば表示されます。

    関数の中に「die(“今ここ!”);」のような埋め込みをしておけば、admin_initのフックが
    間違いなく呼び出されているか分かりますので、スペル間違いなども確認できます。

    3.5.1でも動作すると思いますが、$subscriberの変数値が何かvar_dump()で表示してみると良いと思います。

コメント 停止中