diff --git a/inc/helpers/aksrt-header-userbox.php b/inc/helpers/aksrt-header-userbox.php index 9b1e1cbf..9f27eab7 100644 --- a/inc/helpers/aksrt-header-userbox.php +++ b/inc/helpers/aksrt-header-userbox.php @@ -199,16 +199,18 @@ if (!function_exists('aksrt_header_payvip_bar')) : if ($level > 0) { $levels = is_array($vip['levels'] ?? null) ? $vip['levels'] : []; $name = (string) ($levels[$level]['name'] ?? ($level === 2 ? __('二级会员', 'aksrt') : __('一级会员', 'aksrt'))); + // 到期徽章语义对齐参考主题 zib_get_user_vip_exp_date_text():只有真的拿到 + // 到期时间才渲染这枚徽章,已过期显示「会员已过期」否则显示裸日期;显式永久 + // 会员显示「永久会员」;拿不到到期数据时参考主题返回 false,整枚徽章不渲染。 $exp_label = ''; - if (function_exists('aksrt_get_vip_info')) { - $info = aksrt_get_vip_info($user_id); - $expires = max(0, (int) ($info['expires'] ?? 0)); - // 到期文案对齐参考主题:已过期 / 永久会员 / 裸日期。 - if ((string) ($info['state'] ?? '') === 'expired') { - $exp_label = __('会员已过期', 'aksrt'); - } elseif ($expires > 0) { - $exp_label = wp_date('Y年m月d日', $expires); - } else { + if (function_exists('aksrt_get_user_vip_state')) { + $state = aksrt_get_user_vip_state($user_id); + $expires = max(0, (int) ($state['expires'] ?? 0)); + if ($expires > 0) { + $exp_label = $expires <= time() + ? __('会员已过期', 'aksrt') + : wp_date('Y年m月d日', $expires); + } elseif (!empty($state['is_permanent'])) { $exp_label = __('永久会员', 'aksrt'); } } diff --git a/tests/widget-system/page-display-contract.test.cjs b/tests/widget-system/page-display-contract.test.cjs index fbfecdd5..10dc6076 100644 --- a/tests/widget-system/page-display-contract.test.cjs +++ b/tests/widget-system/page-display-contract.test.cjs @@ -382,6 +382,12 @@ test('header user-card membership stays on one row with a date-only expiry', () // The CTA wrapper is the reference padding wrapper, not a bespoke hook. assert.match(headerUserbox, /'