From dafd0ad23323a0df3f4a5fb9a14b43031a234632 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 3 Aug 2026 22:04:27 +0800 Subject: [PATCH] feat(users): add VIP sidebar entry --- .specs/plans/user-center-sidebar-vip-entry.md | 10 ++-- .../user-center-renderers/profile-sidebar.php | 1 + .../user-center-renderers/sidebar-vip.php | 54 +++++++++++++++++++ 3 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 inc/helpers/user-center-renderers/sidebar-vip.php diff --git a/.specs/plans/user-center-sidebar-vip-entry.md b/.specs/plans/user-center-sidebar-vip-entry.md index 8121e74e..669fad64 100644 --- a/.specs/plans/user-center-sidebar-vip-entry.md +++ b/.specs/plans/user-center-sidebar-vip-entry.md @@ -23,11 +23,11 @@ Durable decisions that apply across all phases: ### Done when -- [ ] `inc/helpers/user-center-renderers/profile-sidebar.php` 在 `sidebar-stats.php` 后、`sidebar-commerce.php` 前加载独立的侧栏 VIP 入口渲染器。 -- [ ] 新的侧栏 VIP 入口渲染器复用现有 VIP 配置、会员等级、过期等级和到期状态,并在没有启用任何 VIP 等级时不输出 HTML。 -- [ ] [agent:test-auditor] 人工检查渲染器的四种服务端输出:未开通显示权益引导;有效会员显示等级和既有状态文案;过期会员显示过期状态;VIP 未启用时无入口,并确认未引入新的精确日期格式。 -- [ ] 新入口的完整可点击区域使用 `aksrt_get_user_center_tab_url('vip')` 生成目标地址,人工检查所得 URL 可进入 `tab=vip`。 -- [ ] 运行 `php tools/audit-admin-contracts.php`,命令退出码为 0 且报告为 `errors=0`。 +- [x] `inc/helpers/user-center-renderers/profile-sidebar.php` 在 `sidebar-stats.php` 后、`sidebar-commerce.php` 前加载独立的侧栏 VIP 入口渲染器。 +- [x] 新的侧栏 VIP 入口渲染器复用现有 VIP 配置、会员等级、过期等级和到期状态,并在没有启用任何 VIP 等级时不输出 HTML。 +- [x] [agent:test-auditor] 人工检查渲染器的四种服务端输出:未开通显示权益引导;有效会员显示等级和既有状态文案;过期会员显示过期状态;VIP 未启用时无入口,并确认未引入新的精确日期格式。 +- [x] 新入口的完整可点击区域使用 `aksrt_get_user_center_tab_url('vip')` 生成目标地址,人工检查所得 URL 可进入 `tab=vip`。 +- [x] 运行 `php tools/audit-admin-contracts.php`,命令退出码为 0 且报告为 `errors=0`。 --- diff --git a/inc/helpers/user-center-renderers/profile-sidebar.php b/inc/helpers/user-center-renderers/profile-sidebar.php index 4943137b..d7fdfad7 100644 --- a/inc/helpers/user-center-renderers/profile-sidebar.php +++ b/inc/helpers/user-center-renderers/profile-sidebar.php @@ -11,6 +11,7 @@ $context = is_array($args['context'] ?? null) ? $args['context'] : []; extract($context, EXTR_SKIP); // phpcs:ignore WordPress.PHP.DontExtract.extract_extract require __DIR__ . '/sidebar-stats.php'; +require __DIR__ . '/sidebar-vip.php'; require __DIR__ . '/sidebar-commerce.php'; require __DIR__ . '/sidebar-creator.php'; require __DIR__ . '/sidebar-nav.php'; diff --git a/inc/helpers/user-center-renderers/sidebar-vip.php b/inc/helpers/user-center-renderers/sidebar-vip.php new file mode 100644 index 00000000..e4b4e436 --- /dev/null +++ b/inc/helpers/user-center-renderers/sidebar-vip.php @@ -0,0 +1,54 @@ + 0) { + $title = (string) ($vip_levels[$vip_level]['name'] ?? ('VIP' . $vip_level)); + if ($expires <= 0) { + $status = __('永久会员', 'aksrt'); + } else { + $remaining_days = max(1, (int) ceil(($expires - time()) / DAY_IN_SECONDS)); + $status = sprintf( + /* translators: %d: remaining membership days */ + __('还有 %d 天到期', 'aksrt'), + $remaining_days + ); + } +} elseif ($expired_level > 0) { + $title = (string) ($vip_levels[$expired_level]['name'] ?? ('VIP' . $expired_level)); + $status = __('已过期', 'aksrt'); +} +?> + + + + + + + +