WPで、ログイン中のユーザーが自分で退会できる「退会ボタン」を作成し、ショートコードで呼び出せるようにする。【プラグインなし・ショートコード化】

目次

記事概要

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');

マルチサイト対応-変更ポイント

  1. wp_delete_user() の部分を変更
    • 通常 wp_delete_user() は、現在のブログ(子サイト)からユーザーを削除するだけ
    • マルチサイトでは wpmu_delete_user($user_id) を使用して、ネットワーク全体から削除
  2. ネットワーク管理者のみ削除不可
    • is_super_admin($user_id) を使ってネットワーク管理者の誤削除を防ぐ

ポイント

ユーザーをネットワーク全体から削除wpmu_delete_user($user_id) を使用
管理者は削除不可is_super_admin($user_id) でチェック
ボタンはショートコードで簡単に設置可能

メモ

WPをマルチサイト化している場合、①の方法では他の子サイトや親サイトにユーザー情報が残ってしまった。
②のコード「wpmu_delete_user($user_id)」でユーザーをネットワークから完全削除すると、親サイト含むすべてのユーザー情報が削除される。

記事について

当サイトは、主に自分用の備忘録として情報をまとめています。個別の質問にはお答えできません。
紹介するコードや設定をご参考の際は、ご自身の責任においてご利用ください。編集や実行によるいかなる損害・不具合についても、当サイトは責任を負いかねます。
必ず事前にバックアップを取り、安全に作業を行ってください。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次