株式会社オンラインの金沢です。
たまたま立ち寄った方にはどうでもよいことだとは思いますが、本日は私の誕生日でございます。だからどうということでもないのですが、祝って下さる方がいるということは嬉しいことですね。
誕生日ネタついでに、WordPressのユーザー情報に「生年月日」の編集項目を追加する方法を紹介します。応用すれば、ユーザーに関する色々なオリジナル項目の追加に使えます。
アクションフックでユーザー編集画面にフォームを追加
WordPressの管理画面で、フォームなどのHTMLソースを追加するときはアクションフックを使います。今回はユーザー編集画面ですので、WordPress本体のファイルから「/wp-admin/user-edit.php」の中身を覗いてみます。すると、ファイルの下の方に「show_user_profile」と「edit_user_profile」というアクションフックが丁度よさそうな位置にありました。ログイン中のユーザー自身のプロフィールを編集する場合は「show_user_profile」が機能し、管理者が他のユーザーを編集る場合は「edit_user_profile」が機能するようです。今回は区別する必要がありませんので、両方にフックさせましょう。
使用中のテーマのfunctions.phpに下記のコードを記述します。
function online_add_user_form( $profileuser ) { ?> <h3>生年月日</h3> <table class="form-table"> <tr class="user-birthday-wrap"> <th><label for="birthday_year">年 (西暦)</label></th> <td><input type="text" name="birthday_year" id="birthday_year" value="<?php echo esc_attr( get_user_meta( $profileuser->ID, 'birthday_year', true ) ) ?>" /> </tr> <tr class="user-birthday-wrap"> <th><label for="birthday_month">月</label></th> <td><input type="text" name="birthday_month" id="birthday_month" value="<?php echo esc_attr( get_user_meta( $profileuser->ID, 'birthday_month', true ) ) ?>" /> </tr> <tr class="user-birthday-wrap"> <th><label for="birthday_day">日</label></th> <td><input type="text" name="birthday_day" id="birthday_day" value="<?php echo esc_attr( get_user_meta( $profileuser->ID, 'birthday_day', true ) ) ?>" /> </tr> </table> <?php } add_action( 'show_user_profile', 'online_add_user_form' ); add_action( 'edit_user_profile', 'online_add_user_form' );
「show_user_profile」か「edit_user_profile」にフックさせるときに使用可能な変数「$profileuser」は、編集中のユーザー情報が色々入ったオブジェクトです。格納されている値はWordPress関数の「get_userdata」を調べるとわかります(WordPress Codex 日本語版「get_userdata」)。
「生年月日」が保存されている場合は、フォームにあらかじめ出力しておかなければなりません。保存値を入手するには「get_user_meta」関数を使います。使い方は、投稿のカスタムフィールドを取得する「get_post_meta」と同じです。
get_user_meta( $user_id, $key, $single )
引数
- $user_id
メタ情報を得たいユーザーのID。必須項目
型: int 初期値: None
- $key
得たいメタ情報のキー。空にすると$user_idの全てのメタ情報を配列で返すようになる。
型: string 初期値: 空の文字列
- $single
戻り値のメタ情報を、1つだけにするかどうか。trueを指定すると1つのメタ情報を文字列で返し、falseにすると配列で返すようになる。$keyが空の文字列で指定されていた場合は、$singleは意味をなさない。
型: bool 初期値: false
「profile_update」にフックさせてフォームのデータを保存
フォームができましたら、次は保存させる処理です。ユーザー編集画面で更新ボタンを押すと、送信データのバリデートが行われ、最終的には「wp_insert_user」という関数でユーザー情報の更新が行われるようです。「wp_insert_user」の最後に「profile_update」というアクションフックがありましたので、ここに「生年月日」の更新処理を組み込んでやりましょう。
認証や権限チェックは既にされていますので、フォームから送信されたデータのバリデート処理から書いていきます。
function online_user_birthday_save( $user_id ) { $meta_keys = array( 'birthday_year', 'birthday_month', 'birthday_day', ); foreach ( $meta_keys as $key ) { if( isset( $_POST[ $key ] ) ) { if ( $_POST[ $key ] ) { if ( is_numeric( $_POST[ $key ] ) ) { update_user_meta( $user_id, $key, $_POST[ $key ] ); } } else { delete_user_meta( $user_id, $key ); } } } } add_action( 'profile_update', 'online_user_birthday_save' );
送信データ3つとも同じ処理になりますので、foreachループ文でまとめました。「$key」が「birthday_year」、「birthday_month」、「birthday_day」に置き換わって処理が行われます。
こちらの処理は、まずPOST送信データの中に登録したいメタ情報のキーが存在しない場合は無視されます。また、キーが存在しても得られた値が数値では無い場合も何も起こらずに通過するようにしてあります。このようにして送信データのバリデートが行われ、WordPressの「update_user_meta」を用いてメタ情報の更新をおこなっております。更に、キーが存在しても中身が無い場合は「delete_user_meta」で保存値も空にするようにしてあります。
以下に、「update_user_meta」の説明を書きます。
update_user_meta( $user_id, $meta_key, $meta_value, $prev_value)
引数
- $user_id
メタ情報を更新したいユーザーのID。必須項目
型: int 初期値: None
- $meta_key
更新したいメタ情報のキー。必須項目
型: string 初期値: None
- $meta_value
更新したいメタ情報の値。必須項目
型: string 初期値: None
- $prev_value
更新したいメタ情報が同じキーで複数登録されいるときに有効。$prev_valueにセットした値と同じ値の登録情報だけを更新する。セットされていない場合は同じキーの登録情報を全て更新する。
型: string 初期値: 空の文字列
「update_user_meta」は「update_post_meta」と同じような処理を行います。と言いますのも、処理をたどっていくと同じ関数に行き着くわけですから。上記の説明では全て「更新」と書きましたが、この関数は新規追加時にも使用できます。「$user_id」と「$meta_key」に一致する情報が保存されていなければ「add_user_meta」に切り替えてくれる、よくできた関数です。
あとがき
以上でデータの登録の仕組みは終わりです。あとは「get_user_meta」を用いて好きなようにご利用ください。プロフィール画面を作成して生年月日を公開するのもよし。ユーザーの誕生日になるとトップページに大きく「○○は××歳になりました!!」と表示されるようするのもよし。管理画面に「あなたが××歳でいられるのは、あと△△日です。」と表示するのもいいでしょう。周りに迷惑をかけない限りは、やりたい放題ですね。
金沢