目次
記事概要
WordPressで、ログイン中の「購読者」が自分で退会(アカウント削除)できるボタンを作成し、ショートコードで呼び出せるようにする。
やりたいこと
ログイン済みのユーザー(購読者)が、自分で退会(アカウント削除)できるボタンを作りたい。
ダッシュボードの「ユーザー削除」を経由せずに退会できるようにする。
ショートコードで呼び出し、好きな場所に「退会ボタン」を表示したい。(固定ページなど。)
①退会ボタンを作る-サンプルコード(functions.php に追加)
マルチサイト化していない場合↓
// ユーザー退会処理
function handle_user_deletion() {
if (!is_user_logged_in()) {
wp_send_json_error(['message' => 'ログインが必要です']);
wp_die();
}
$user_id = get_current_user_id();
$user = get_userdata($user_id);
// 役割(role)が「購読者」のみ削除許可
if (!in_array('subscriber', $user->roles)) {
wp_send_json_error(['message' => '購読者のみアカウント削除が可能です']);
wp_die();
}
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
wp_send_json_success(['message' => 'アカウントを削除しました']);
wp_die();
}
add_action('wp_ajax_delete_user_account', 'handle_user_deletion');
add_action('wp_ajax_nopriv_delete_user_account', 'handle_user_deletion'); // 未ログイン対策
// 退会ボタンのショートコード
function delete_account_button_shortcode() {
if (!is_user_logged_in()) {
return '<p>ログインが必要です。</p>';
}
ob_start();
?>
<button id="delete-account-button" style="color: red;">退会する</button>
<script>
document.addEventListener("DOMContentLoaded", function () {
document.getElementById("delete-account-button").addEventListener("click", function () {
if (!confirm("本当にアカウントを削除しますか?この操作は元に戻せません。")) {
return;
}
fetch('<?php echo admin_url("admin-ajax.php"); ?>', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
action: 'delete_user_account'
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert(data.data.message);
window.location.href = '<?php echo home_url(); ?>';
} else {
alert(data.data.message);
}
})
.catch(error => console.error('エラー:', error));
});
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('delete_account_button', 'delete_account_button_shortcode');
ショートコードの使い方・ボタンの表示方法
記事や固定ページに以下のショートコードを挿入すると、退会ボタンが表示されます。
[delete_account_button]
実装のポイント
- ログインチェック → ログインしていない場合は削除不可
- 権限チェック → 購読者
subscriber
のみ削除可能 (用途によって変更可) - 確認アラート → 削除前に確認ダイアログ表示
- 非同期処理(AJAX) → ページをリロードせずに削除可能
- 削除後のリダイレクト → 削除完了後、トップページへ移動
注意点
上記のコードでは、ユーザー権限が購読者(subscriber)は 自己削除 できますが、管理者や他のユーザーは削除できません。必要に応じてカスタムしてください。
また、マルチサイト化されたWPを運営中の場合は、処理が異なるので下記を参考にしてください。
マルチサイトでWPを運営している場合
// ユーザー退会処理(マルチサイト対応)
function handle_multisite_user_deletion() {
if (!is_user_logged_in()) {
wp_send_json_error(['message' => 'ログインが必要です']);
wp_die();
}
$user_id = get_current_user_id();
$user = get_userdata($user_id);
// ネットワーク管理者(Super Admin)は削除不可
if (is_super_admin($user_id)) {
wp_send_json_error(['message' => '管理者は削除できません']);
wp_die();
}
require_once ABSPATH . 'wp-admin/includes/user.php';
if (is_multisite()) {
// マルチサイト環境の場合、ネットワーク全体から削除
wpmu_delete_user($user_id);
} else {
// 通常のWordPress環境の場合、ユーザー削除
wp_delete_user($user_id);
}
wp_send_json_success(['message' => 'アカウントを完全に削除しました']);
wp_die();
}
add_action('wp_ajax_delete_user_account', 'handle_multisite_user_deletion');
add_action('wp_ajax_nopriv_delete_user_account', 'handle_multisite_user_deletion');
// 退会ボタンのショートコード
function delete_multisite_account_button_shortcode() {
if (!is_user_logged_in()) {
return '<p>ログインが必要です。</p>';
}
ob_start();
?>
<button id="delete-account-button" style="color: red;">退会する</button>
<script>
document.addEventListener("DOMContentLoaded", function () {
document.getElementById("delete-account-button").addEventListener("click", function () {
if (!confirm("本当にアカウントを削除しますか?この操作は元に戻せません。")) {
return;
}
fetch('<?php echo admin_url("admin-ajax.php"); ?>', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
action: 'delete_user_account'
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert(data.data.message);
window.location.href = '<?php echo home_url(); ?>';
} else {
alert(data.data.message);
}
})
.catch(error => console.error('エラー:', error));
});
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('delete_account_button', 'delete_multisite_account_button_shortcode');
②退会ボタン・マルチサイト対応(functions.php に追加)
マルチサイト環境のWPで、ユーザーをネットワーク全体(親・子サイトすべて)から完全に削除 するコード。
// ユーザー退会処理(マルチサイト対応)
function handle_multisite_user_deletion() {
if (!is_user_logged_in()) {
wp_send_json_error(['message' => 'ログインが必要です']);
wp_die();
}
$user_id = get_current_user_id();
$user = get_userdata($user_id);
// ネットワーク管理者(Super Admin)は削除不可
if (is_super_admin($user_id)) {
wp_send_json_error(['message' => '管理者は削除できません']);
wp_die();
}
require_once ABSPATH . 'wp-admin/includes/user.php';
if (is_multisite()) {
// マルチサイト環境の場合、ネットワーク全体から削除
wpmu_delete_user($user_id);
} else {
// 通常のWordPress環境の場合、ユーザー削除
wp_delete_user($user_id);
}
wp_send_json_success(['message' => 'アカウントを完全に削除しました']);
wp_die();
}
add_action('wp_ajax_delete_user_account', 'handle_multisite_user_deletion');
add_action('wp_ajax_nopriv_delete_user_account', 'handle_multisite_user_deletion');
// 退会ボタンのショートコード
function delete_multisite_account_button_shortcode() {
if (!is_user_logged_in()) {
return '<p>ログインが必要です。</p>';
}
ob_start();
?>
<button id="delete-account-button" style="color: red;">退会する</button>
<script>
document.addEventListener("DOMContentLoaded", function () {
document.getElementById("delete-account-button").addEventListener("click", function () {
if (!confirm("本当にアカウントを削除しますか?この操作は元に戻せません。")) {
return;
}
fetch('<?php echo admin_url("admin-ajax.php"); ?>', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
action: 'delete_user_account'
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert(data.data.message);
window.location.href = '<?php echo home_url(); ?>';
} else {
alert(data.data.message);
}
})
.catch(error => console.error('エラー:', error));
});
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('delete_account_button', 'delete_multisite_account_button_shortcode');
マルチサイト対応-変更ポイント
wp_delete_user()
の部分を変更- 通常
wp_delete_user()
は、現在のブログ(子サイト)からユーザーを削除するだけ - マルチサイトでは
wpmu_delete_user($user_id)
を使用して、ネットワーク全体から削除
- 通常
- ネットワーク管理者のみ削除不可
is_super_admin($user_id)
を使ってネットワーク管理者の誤削除を防ぐ
ポイント
ユーザーをネットワーク全体から削除 → wpmu_delete_user($user_id)
を使用
管理者は削除不可 → is_super_admin($user_id)
でチェック
ボタンはショートコードで簡単に設置可能
メモ
WPをマルチサイト化している場合、①の方法では他の子サイトや親サイトにユーザー情報が残ってしまった。
②のコード「wpmu_delete_user($user_id)」でユーザーをネットワークから完全削除すると、親サイト含むすべてのユーザー情報が削除される。
コメント