WordPressでつくる会員制Webサービスのつくり方【会員管理編】
- Category
- WordPress
現在WordPressを使用して会員機能を持ったWebサービスを制作しています。
その際に使用したプラグインやTipsを機能別にまとめておきたいと思います。
※そのサービスは来月ぐらいに公開できる予定です。
会員登録
まずは会員登録機能をどのように実装するか。会員制サービスの第一歩にして一番めんどくさい部分です。
自力でコードを書いたこともありましたが、プラグインを使用するのが一番手っ取り早く確実でした。
[プラグイン]Social Connect
それぞれのサービスで認証を許可するとWordPress側で
・ユーザーの作成
・ユーザーが作成済みならばログイン
の機能を実装してくれます。
[プラグイン]Theme My Login
上記Social Connectがあればいらないんじゃね?と思いますが、ログイン後のマイページやプロフィール編集画面などもダッシュボードではなく通常のページ内に設置できますので、Social Connectとあわせて導入すると捗ります。
[プラグイン]Cimy User Extra Fields
自分のサービス独自のプロフィールであったりメッセージであったりを会員に掲載させたい場合、会員情報を拡張できるCimy User Extra Fieldsプラグインを使用してオリジナルのプロフィールを登録させることが可能です。
Theme My Loginを使用している場合、独自のログイン画面にCimy User Extra Fieldsを使用した拡張プロフィール項目も自動で表示されるので非常に便利です。
[プラグイン]Featuring CountComments
ユーザーを取得してコメント数の多いユーザーごとに表示するにはFeaturing CountCommentstプラグインを使用すると以下のコードで取得できます。コメント数ランキングのような感じで使えます。
<?php $users = get_users(); foreach ($users as $user) { $user_name = $user->user_login; $user_id = $user->ID; global $featuring_countcomments; $params=array( 'query_type' => 'user_id', 'user_attribute' => $user_id, 'zero' => '0', 'one' => '1', 'more' => '%c' ); echo $user_name.' '; echo $featuring_countcomments->count_by_user($params) . '件<br />'; } ?>
[テンプレート]退会させるには
退会できないWebサービスというのはよく問題になりますので、退会時の処理についてはよく検討したほうがいいでしょう。
・退会した場合、過去のデータはどうするのか。
・即時退会させるのか
などの判断が問題になりやすいです。
簡易的に考えるならば、WordPressにおける退会処理は「ユーザーの削除」「投稿記事の削除」だと思います。これは以下のようなコードで実現できます。
HTML
<p> 退会しますか?<br /> 投稿記事はすべて削除されます。 </p> <form action="" method="post"> <?php $nonce= wp_create_nonce('my-nonce'); ?> <input type="hidden" name="_wpnonce" value="<?php echo $nonce; ?>" /> <input type="hidden" name="user_delete" value="1" /> <input type="submit" value="退会する" /> </form>
上記HTMLで退会処理をさせるPHPに退会処理を行うフラグをPOSTします。
PHP
<?php $nonce=$_REQUEST['_wpnonce']; if($_POST["user_delete"] && wp_verify_nonce($nonce, 'my-nonce')){ require_once ABSPATH."/wp-admin/includes/user.php"; global $userdata; get_currentuserinfo(); $author = $userdata->ID; $delcomp = wp_delete_user($author); if($delcomp){ $_SESSION = array(); session_destroy(); echo '<p>削除処理が完了しました。</p>'; } else { echo '<p>削除処理中にエラーが発生しました。</p>'; } ?>
上記ではユーザー削除と投稿記事削除を行いますが、wp_delete_user($author)の第2引数にユーザーIDを渡すと、投稿記事を指定ユーザーIDのユーザーに移すことができます。記事削除を行いたくない場合はダミーユーザーのIDを指定するといいでしょう。
会員登録を承認制にするには?
申請があったものを素通しで会員にしたくない場合は、New User Approveというプラグインが便利です。承認するまでユーザー登録されない・・・というより、正確には「承認済み」や「承認待ち」というユーザーに対するメタデータを付加しています。
会員を2種類つくって一方は承認制、もう一方は自由に登録させたい場合
不動産ポータルサイトなどをイメージすると分かりやすいですが、エンドユーザーは自由に簡単に登録できますが不動産を掲載するユーザーは承認が必要、という場合は以下のようなコードに書き換えます。
プラグインを直接書き換えますのでご注意ください。
//330行目あたり //------------------------------------- if($hogehoge){ update_usermeta($user_id, 'pw_user_status', 'approved'); } else{ update_usermeta($user_id, 'pw_user_status', 'pending'); }
$hogehogeで何を条件に承認待ち(pending)か承認済み(approved)を設定します。会員登録フォームでhiddenで何か持たせて渡すなどの方法が無難だと思います。
次回は管理画面を使わず記事を投稿させる方法について書きたいと思います。
関連記事
- WordPressでつくる会員制Webサービスのつくり方【記事投稿編】
- WordPressプラグイン[User Submitted Posts]がnonceを使っていないのをなんとかする
- かわいい楽天モデルを探すWebサービス「楽モ」というサイトをつくりました
- Codetter(こーどったー)β ~コードがつぶやけるWebサービス~
- Web制作者ならではの苦笑を共有できるWebサービス「Web制作者の(苦笑)」をリリース
- 凄まじくレスポンシブなjQuery masonryプラグインを使って凄まじくインタラクティブなWebサイトを簡単につくる
- Geolocation APIとぐるなびAPIを使って近くの飯屋を探すWebアプリの実装例
- カスタムタクソノミーを使った複雑な条件検索
コメントを投稿する
コメントありがとうございます。
ログインユーザーだけに記事を表示させる場合、is_user_logged_in()という関数でログインしているか否かを判定できますので
if ( is_user_logged_in() ) {
echo '会員専用コンテンツです';
the_content();
} else {
echo 'この記事を見るためにはログインしてください';
};
といったかたちで判定することが可能です。
詳しくはCodexに解説がありますので参考になるかと思います。
http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/is_user_logged_in
ちょっと、私の説明不足でしたが、
管理人が投稿した個人宛(会員宛ではなく個人宛)の記事があり、
対象のユーザがログインした際、その投稿データのみを閲覧させたいです。
できれば、その画面を見たかどうかを、ユーザにチェックさせたいです。
要するに、Wordpressで、個人別の回覧板を作成するようなものでしょうか?
ポイントは、会員用のコンテンツの表示では無く、
会員の中のさらに、特定のユーザ向けに、特定のコンテンツ(複数の記事ページ)を表示させたいことなのです。
ちょっと特殊かも知れません。
是非、ご教授いただけると幸いです。
よろしくお願いいたします。
> 対象のユーザがログインした際、その投稿データのみを閲覧
この処理は、記事投稿時に「どのユーザー向けか」をカスタムフィールドで入力する(たとえば「userid」という名前のカスタムフィールドに見せたいユーザーのIDを入力する)
>その画面を見たかどうかを、ユーザにチェックさせたい
こちらも同様に、その記事を見たかどうかをカスタムフィールドに保持する。たとえば「read」というカスタムフィールドが「1」ならば既読と判定。
※ページ中にフォームを設置し、見た人がフォームを送信すれば既読である(つまりadd_post_metaでフロントエンドからカスタムフィールドを追加する)
という処理でどうでしょうか?
コードが長くなりましたので以下のページを参照してください。
http://codetter.com/?p=864
種々のご教授、大変にありがとうございます。
明日、トライしてみます。
本当にありがとうございます。
取り急ぎ御礼まで
ありがとうございます。
1つだけお聞きしたいと思います。
会員になった際、マイページ(というか、自分だけしか見れない投稿記事やカテゴリに属する記事など)を作成する方法はありませんでしょうか?
管理者が作成した個人向けのコンテンツに対して、会員登録して、ログインされた方だけが表示されるようにしたいのです。
もちろん、他者には完全に非表示にしたいです。
是非、ご教授頂ければ幸いです。
よろしくお願い申し上げます。