WordPressで構築した会員サイトでユーザー作成時にプロフィールページを作りたい場合や、店舗情報などユーザーを振り分けるなどといった場合、ユーザーの追加時に自動で固定ページ(または投稿、カスタム投稿タイプ)を作成したいことがあるかと思います。また、作成したページとユーザーと紐づける方法も記述します。
ユーザー追加時にページを作成
WordPressのいいところでコアなところを編集しないでいいようにアクションフックが用意されており、「ある処理を行ったときにこの処理もする」といったことが可能になります。ユーザーを追加したときというアクションフックがあるため、そこに投稿する関数を付け足すイメージです。
ユーザーの追加時のアクションフック
ユーザーを追加するときのアクションフックは「user_register」になります。「user_register」は引数にユーザーIDを受け渡すことが出来るため、新規追加したユーザーの情報をタイトルや本文、カスタムフィールドなどに利用できるわけです。
1 2 3 4 |
function auto_insert_page( $user_id ) { //ここに処理を記述 } add_action( 'user_register', 'auto_insert_page', 10, 1 ); |
新しく投稿する関数
新しく投稿するには「wp_insert_post()」を利用しました。投稿の情報を色々と設定できるのですが、その中で投稿タイプも設定できるのでカスタム投稿タイプを利用したい場合などにも便利です。タイトルと本文は必須になります。Codexの説明でどのような設定が可能かみれますので参考にしてみてください。この関数は投稿が成功した場合、投稿IDを返しますので、続けて処理が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/*設定 ====================================================*/ $my_post = array( 'post_title' => '新しい投稿!', //タイトル 'post_content' => 'この投稿は自動で投稿されました。',//本文 'post_type' => 'page', //投稿タイプ(post,page,カスタム投稿タイプ) 'post_status' => 'publish',//ステータス 'post_author' => 1,//著者 'comment_status' => 'open'//コメントの受付 ); /*投稿 ====================================================*/ $post_id = wp_insert_post( $my_post ); |
カスタムフィールドを更新
ユーザーと結び付けるためにカスタムフィールドを利用しました。作成した著者を新ユーザーにしてもよかったのですが、ユーザーには編集の権限を持たせたくなかったので今回はユーザーと関連付けるだけにとどめました。カスタムフィールドを更新するには、「update_post_meta() 」を利用します。引数は順に、「投稿ID」、「カスタムフィールドのキー」、「カスタムフィールドの値」となっています。
1 2 3 4 5 |
/* ====================================================*/ if($post_id) { update_post_meta($post_id, 'profile_user', $user_id); } |
まとめ
これらを組み合わせると以下のようになります。「auto_insert_page( $user_id )」はユーザー定義関数で、「add_action( ‘user_register’, ‘auto_insert_page’, 10, 1 );」と結びついています。ユーザーを追加したときに「auto_insert_page()」を行うということですね。
また、「get_user_meta()」では登録されたユーザーIDからそのユーザーメタ情報を引っ張ってきています。ここでの注意点は、ユーザー登録フォームにて必須になるものだけを利用した方がよさそうです。ログインID、メールアドレスやパスワードのみしか登録の際に行っていない場合、値が空になってしまいます。
そしてフォームからの情報を利用する場合、悪意ある攻撃を防ぐために「wp_strip_all_tags()」を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function auto_insert_page( $user_id ) { $user_name = get_user_meta($user_id,'last_name',true); /*設定 ====================================================*/ $my_post = array( 'post_title' => wp_strip_all_tags($user_name.'さんのプロフィール'), //タイトル 'post_content' => ' ',//本文 'post_type' => 'page', //投稿タイプ(post,page,カスタム投稿タイプ) 'post_status' => 'publish',//ステータス 'post_author' => 1,//著者 'comment_status' => 'open'//コメントの受付 ); /*投稿 ====================================================*/ $post_id = wp_insert_post( $my_post ); /*もし成功していたらカスタムフィールド「profile_user」を更新 ====================================================*/ if($post_id) { update_post_meta($post_id, 'profile_user', $user_id); } } add_action( 'user_register', 'auto_insert_page', 10, 1 ); |
ユーザーIDから関連付けられたページIDを取得する
ここまでで既に新規ユーザーが追加されたときに固定ページが作成されます。実際に利用するには、「ユーザーIDから関連付けられたページを取得したい」といったことも出てくると思います。今回は「$wpdb」を利用して取得します。1ユーザーにつき1件しかない想定のため配列の「0」番目を返す設定になっていますが、複数取得する場合は配列ごと返してあげてもいいかもしれません。
1 2 3 4 5 6 7 8 9 10 |
function my_get_page_by_userid($user_current_id){ global $wpdb; $page_id = ''; $meta_key = 'profile_user'; //カスタムフィールドのキー $meta_value = $user_current_id; $arrPostIds = $wpdb->get_col($wpdb->prepare("select post_id from wp_postmeta where meta_key = %s and meta_value = %s", $meta_key, $meta_value)); $page_id = $arrPostIds[0]; return $page_id; } |
ログインユーザーから利用したい場合は、以下のようにすると関連付けられたIDを取得できます。
1 2 3 4 5 |
if(is_user_logged_in()) { //ログインしている場合 $now_user = wp_get_current_user();//ログインユーザーの情報を取得 $now_user_id = $user->get('ID');//IDを摘出 $page_id = my_get_page_by_userid($now_user_id);//上で作った関数でIDを取得 } |
コメントを残す