WordPressを使って会員制サイトやマッチングサイトなどのようなユーザー参加型(登録型)のサイトを構築する際、デフォルトで用意されている管理画面・登録画面・ログイン画面などは使用せずに、自作した各種フォームや情報更新機能をフロントへ配置したものを利用させることも多いと思います。
ただ、自分は普段からこういったサイトをWordPressで構築することが少なく、同じような処理の関数が用意されているのに無駄に自作してたり単純に忘れてることが多いので、覚えておきたい便利関数の備忘録です。

ちなみに、例えばログインフォームを任意の場所へ簡単に表示できるwp_login_form()やログアウト用リンクを出力させるwp_logout_url()などのように便利だと感じる関数は他にもありますが、極力WordPress感を消すといった要望がある場合はそのまま使えないことも少なくないので、個人的にそのように感じるものは除外しています。

ログインユーザーと非ログインユーザーで処理を分ける

ログインユーザーならログアウトボタンを表示、非ログインユーザーならログインボタンを表示といったようにログインユーザーと非ログインユーザーとで表示を切り替えたり処理を分けたい場合はis_user_logged_in()で実装できます。
ログインしていればtrue、非ログインであればfalseが戻り値になります。

if ( is_user_logged_in() ) {
  // ログインユーザー向けの処理
} else {
  // 非ログインユーザー向けの処理
}

ユーザーが特定の権限を持っているか判定

ログインしていて且つ特定の権限を持つユーザーのみに対して何らかの処理を行いたい場合はcurrent_user_can()で実装できます。
使用時はパラメータに対象の権限を指定し、ユーザーが権限を持って(属して)いればtrue、そうでなければfalseが戻り値になります。

if ( current_user_can( 'administrator' ) ) {
  // 管理者権限向けの処理
} else {
  // 管理者権限以外向けの処理
}

新しい権限を追加

WordPressにはデフォルトで5種類の権限が用意されており、それらを用いることでそのユーザーの行動を制限させたりすることが可能ですが、それらとは別にサイト独自の権限を追加したい場合はadd_role()で実装できます。
使用時はadd_role( $role, $display_name, $capabilities )のように3つのパラメータを指定し、$roleは権限グループ名、$display_nameは権限グループ表示名を指定します。
最後の$capabilitiesはそのグループに属したユーザーができる行動などを指定するもので、例えば記事投稿を許可するならedit_posts、メディア追加を許可するならupload_filesなどを配列で指定します。

// プレミアム会員(premium)という権限を追加したい場合
$capabilities = [
  // ここに許可する権限を指定
];
add_role( 'premium', 'プレミアム会員', $capabilities );

ちなみに、権限を間違えて作ってしまった場合や不要になった場合はremove_role( $role )で削除でき、パラメータには削除したい権限グループ名を指定します。

現在のログインユーザー情報を取得

ユーザー名を表示させたりマイページでそのユーザーの各種情報を出力するなど、現在ログインしているユーザー情報を取得したい場合はwp_get_current_user()で取得できます。

$user = wp_get_current_user();

echo $user->user_login;   // ログイン名
echo $user->user_email;   // メールアドレス
echo $user->display_name; // ブログ上の表示名

ちなみに、wp_get_current_user()では取得できないユーザーのメタ情報についてはget_user_meta()で取得可能で、必須となる第1パラメータにユーザーIDを指定します。
第2パラメータには取得したいメタ情報のキーを指定(空文字だった場合はすべてのメタ情報が返る)し、第3パラメータではtrueを指定すると値で、falseを指定すると配列で値を返してくれます。

現在のログインユーザーIDを取得

現在ログインしているユーザーIDのみ必要であればget_current_user_id()で取得できます。

ユーザー名が登録されているか確認

新規ユーザー登録時などに特定のユーザー名が既に登録されていないかはusername_exists()で確認でき、使用時はパラメータに確認したいユーザー名を指定します。
既に登録されている場合はそのユーザーIDが、登録されていない場合はfalseが戻り値になります。

$check_username = 'example';
if ( username_exists( $check_username ) ) {
  // 「example」のユーザー名が登録されている場合の処理
} else {
  // 「example」のユーザー名が登録されていない場合の処理
}

メールアドレスが登録されているか確認

上記と似たような感じで、特定のメールアドレスが既に登録されていないかはemail_exists()で確認でき、使用時はパラメータに確認したいメールアドレスを指定します。
既に登録されている場合はそのメールアドレスを使用しているユーザーIDが、登録されていない場合はfalseが戻り値になります。

$check_email = 'email@example.com';
if ( email_exists( $check_email ) ) {
  // 「email@example.com」のメールアドレスが登録されている場合の処理
} else {
  // 「email@example.com」のメールアドレスが登録されていない場合の処理
}

ログインさせる

ユーザーログインはwp_signon( $credentials, $secure_cookie )で実装できます。
第1パラメータにはログイン名・パスワード・ログイン情報保持の有無を指定し、第2パラメータではセキュアクッキーを使用する場合にtrueを指定します。
第1パラメータの各値はおそらくログインフォームを自作している場合はそれぞれ自作したキーを指定することになると思いますが、省略した場合は$_POSTにある'log', 'pwd', 'rememberme'を参照します。

// ユーザー名「example」とパスワード「password」が正しければ、ログイン情報保持有でログイン
$credentials = [
  'user_login' => 'example',
  'user_password' => 'password',
  'remember' => true,
];
$user_login = wp_signon( $credentials, true );
if ( ! is_wp_error( $user_login ) ) {
  // ログイン成功
} else {
  // ログイン失敗
}

ログアウトさせる

ユーザーをログアウトさせたい場合はwp_logout()で実装できます。
現在のユーザーではなく特定ユーザーをログアウト処理したい場合は、下記で$user_idの部分をその特定ユーザーのIDにすることで実装できます。

delete_user_meta( $user_id, 'session_tokens' );

パスワードを確認

特定のパスワードがユーザーのパスワードと一致しているか確認したい場合はwp_check_password()で実装できます。
パラメータはwp_check_password( $password, $hash, $user_id )の3つで、$passwordは対象のパスワード、$hashはユーザーのパスワードハッシュ、$user_idはユーザーIDを指定します。
パスワードが一致すればtrue、そうでなければfalseが戻り値になります。

// 「email@example.com」のメールアドレスで登録しているユーザーのパスワードが「password」なのか確認
$check_user = get_user_by( 'email', 'email@example.com' );
if ( $check_user && wp_check_password( 'password', $check_user->user_pass, $check_user->ID ) ) {
  echo '正しいパスワードです。';
}

パスワードをハッシュ化

プレーンテキストのパスワードをハッシュ化したい場合はwp_hash_password()で実装でき、パラメータに文字列を渡すとハッシュ生成したものが戻り値になります。

パスワードを生成

WordPressの管理画面で新規ユーザーを追加しようとするとパスワード入力欄に自動的にパスワードが出力されていると思いますが、wp_generate_password()を使うことでそれらと同じようなルールでのパスワード生成ができます。
パラメータ未指定時だと英字(小/大)・数字・一部の特殊文字を組み合わせた12文字を出力し、生成したパスワードが戻り値になります。
パラメータ指定はwp_generate_password( $length, $special_chars, $extra_special_chars )の3つで、$lengthは文字数、$special_chars$extra_special_charsは特殊文字を含めるかをboolean型で指定します。
特殊文字はそれぞれtrue時に下記がパスワード内に使用されるようになります。

  • $special_chars!@#$%^&*()
  • $extra_special_chars-_ []{}<>~`+=,.;:/?|'

※特殊文字使用を指定した場合でも、生成パスワード内に含まれないこともあります。

Nonceを使う

Nonceとは、URLやフォームを悪意のある操作から守るためのCSRF対策として使われるものです。
それぞれ具体的に説明すると長くなるので割愛しますが、用意されている関数と簡単な概要としては下記のようになっています。

wp_nonce_url( $actionurl, $action, $name )

nonceを追加したURLを取得します。

wp_nonce_field( $action, $name, $referer, $echo )

フォームにnonceを追加でき、<input type="hidden" name="_wpnonce"><input type="hidden" name="_wp_http_referer">が表示されます。

wp_create_nonce( $action )

上の2つとは異なる用途で使いたいとき向けで、nonce値だけを作成します。

check_admin_referer( $action, $query_arg )

現在のリクエストが有効なnonceを持つかを検証します。

check_ajax_referer( $action, $query_arg, $die )

AJAXリクエスト時のnonceを検証します。

wp_verify_nonce( $nonce, $action )

他のコンテキストからのnonceを検証するのに使用します。

ちなみに、デフォルトではnonceの有効期限は1日(24時間)になっていますが、変更したい場合はnonce_lifeのフィルターフックで任意指定できます。

// Nonce有効期間を6時間に変更
add_filter( 'nonce_life', function() {
  return 6 * HOUR_IN_SECONDS;
} );

ユーザーを作成

ユーザーを作成したい場合はwp_create_user()で実装でき、ユーザー名とパスワードが必須パラメータとして必要です。
パラメータ指定はwp_create_user( $username, $password, $email )の3つで、$usernameにユーザー名、$passwordにパスワード、$emailにメールアドレスをそれぞれユーザー情報として指定し、問題なく作成されればそのユーザーのIDが戻り値になります。

また、例えば権限を付与したりニックネームを設定したりなど、ユーザー登録時にユーザー名・パスワード・メールアドレス以外の情報も含めて作成したい場合はwp_insert_user()で実装できます。
パラメータには作成ユーザー情報のオブジェクトか配列を指定し、必須指定としてユーザー名(user_login)とパスワード(user_pass)は含める必要があります。
問題なく作成されればそのユーザーのIDが戻り値になります。

// ログイン名・パスワード・メールアドレス・ニックネーム・権限が設定された状態でユーザー作成する場合
$userdata = [
  'user_login' => 'xxx',
  'user_pass' => 'xxx',
  'user_email' => 'xxx',
  'nickname' => 'xxx',
  'role' => 'xxx',
];
$user_id = wp_insert_user( $userdata );

パラメータで指定できる情報については下記で確認できます。

ユーザー情報を更新

ユーザー情報を更新したい場合はwp_update_user()で実装できます。
基本的にwp_insert_user()と似たような感じで、パラメータには対象ユーザー情報のオブジェクトか配列を指定し、問題なく更新されればそのユーザーのIDが戻り値になります。

また、例えばカスタムフィールドで独自追加した情報など、wp_update_user()では更新できないユーザー情報を更新したい場合はupdate_user_meta()で実装できます。
パラメータ指定はupdate_user_meta( $user_id, $meta_key, $meta_value, $prev_value )の4つで、$user_idには更新ユーザーのID、$meta_keyにはメタ情報のキー、$meta_valueにはメタ情報の値を指定します。
最後の$prev_valueについては更新前のメタ情報の値を指定し、ここが指定されていた場合は「現在のメタ情報の値が$prev_valueと一致していた場合に$meta_valueの値に更新する」という動きになります。
問題なく更新されればそのユーザーのIDが戻り値になります。

ユーザーを削除

ユーザーを削除したい場合はwp_delete_user()で実装でき、必須となる第1パラメータに削除したいユーザーIDを指定します。
第2パラメータは削除ユーザーの投稿などを他のユーザーへ割り当てたい場合にそのユーザーIDを指定し、指定がなかった場合は削除ユーザーの投稿なども同時に削除されます。
また、使用時は/wp-admin/includes/user.phpをインクルードする必要があります。
問題なく削除できた場合はtrueが戻り値になります。

// ユーザーIDが10のユーザーを削除
require_once( ABSPATH . 'wp-admin/includes/user.php' );
$delete_user_id = 10;
wp_delete_user( $delete_user_id );

メールを送信

デフォルトでもユーザー登録時やパスワードリセット時など特定のアクション発生時にメールが送信されるようになっていますが、デフォルトでは用意されてないような内容・タイミングでメール送信を行いたい場合はwp_mail()で実装できます。
パラメータはwp_mail( $to, $subject, $message, $headers, $attachments )の5つで、$toが宛先、$subjectが件名、$messageが本文、$headersがメールヘッダー、$attachmentsが添付ファイルをそれぞれ指定できます。
問題なくメールが送信できた場合はtrueが戻り値になります。

ちなみに、$headersの指定は必須ではないですが、ない場合は送信者が「WordPress」、送信元メールアドレスが「wordpress@{サイトのドメイン}」となるので、WordPress感を消したい場合は$headers = array( 'From: Example <email@example.com>' );のようにメールヘッダーを指定しておいた方がいいです。
また、デフォルトで送信されるメールを停止させたい場合は、下記エントリーで紹介している方法で実装できます。


これら以外にもファイルアップロード周りで使えるmedia_handle_upload()wp_handle_upload()、記事の投稿や削除などに使えるwp_insert_post()wp_delete_post()など便利だったり実装内容によっては必須な関数はありますが、それらはまた後日追記しようと思います。