子比主题美化——给用户中心添加一个自助注销功能按钮

子比主题美化——给用户中心添加一个自助注销功能按钮

功能简介

该功能用于在子比主题「用户中心」中新增一个「自助注销」入口,让普通用户可以自行申请并完成账号注销。

功能不需要修改子比主题源码,也不需要制作插件,直接将 PHP 代码放入子主题 ‘functions.php’ 或自定义加载的 ‘func.php’ 文件即可。

功能效果

启用后,用户中心会新增:
– 「自助注销」Tab 页面
– 用户中心侧栏「功能设置」里的「自助注销」按钮
– 注销确认表单
– 当前登录密码校验
– 确认文字校验
– 风险确认勾选

用户提交后,系统会删除当前登录账号,并将该用户已发布的文章、页面等内容转移给站点管理员。

预览图

图片[1]-子比主题美化——给用户中心添加一个自助注销功能按钮-博客吧

 

// 子比用户中心:用户自助注销账号
add_filter('user_ctnter_main_tabs_array', 'meirl_add_account_cancel_tab', 30);
add_filter('zib_user_center_page_sidebar_button_2_args', 'meirl_add_account_cancel_sidebar_button', 30);
add_filter('main_user_tab_content_cancel', 'meirl_account_cancel_tab_content');
add_action('admin_post_meirl_account_cancel', 'meirl_handle_account_cancel');

function meirl_add_account_cancel_tab($tabs_array)
{
    $tabs_array['cancel'] = array(
        'title'         => '自助注销',
        'nav_attr'      => 'drawer-title="自助注销"',
        'content_class' => 'author-user-con',
        'loader'        => '<div class="zib-widget"><div class="box-body"><div class="placeholder k1 mb10"></div><div class="placeholder t1"></div></div></div>',
    );

    return $tabs_array;
}

function meirl_add_account_cancel_sidebar_button($buttons)
{
    $buttons[] = array(
        'html' => '',
        'icon' => function_exists('zib_get_svg') ? zib_get_svg('security-color') : '<i class="fa fa-user-times c-red"></i>',
        'name' => '自助注销',
        'tab'  => 'cancel',
    );

    return $buttons;
}

function meirl_account_cancel_tab_content()
{
    $user_id = get_current_user_id();
    if (!$user_id) {
        return '';
    }

    if (current_user_can('manage_options')) {
        $html = '<div class="zib-widget"><div class="box-body">';
        $html .= '<div class="title-h-left"><b>账号注销</b></div>';
        $html .= '<div class="muted-box c-red">管理员账号默认不允许自助注销,避免站点失去管理权限。</div>';
        $html .= '</div></div>';

        return function_exists('zib_get_ajax_ajaxpager_one_centent') ? zib_get_ajax_ajaxpager_one_centent($html) : $html;
    }

    $error = isset($_GET['cancel_error']) ? sanitize_key($_GET['cancel_error']) : '';

    $errors = array(
        'nonce'    => '安全验证失败,请刷新页面后重试。',
        'password' => '当前登录密码不正确。',
        'confirm'  => '请勾选确认项,并输入“确认注销”。',
        'admin'    => '未找到可接收内容的管理员账号,无法注销。',
        'failed'   => '账号删除失败,请联系站点管理员。',
    );

    $user = wp_get_current_user();

    $html  = '<div class="zib-widget meirl-account-cancel"><div class="box-body">';
    $html .= '<div class="title-h-left"><b>账号注销</b></div>';
    $html .= '<div class="muted-2-color mb20">注销后账号将被删除,已发布文章会转移给站点管理员。此操作不可恢复,请谨慎操作。</div>';

    if ($error && isset($errors[$error])) {
        $html .= '<div class="muted-box c-red mb20">' . esc_html($errors[$error]) . '</div>';
    }

    $html .= '<div class="muted-box mb20">';
    $html .= '<p class="c-red"><b>注销前请确认</b></p>';
    $html .= '<p>注销会删除你的登录账号、个人资料和用户元数据。</p>';
    $html .= '<p>订单、余额、积分、会员、分成等记录请先自行核对,必要时联系站长处理。</p>';
    $html .= '</div>';

    $html .= '<form method="post" action="' . esc_url(admin_url('admin-post.php')) . '">';
    $html .= '<input type="hidden" name="action" value="meirl_account_cancel">';
    $html .= wp_nonce_field('meirl_account_cancel_' . $user_id, '_meirl_cancel_nonce', true, false);

    $html .= '<p><label>当前账号</label><input class="form-control" type="text" value="' . esc_attr($user->user_login) . '" disabled></p>';
    $html .= '<p><label>当前登录密码</label><input class="form-control" type="password" name="current_password" required></p>';
    $html .= '<p><label>输入确认文字</label><input class="form-control" type="text" name="confirm_text" placeholder="请输入:确认注销" required></p>';
    $html .= '<p><label><input type="checkbox" name="understand" value="1" required> 我已了解注销后账号不可恢复,并确认继续注销。</label></p>';
    $html .= '<button class="but c-red btn-block" type="submit" onclick="return confirm(\'确定要注销当前账号吗?此操作不可恢复。\');">确认注销账号</button>';
    $html .= '</form>';

    $html .= '</div></div>';

    return function_exists('zib_get_ajax_ajaxpager_one_centent') ? zib_get_ajax_ajaxpager_one_centent($html) : $html;
}

function meirl_handle_account_cancel()
{
    $user_id = get_current_user_id();

    if (!$user_id) {
        wp_safe_redirect(wp_login_url());
        exit;
    }

    $redirect = function_exists('zib_get_user_center_url') ? zib_get_user_center_url('cancel') : home_url('/');

    if (
        empty($_POST['_meirl_cancel_nonce']) ||
        !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['_meirl_cancel_nonce'])), 'meirl_account_cancel_' . $user_id)
    ) {
        wp_safe_redirect(add_query_arg('cancel_error', 'nonce', $redirect));
        exit;
    }

    if (current_user_can('manage_options')) {
        wp_safe_redirect(add_query_arg('cancel_error', 'confirm', $redirect));
        exit;
    }

    $user = get_user_by('id', $user_id);
    $password = isset($_POST['current_password']) ? (string) wp_unslash($_POST['current_password']) : '';
    $confirm_text = isset($_POST['confirm_text']) ? trim((string) wp_unslash($_POST['confirm_text'])) : '';
    $understand = !empty($_POST['understand']);

    if (!$user || !wp_check_password($password, $user->user_pass, $user_id)) {
        wp_safe_redirect(add_query_arg('cancel_error', 'password', $redirect));
        exit;
    }

    if ('确认注销' !== $confirm_text || !$understand) {
        wp_safe_redirect(add_query_arg('cancel_error', 'confirm', $redirect));
        exit;
    }

    $admins = get_users(array(
        'role__in' => array('administrator'),
        'exclude'  => array($user_id),
        'number'   => 1,
        'fields'   => 'ID',
    ));

    $reassign_user_id = !empty($admins[0]) ? (int) $admins[0] : 0;

    if (!$reassign_user_id) {
        wp_safe_redirect(add_query_arg('cancel_error', 'admin', $redirect));
        exit;
    }

    require_once ABSPATH . 'wp-admin/includes/user.php';

    $deleted = wp_delete_user($user_id, $reassign_user_id);

    if (!$deleted) {
        wp_safe_redirect(add_query_arg('cancel_error', 'failed', $redirect));
        exit;
    }

    wp_clear_auth_cookie();
    wp_set_current_user(0);

    wp_safe_redirect(home_url('/?account_cancelled=1'));
    exit;
}

以上代码版放在主题根目录下的func文件里,没有请先自行创建文件。

温馨提示:本文最后更新于2026-10-02 10:30:48,某些文章具有时效性,若有错误或网盘失效,请在下方留言或联系站长。
本站代码模板仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
部分内容来自于网络 如有不妥联系站长删除
查看更多心仪的内容 按Ctrl+D收藏我们
二七博客吧欢迎大家前来投稿

笔墨有情,赞赏留香 您的支持是我们创作的最大动力
文章评分
平均评分
5.0
点击星星,为文章评分
期待你的评分
共1位网友评分
1人
0人
0人
0人
0人
© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容