fix(ui): VIP equity list wrap and theme toggle moon/sun icons
This commit is contained in:
@@ -18,6 +18,72 @@ if (empty($vip_settings['enabled'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize equity HTML/plain text into a proper <ul> of <li>.
|
||||
*/
|
||||
$normalize_equity = static function (string $raw): string {
|
||||
$raw = trim($raw);
|
||||
if ($raw === '') {
|
||||
return '';
|
||||
}
|
||||
$allowed = [
|
||||
'li' => ['class' => true],
|
||||
'ul' => ['class' => true],
|
||||
'ol' => ['class' => true],
|
||||
'strong' => [],
|
||||
'b' => [],
|
||||
'em' => [],
|
||||
'i' => ['class' => true],
|
||||
'span' => ['class' => true],
|
||||
'br' => [],
|
||||
];
|
||||
$clean = wp_kses($raw, $allowed);
|
||||
|
||||
// Already has list items.
|
||||
if (preg_match('/<li[\s>]/i', $clean)) {
|
||||
// Strip wrapping ul/ol; we re-wrap.
|
||||
$inner = preg_replace('#</?(ul|ol)[^>]*>#i', '', $clean) ?? $clean;
|
||||
return '<ul class="v-equity">' . $inner . '</ul>';
|
||||
}
|
||||
|
||||
// Plain text: split by newlines / Chinese separators / commas.
|
||||
$plain = trim(wp_strip_all_tags($clean));
|
||||
if ($plain === '') {
|
||||
return '';
|
||||
}
|
||||
$parts = preg_split('/[\r\n]+|[;;,,||]+/u', $plain) ?: [];
|
||||
$items = [];
|
||||
foreach ($parts as $part) {
|
||||
$part = trim((string) $part);
|
||||
// Also split jammed Chinese phrases if still one long blob with known tokens.
|
||||
if ($part === '') {
|
||||
continue;
|
||||
}
|
||||
$items[] = $part;
|
||||
}
|
||||
|
||||
// Heuristic: if still a single long string without separators, try common benefit chunks.
|
||||
if (count($items) === 1 && mb_strlen($items[0]) > 16) {
|
||||
$blob = $items[0];
|
||||
$chunks = preg_split('/(?=(?:免费|会员|更高|专属|付费|下载|身份|权益|折扣|无限))/u', $blob, -1, PREG_SPLIT_NO_EMPTY) ?: [];
|
||||
$chunks = array_values(array_filter(array_map('trim', $chunks)));
|
||||
if (count($chunks) > 1) {
|
||||
$items = $chunks;
|
||||
}
|
||||
}
|
||||
|
||||
if ($items === []) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$html = '<ul class="v-equity">';
|
||||
foreach ($items as $item) {
|
||||
$html .= '<li>' . esc_html($item) . '</li>';
|
||||
}
|
||||
$html .= '</ul>';
|
||||
return $html;
|
||||
};
|
||||
|
||||
$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);
|
||||
@@ -36,17 +102,17 @@ 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="fa fa-clock-o mr3" aria-hidden="true"></i>' . esc_html__('永久会员', 'aksrt') . '</span>';
|
||||
$badge = '<span class="badg c-green p2-10 em09"><i class="fas fa-clock" 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="fa fa-clock-o mr3" aria-hidden="true"></i>'
|
||||
$badge = '<span class="badg c-yellow p2-10 em09"><i class="fas fa-clock" aria-hidden="true"></i> '
|
||||
. esc_html(sprintf(__('到期时间:%s', 'aksrt'), wp_date('Y年m月d日', $expires))) . '</span>';
|
||||
$btn_type = 'renew_' . $level;
|
||||
}
|
||||
$status_html = '<div class="flex xx gap6">'
|
||||
. '<div class="em16 mr10 flex ac"><i class="fas fa-crown mr6"></i><div class="font-bold ml6">' . esc_html($lv_name) . '</div></div>'
|
||||
$status_html = '<div class="uc-vip-status flex xx gap6">'
|
||||
. '<div class="em16 flex ac"><i class="fas fa-crown" aria-hidden="true"></i><span class="font-bold ml6">' . esc_html($lv_name) . '</span></div>'
|
||||
. $badge
|
||||
. ($lv_desc !== '' ? '<div class="muted-color em09">' . esc_html($lv_desc) . '</div>' : '')
|
||||
. '</div>';
|
||||
@@ -54,14 +120,14 @@ if ($level > 0) {
|
||||
$exp_label = $expires > 0
|
||||
? sprintf(__('过期时间:%s', 'aksrt'), wp_date('Y年m月d日', $expires))
|
||||
: __('已过期', 'aksrt');
|
||||
$status_html = '<div class="flex xx gap6">'
|
||||
$status_html = '<div class="uc-vip-status flex xx gap6">'
|
||||
. '<div class="font-bold c-red">' . esc_html__('会员已过期', 'aksrt') . '</div>'
|
||||
. '<div class="badg c-red em09"><i class="fa fa-clock-o mr3" aria-hidden="true"></i>' . esc_html($exp_label) . '</div>'
|
||||
. '<div class="badg c-red em09"><i class="fas fa-clock" aria-hidden="true"></i> ' . esc_html($exp_label) . '</div>'
|
||||
. ($desc_top !== '' ? '<div class="muted-color em09">' . esc_html($desc_top) . '</div>' : '')
|
||||
. '</div>';
|
||||
$btn_type = 'pay';
|
||||
} else {
|
||||
$status_html = '<div class="flex xx gap6">'
|
||||
$status_html = '<div class="uc-vip-status flex xx gap6">'
|
||||
. '<div class="font-bold">' . esc_html__('开通会员', 'aksrt') . '</div>'
|
||||
. ($desc_top !== '' ? '<div class="muted-color em09">' . esc_html($desc_top) . '</div>' : '<div class="muted-color em09">' . esc_html__('开通会员,尊享专属特权', 'aksrt') . '</div>')
|
||||
. '</div>';
|
||||
@@ -76,7 +142,14 @@ foreach ([1, 2] as $lv) {
|
||||
}
|
||||
$lv_name = (string) ($levels[$lv]['name'] ?? ('VIP' . $lv));
|
||||
$lv_desc = (string) ($levels[$lv]['desc'] ?? '');
|
||||
$equity = (string) ($levels[$lv]['equity'] ?? '');
|
||||
$equity_raw = (string) ($levels[$lv]['equity'] ?? '');
|
||||
if ($equity_raw === '') {
|
||||
// Fallback defaults when option empty / stripped.
|
||||
$equity_raw = $lv === 1
|
||||
? "免费下载部分资源\n会员专属身份标识\n付费内容会员价"
|
||||
: "更高免费下载额度\n更高等级身份标识\n更多付费内容会员价";
|
||||
}
|
||||
$equity = $normalize_equity($equity_raw);
|
||||
$cta = sprintf(__('开通%s', 'aksrt'), $lv_name);
|
||||
$vip_attr = $lv;
|
||||
if (str_starts_with($btn_type, 'renew_')) {
|
||||
@@ -101,37 +174,38 @@ foreach ([1, 2] as $lv) {
|
||||
}
|
||||
|
||||
$cards .= '<div class="zib-widget text-center pay-vip-info flex1 level-' . $lv . ' uc-vip-level-card">';
|
||||
$cards .= '<div class="abs-center vip-baicon"><i class="fa fa-diamond" aria-hidden="true"></i></div>';
|
||||
$cards .= '<div class="relative">';
|
||||
$cards .= '<div class="v-iconbox mb10 flex jc gap10"><div class="v-icon flex jc"><i class="fas fa-crown"></i></div>';
|
||||
$cards .= '<div class="abs-center 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 gap10">';
|
||||
$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>';
|
||||
if ($equity !== '') {
|
||||
$cards .= '<ul class="v-equity text-left">' . $equity . '</ul>';
|
||||
}
|
||||
$cards .= '<a class="padding-lg but jb-vip' . $lv . ' radius pay-vip" href="javascript:;" vip-level="' . (int) $vip_attr . '">'
|
||||
. esc_html($cta) . '<span class="ml10"><i class="fa fa-chevron-circle-right" aria-hidden="true"></i></span></a>';
|
||||
$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) — slim link; full shop stays optional under credits.
|
||||
// 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"><i class="fas fa-coins mr6"></i>' . esc_html__('积分兑换会员', 'aksrt') . '</div>'
|
||||
. '<a class="badg radius c-yellow pay-vip" href="javascript:;" vip-level="1">' . esc_html__('立即兑换', 'aksrt')
|
||||
. '<i class="fa fa-chevron-circle-right ml6" aria-hidden="true"></i></a></div>';
|
||||
. '<div class="flex1 em12 flex ac gap6"><i class="fas fa-coins" aria-hidden="true"></i><span>' . 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 mb15">
|
||||
<div class="vip-img abs-right opacity3"><i class="fas fa-crown em3x" aria-hidden="true"></i></div>
|
||||
<div class="flex ac gap12 flex1">
|
||||
<div class="vip-img abs-right opacity3" aria-hidden="true"><i class="fas fa-crown em3x"></i></div>
|
||||
<div class="flex ac gap12 flex1 relative">
|
||||
<div class="avatar-img"><?php echo $avatar; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div>
|
||||
<div class="flex1">
|
||||
<div class="flex1 min-w-0">
|
||||
<div class="font-bold mb3"><?php echo esc_html($display); ?></div>
|
||||
<?php echo $status_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user