WordPressでユーザーが自分で退会できる機能を独自に実装する方法
こんにちは、Webエンジニアのゾノ( @ozonosho )です。
今回の記事ではWordPressでユーザーが自分で退会できる機能を独自に実装する方法を紹介します。
会員制サイトを作る場合、会員登録機能だけでなく退会機能が必要になります。
WordPressに備わっているのは管理画面内からユーザーを削除できる機能だけなので、サイト上に一般ユーザー向けの退会機能を作る場合はプラグインを利用するか独自に実装する必要があります。
プラグインを利用する場合、運営者がサイト改善のために集めたい情報(例:退会理由、サイトへの評価、退会者の属性、など)を柔軟に集めることができないので、独自に実装するほうが理想の退会機能を実現できるでしょう。
そんなわけで、僕の運営するいくつかのサイトでは独自に退会機能を実装しています。
▽実装例
※上記サイト「ココトモ」では会員登録後に利用できるマイページ内に退会機能を設置しています
独自に退会機能を実装すると以下のようなメリットがあります。
- 退会機能を独自に実装するメリット
-
- 好きなページの好きな箇所に退会フォームを設置できる
-
退会時にユーザーから集めたい情報を集めることができる
(例:退会理由、年代、性別、など) -
権限別に退会フローを変えることができる
(例:スタッフ権限のユーザーは管理者承認制での退会にする、など) -
退会ユーザーの投稿情報を自由に制御できる
(例:著者情報を非表示にする、など) -
退会ユーザーの退会後のサイト操作を制御できる
(例:同じアドレスでの新規会員登録を一定期間拒否する、など)
僕個人としては、退会理由や退会ユーザーの属性などサイト改善に生かせるデータを集められることが何よりも大きなメリットだと感じます!
退会機能を独自に実装する方法
退会機能を実装するためには、①退会フォームと②退会処理の2つが必要になります。
※厳密にいえば①はフォームでなくともリンクやボタンだけでも可ですが、ここではフォームを利用する形式でご紹介します
尚、退会機能なので前提として会員登録したユーザーが存在している必要があります。会員登録機能の実装方法も知りたい方は下記記事を参照ください。
①退会フォームの用意
例として退会理由を入力できる退会フォームを用意してみます。
<?php if(is_user_logged_in()) { ?>
<form method="post">
<label for="withdraw_reason">退会理由</label>
<textarea id="withdraw_reason" name="withdraw_reason"></textarea>
<input name="action" type="hidden" value="do_withdraw">
<?php wp_nonce_field('do_withdraw', 'token'); ?>
<button type="submit">退会する</button>
</form>
<?php } ?>
こんな感じでしょうか。
ログイン状態のユーザーが自分で退会することを想定しているため(=どのユーザーが退会しようとしているか処理側で拾えるため)、ユーザーに自分で自分の登録情報(例:メールアドレス、ユーザーIDなど)を入力させる必要はありません。
CSRF対策用にwp_nonce_fieldでトークンを発行します。
②退会処理
退会ボタンが押された後は、フォームから正しい情報が送信されているか検証したうえで問題なければ退会処理をおこないます。
WordPressの場合はinitやwpといったフックが用意されているので、適切なタイミングで処理を挟みましょう。
functions.phpに記述する処理例を載せてみます。
ここでは一例として、以下のような仕様を想定したコードを紹介しています。
- 今回紹介する退会処理の仕様
-
- 退会フォームから送信された情報を退会ユーザーの属性とあわせて独自のテーブル「withdraw」に保存する
- 退会ユーザーの投稿はすべて削除する(【方法1】の場合)
- 退会ユーザーのアカウント(wp_users&wp_usermeta)はすべて削除する
<?php
add_action('wp', function() {
if(isset($_POST['action']) && $_POST['action'] === 'do_withdraw') {
do_withdraw();
}
});
function do_withdraw() {
//トークン認証
if(!isset($_POST['token']) || !wp_verify_nonce($_POST['token'], 'do_withdraw')) {
return false;
}
$user_id = get_current_user_id();
$withdraw_reason = (isset($_POST['withdraw_reason'])) ? $_POST['withdraw_reason'] : '';
/*
①入力内容のチェック
*/
//必須項目チェック
if(!$withdraw_reason) {
return false;
}
//ユーザーの権限チェック(例:「user」権限のユーザーかどうか)
if(!user_can($user_id, 'user')) {
return false;
}
/*
②退会処理
・退会情報(例:退会者の年代、性別、退会理由)をDBに保存する
・退会ユーザーを削除する
*/
global $wpdb;
//退会情報をDBに保存する(例)
$user_age = get_user_meta($user_id, 'user_age', true);
$user_sex = get_user_meta($user_id, 'user_sex', true);
$sql = $wpdb->prepare("INSERT INTO withdraw (user_age, user_sex, withdraw_reason, created_at) VALUES (%d, %d, %s, %s)", $user_age, $user_sex, $withdraw_reason, wp_date('Y-m-d H:i:s'));
if(!$wpdb->query($sql)) {
return false;
}
//退会ユーザーを削除する【方法1】
wp_delete_user($user_id);
//退会ユーザーを削除する【方法2】
/*
$sql = $wpdb->prepare("DELETE FROM {$wpdb->prefix}users WHERE ID = %d", $user_id); //wp_users
$result = $wpdb->query($sql);
if(!$result) {
return false;
}
$sql = $wpdb->prepare("DELETE FROM {$wpdb->prefix}usermeta WHERE user_id = %d", $user_id); //wp_usermeta
$result = $wpdb->query($sql);
if(!$result) {
return false;
}
*/
//ログアウトさせる
wp_logout();
//任意のページへリダイレクト
$redirect_url = esc_url(home_url('/thanks-withdraw'));
wp_redirect($redirect_url);
exit;
}
?>
①のとおり、まずは入力内容のチェックをおこないます。
必須項目の漏れがないか、適切なユーザーからの送信かどうか、などを検証します。
上記例ではエラー時にreturn falseだけしていますが、実際にはエラー内容ごとに適切なエラーメッセージを返してあげると親切です。
検証して問題なければ②のとおり退会処理をおこないます。
おそらく、最もシンプルなユーザー退会処理はwp_delete_user関数だけ利用してユーザーを削除することでしょう。(上記コード例のうち【方法1】のみ利用)
ただし僕の場合は退会してしまうユーザーから退会理由を集めたかったので、退会情報をDBに保存する例を紹介しました。
また、wp_delete_user関数は「退会ユーザーの投稿を削除するか既存ユーザーに割り当てることしかできない」「退会ユーザーの投稿・アカウントを物理削除しかできない」などの制約があるため、もっと柔軟にデータを制御したい方のために任意のデータを選んで削除する【方法2】の処理も紹介しています。
この記事では簡単な実装例のみ記載していますが、独自に退会機能を実装すれば自サイトに必要なデータを集めたり退会ユーザーの投稿を自由に制御したり何でもできるので大変便利です。ぜひお試しください。
おわりに
以上、今回の記事ではWordPressでユーザーが自分で退会できる機能を独自に実装する方法を紹介させていただきました。
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。