feat(users): add VIP sidebar entry

This commit is contained in:
2026-08-03 22:04:27 +08:00
parent 0fb5f18c73
commit dafd0ad233
3 changed files with 60 additions and 5 deletions
@@ -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`。
---
@@ -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';
@@ -0,0 +1,54 @@
<?php
/**
* User center sidebar: VIP entry.
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
$vip_settings = is_array($vip_settings ?? null) ? $vip_settings : [];
$vip_levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : [];
$vip_enabled = !empty($vip_settings['enabled'])
&& (!empty($vip_levels[1]['enabled']) || !empty($vip_levels[2]['enabled']));
if (!$vip_enabled) {
return;
}
$user_id = (int) ($user_id ?? get_current_user_id());
$vip_level = function_exists('aksrt_get_user_vip_level') ? aksrt_get_user_vip_level($user_id) : 0;
$expired_level = (int) get_user_meta($user_id, 'aksrt_vip_level_expired', true);
$expires = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
$vip_url = aksrt_get_user_center_tab_url('vip');
$title = __('开通会员', 'aksrt');
$status = (string) ($vip_settings['desc'] ?? '');
if ($status === '') {
$status = __('尊享会员权益', 'aksrt');
}
if ($vip_level > 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');
}
?>
<a class="uc-sidebar-vip" href="<?php echo esc_url($vip_url); ?>">
<span class="uc-sidebar-vip__icon"><i class="fas fa-crown" aria-hidden="true"></i></span>
<span class="uc-sidebar-vip__content">
<strong><?php echo esc_html($title); ?></strong>
<small><?php echo esc_html($status); ?></small>
</span>
<i class="fas fa-angle-right uc-sidebar-vip__arrow" aria-hidden="true"></i>
</a>