200 lines
8.2 KiB
PHP
200 lines
8.2 KiB
PHP
<?php
|
|
/**
|
|
* User center VIP tab (zibll 我的会员 1:1 structure).
|
|
*
|
|
* Expects extracted $context vars via profile-vip.php / capture path.
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
$vip_settings = is_array($vip_settings ?? null) ? $vip_settings : [];
|
|
if (empty($vip_settings['enabled']) && class_exists('\AKSRT\Settings\Settings')) {
|
|
$vip_settings = \AKSRT\Settings\Settings::get_payment_vip_settings();
|
|
}
|
|
if (empty($vip_settings['enabled'])) {
|
|
echo '<div class="zib-widget padding-20 muted-2-color">' . esc_html__('会员功能未启用。', 'aksrt') . '</div>';
|
|
return;
|
|
}
|
|
|
|
$user_id = (int) ($user_id ?? get_current_user_id());
|
|
$level = function_exists('aksrt_get_user_vip_level') ? aksrt_get_user_vip_level($user_id) : 0;
|
|
$expires = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
|
|
$expired_level = (int) get_user_meta($user_id, 'aksrt_vip_level_expired', true);
|
|
$levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : [];
|
|
$desc_top = (string) ($vip_settings['desc'] ?? '');
|
|
|
|
$user = get_userdata($user_id);
|
|
$display = $user ? $user->display_name : '';
|
|
$user_bio = $user ? trim((string) $user->description) : '';
|
|
if ($user_bio === '') {
|
|
$user_bio = __('这家伙很懒,什么都没有写…', 'aksrt');
|
|
}
|
|
|
|
// Avatar: zibll avatar-img avatar-md (55px fixed box).
|
|
$avatar = get_avatar($user_id, 110, '', $display, ['class' => 'avatar']);
|
|
|
|
// Name row with identity chips (zibll zib_get_user_name parity).
|
|
$name_html = '';
|
|
if (function_exists('aksrt_get_user_name')) {
|
|
$name_html = aksrt_get_user_name([
|
|
'id' => $user_id,
|
|
'class' => 'flex1 flex ac',
|
|
'vip' => true,
|
|
'follow' => false,
|
|
]);
|
|
}
|
|
if ($name_html === '') {
|
|
$name_html = esc_html($display);
|
|
if (function_exists('aksrt_render_user_identity_chips')) {
|
|
$name_html .= aksrt_render_user_identity_chips($user_id, 'card');
|
|
}
|
|
}
|
|
|
|
// Status column (zibll my_vip_box).
|
|
$status_html = '';
|
|
$btn_type = 'pay';
|
|
if ($level > 0) {
|
|
$lv_name = (string) ($levels[$level]['name'] ?? ('VIP' . $level));
|
|
$lv_desc = (string) ($levels[$level]['desc'] ?? '');
|
|
if ($expires <= 0) {
|
|
$badge = '<span class="badg c-green p2-10 em09"><i class="fas fa-clock mr3" aria-hidden="true"></i>' . esc_html__('永久会员', 'aksrt') . '</span>';
|
|
if ($level < 2) {
|
|
$btn_type = 'upgrade';
|
|
}
|
|
} else {
|
|
$badge = '<span class="badg c-yellow p2-10 em09"><i class="fas fa-clock mr3" aria-hidden="true"></i>'
|
|
. esc_html(sprintf(__('到期时间:%s', 'aksrt'), wp_date('Y年m月d日', $expires))) . '</span>';
|
|
$btn_type = 'renew_' . $level;
|
|
}
|
|
$status_html = '<div class="uc-vip-status flex xx gap6">'
|
|
. '<div class="em09 muted-2-color">' . esc_html__('我的会员', 'aksrt') . '</div>'
|
|
. '<div class="flex ac">'
|
|
. '<div class="em16 mr10 flex ac"><i class="fas fa-crown" aria-hidden="true"></i><div class="font-bold ml6">' . esc_html($lv_name) . '</div></div>'
|
|
. $badge
|
|
. '</div>'
|
|
. '<div class="muted-color em09">' . esc_html($lv_desc !== '' ? $lv_desc : __('尊享专属特权', 'aksrt')) . '</div>'
|
|
. '</div>';
|
|
} elseif ($expired_level > 0) {
|
|
$exp_label = $expires > 0
|
|
? sprintf(__('过期时间:%s', 'aksrt'), wp_date('Y年m月d日', $expires))
|
|
: __('已过期', 'aksrt');
|
|
$status_html = '<div class="uc-vip-status flex xx gap6">'
|
|
. '<div class="em09 muted-2-color">' . esc_html__('当前会员状态', 'aksrt') . '</div>'
|
|
. '<div class="flex ac">'
|
|
. '<div class="em16 c-red mr10">' . esc_html__('已过期', 'aksrt') . '</div>'
|
|
. '<div class="badg c-red em09"><i class="fas fa-clock mr3" aria-hidden="true"></i>' . esc_html($exp_label) . '</div>'
|
|
. '</div>'
|
|
. ($desc_top !== '' ? '<div class="muted-color em09">' . esc_html($desc_top) . '</div>' : '')
|
|
. '</div>';
|
|
$btn_type = 'pay';
|
|
} else {
|
|
// Never opened VIP — zibll: 当前会员状态 / 未开通会员 / desc.
|
|
$status_html = '<div class="uc-vip-status flex xx gap6">'
|
|
. '<div class="em09 muted-2-color">' . esc_html__('当前会员状态', 'aksrt') . '</div>'
|
|
. '<div class="flex ac">'
|
|
. '<div class="em16 c-red mr10">' . esc_html__('未开通会员', 'aksrt') . '</div>'
|
|
. '</div>'
|
|
. '<div class="muted-color em09">' . esc_html($desc_top !== '' ? $desc_top : __('开通会员,尊享专属特权', 'aksrt')) . '</div>'
|
|
. '</div>';
|
|
$btn_type = 'pay';
|
|
}
|
|
|
|
// Left user box (zibll user_box).
|
|
$user_box = '<div class="flex ac uc-vip-userbox">'
|
|
. '<div class="mr20 shrink0"><div class="avatar-img avatar-md">' . $avatar . '</div></div>'
|
|
. '<div class="flex1 min-w-0">'
|
|
. '<div class="name em12 font-bold">' . $name_html . '</div>'
|
|
. '<div class="desc em09 mt6 muted-2-color text-ellipsis">' . esc_html($user_bio) . '</div>'
|
|
. '</div>'
|
|
. '</div>';
|
|
|
|
// Level cards.
|
|
$cards = '';
|
|
foreach ([1, 2] as $lv) {
|
|
if (empty($levels[$lv]['enabled'])) {
|
|
continue;
|
|
}
|
|
$lv_name = (string) ($levels[$lv]['name'] ?? ('VIP' . $lv));
|
|
$lv_desc = (string) ($levels[$lv]['desc'] ?? '');
|
|
// Preserve admin equity HTML as-is (sanitize/wrap only; never re-split into items).
|
|
$equity_raw = (string) ($levels[$lv]['equity'] ?? '');
|
|
$equity = function_exists('aksrt_format_vip_equity_html')
|
|
? aksrt_format_vip_equity_html($equity_raw)
|
|
: '';
|
|
$cta = sprintf(__('开通%s', 'aksrt'), $lv_name);
|
|
$vip_attr = $lv;
|
|
if (str_starts_with($btn_type, 'renew_')) {
|
|
$renew_lv = (int) substr($btn_type, 6);
|
|
if ($lv === $renew_lv) {
|
|
$cta = sprintf(__('续费%s', 'aksrt'), $lv_name);
|
|
} elseif ($lv > $renew_lv) {
|
|
$cta = sprintf(__('升级%s', 'aksrt'), $lv_name);
|
|
} else {
|
|
continue;
|
|
}
|
|
} elseif ($btn_type === 'upgrade') {
|
|
if ($lv <= $level) {
|
|
continue;
|
|
}
|
|
$cta = sprintf(__('升级%s', 'aksrt'), $lv_name);
|
|
$vip_attr = 2;
|
|
} elseif ($level > 0 && $lv < $level) {
|
|
continue;
|
|
} elseif ($level > 0 && $lv === $level) {
|
|
$cta = sprintf(__('续费%s', 'aksrt'), $lv_name);
|
|
}
|
|
|
|
$cards .= '<div class="zib-widget text-center pay-vip-info flex1 level-' . $lv . ' uc-vip-level-card">';
|
|
// Decorative gem: do NOT use .abs-center (that utility is full-width header/search placement).
|
|
$cards .= '<div class="vip-baicon" aria-hidden="true"><i class="fas fa-gem"></i></div>';
|
|
$cards .= '<div class="relative uc-vip-level-card__inner">';
|
|
$cards .= '<div class="v-iconbox mb10 flex jc ac">';
|
|
$cards .= '<div class="v-icon flex jc ac"><i class="fas fa-crown" aria-hidden="true"></i></div>';
|
|
$cards .= '<div class="v-info text-left"><div class="v-name font-bold">' . esc_html($lv_name) . '</div>';
|
|
if ($lv_desc !== '') {
|
|
$cards .= '<div class="v-desc em09 muted-2-color">' . esc_html($lv_desc) . '</div>';
|
|
}
|
|
$cards .= '</div></div>';
|
|
$cards .= $equity;
|
|
$cards .= '<a class="padding-lg but jb-vip' . $lv . ' radius pay-vip uc-vip-cta" href="javascript:;" vip-level="' . (int) $vip_attr . '">'
|
|
. '<span>' . esc_html($cta) . '</span>'
|
|
. ' <i class="fas fa-chevron-circle-right" aria-hidden="true"></i></a>';
|
|
$cards .= '</div></div>';
|
|
}
|
|
|
|
// Points exchange (non-VIP only).
|
|
$points_html = '';
|
|
if ($level <= 0 && !empty($vip_settings['points_exchange']['enabled'])) {
|
|
$points_html = '<div class="c-yellow zib-widget flex ac jsb uc-vip-points-link mt10">'
|
|
. '<div class="flex1 em12 flex ac"><i class="fas fa-coins" aria-hidden="true"></i><span class="ml6">' . esc_html__('积分兑换会员', 'aksrt') . '</span></div>'
|
|
. '<a class="badg radius c-yellow pay-vip" href="javascript:;" vip-level="1">'
|
|
. esc_html__('立即兑换', 'aksrt')
|
|
. ' <i class="fas fa-chevron-circle-right" aria-hidden="true"></i></a></div>';
|
|
}
|
|
?>
|
|
<div class="uc-vip-tab" data-aksrt-vip-tab>
|
|
<div class="zib-widget flex ac gap20 user-content-myvip overflow-hidden">
|
|
<div class="vip-img abs-right" aria-hidden="true"><i class="fas fa-crown"></i></div>
|
|
<div class="flex2 hide-sm uc-vip-profile">
|
|
<?php echo $user_box; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
|
</div>
|
|
<div class="flex4 uc-vip-state">
|
|
<?php echo $status_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="uc-vip-level-cards">
|
|
<?php echo $cards; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
|
</div>
|
|
|
|
<?php echo $points_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
|
|
|
<?php if (!empty($vip_settings['more'])) : ?>
|
|
<div class="muted-2-color em09 muted-box padding-10 mini-radius mt15">
|
|
<?php echo $vip_settings['more']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|