feat(users): add native VIP management

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-09 18:30:54 +08:00
co-authored by Claude Fable 5
parent 1bd09dcda3
commit 703eedfba1
9 changed files with 570 additions and 1 deletions
+24
View File
@@ -10,6 +10,7 @@ defined('ABSPATH') || exit;
class UsersMenus {
use UsersMenusVerify;
use UsersMenusVip;
public const CAPABILITY = 'manage_options';
@@ -38,6 +39,7 @@ class UsersMenus {
add_action('admin_post_aksrt_users_process_appeal', [$this, 'handle_process_appeal']);
add_action('admin_post_aksrt_users_batch_invite_codes', [$this, 'handle_batch_invite_codes']);
add_action('admin_post_aksrt_users_disable_invite_code', [$this, 'handle_disable_invite_code']);
add_action('admin_post_aksrt_users_mutate_vip', [$this, 'handle_mutate_vip']);
}
public function register_menus(): void {
@@ -61,6 +63,14 @@ class UsersMenus {
'aksrt_invite_codes',
[$this, 'render_invite_codes_page']
);
add_submenu_page(
'users.php',
__('用户会员', 'aksrt'),
__('用户会员', 'aksrt'),
self::CAPABILITY,
'aksrt_user_vip',
[$this, 'render_vip_page']
);
add_submenu_page(
'users.php',
__('身份认证', 'aksrt'),
@@ -158,6 +168,9 @@ class UsersMenus {
'invite_batch_failed' => __('邀请码批量生成失败。', 'aksrt'),
'invite_disabled' => __('邀请码已禁用。', 'aksrt'),
'invite_failed' => __('邀请码操作失败。', 'aksrt'),
'vip_updated' => __('会员状态已更新。', 'aksrt'),
'vip_partial' => __('部分用户的会员状态已更新。', 'aksrt'),
'vip_failed' => __('会员操作失败。', 'aksrt'),
];
if (!isset($map[$code])) {
return;
@@ -167,6 +180,17 @@ class UsersMenus {
if ($code === 'verify_failed' && isset($_GET['aksrt_verify_error'])) {
$message = sanitize_text_field((string) wp_unslash($_GET['aksrt_verify_error']));
}
if ($code === 'vip_failed' && isset($_GET['aksrt_vip_error'])) {
$message = sanitize_text_field((string) wp_unslash($_GET['aksrt_vip_error']));
}
if (in_array($code, ['vip_updated', 'vip_partial'], true)) {
$message .= ' ' . sprintf(
__('成功:%1$d;失败:%2$d;跳过:%3$d。', 'aksrt'),
absint($_GET['aksrt_vip_ok'] ?? 0),
absint($_GET['aksrt_vip_failed_count'] ?? 0),
absint($_GET['aksrt_vip_skipped'] ?? 0)
);
}
echo '<div class="notice ' . esc_attr($class) . ' is-dismissible"><p>' . esc_html($message) . '</p></div>';
}