99 lines
2.8 KiB
PHP
99 lines
2.8 KiB
PHP
<?php
|
|
/**
|
|
* AKSRT VIP Helper — VIP 会员展示辅助函数
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
/**
|
|
* 检查用户是否为 VIP
|
|
*
|
|
* 判定逻辑:
|
|
* 1. VIP 功能未启用 → false
|
|
* 2. 用户角色在 exempt_roles 白名单中 → true(管理员/编辑等特权角色)
|
|
* 3. 用户有有效的 VIP 订单(status=completed 且未过期) → true
|
|
*
|
|
* @param int $user_id
|
|
* @return bool
|
|
*/
|
|
function aksrt_is_vip(int $user_id = 0): bool {
|
|
if ($user_id <= 0) $user_id = get_current_user_id();
|
|
if ($user_id <= 0) return false;
|
|
|
|
if (!class_exists('AKSRT_Settings')) return false;
|
|
|
|
$vip_settings = AKSRT_Settings::get_payment_vip_settings();
|
|
if (empty($vip_settings['enabled'])) return false;
|
|
|
|
// 1. 角色豁免:VIP exempt_roles 中的角色直接视为 VIP
|
|
$paid_settings = AKSRT_Settings::get_paid_content_settings();
|
|
$exempt_roles = $paid_settings['vip_exempt_roles'] ?? [];
|
|
if (!empty($exempt_roles)) {
|
|
$user = get_userdata($user_id);
|
|
if ($user && !empty(array_intersect($user->roles, $exempt_roles))) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// 2. 订单判定:检查是否有有效的 VIP 订单
|
|
if (class_exists('AKSRT_Order')) {
|
|
$order_mgr = AKSRT_Order::get_instance();
|
|
$valid_order = method_exists($order_mgr, 'get_valid_vip_order')
|
|
? $order_mgr->get_valid_vip_order($user_id)
|
|
: null;
|
|
if ($valid_order) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 获取 VIP 徽标文本
|
|
*
|
|
* @return string
|
|
*/
|
|
function aksrt_get_vip_badge_text(): string {
|
|
if (!class_exists('AKSRT_Settings')) return 'VIP';
|
|
|
|
$vip_settings = AKSRT_Settings::get_payment_vip_settings();
|
|
return sanitize_text_field($vip_settings['badge_text'] ?? 'VIP');
|
|
}
|
|
|
|
/**
|
|
* 渲染 VIP 徽标 HTML
|
|
*
|
|
* @param int $user_id
|
|
* @param string $size sm | md | lg
|
|
* @return string
|
|
*/
|
|
function aksrt_render_vip_badge(int $user_id = 0, string $size = 'sm'): string {
|
|
if (!aksrt_is_vip($user_id)) return '';
|
|
|
|
$badge_text = aksrt_get_vip_badge_text();
|
|
$size_class = 'aksrt-vip-badge--' . $size;
|
|
|
|
return '<span class="aksrt-vip-badge aksrt-vip-badge--gold ' . esc_attr($size_class) . '"><i class="fas fa-crown"></i> ' . esc_html($badge_text) . '</span>';
|
|
}
|
|
|
|
/**
|
|
* 获取用户 VIP 等级信息(用于展示)
|
|
*
|
|
* @param int $user_id
|
|
* @return array{is_vip: bool, badge_text: string, badge_html: string, name: string}
|
|
*/
|
|
function aksrt_get_vip_info(int $user_id = 0): array {
|
|
$is_vip = aksrt_is_vip($user_id);
|
|
$badge_text = aksrt_get_vip_badge_text();
|
|
|
|
return [
|
|
'is_vip' => $is_vip,
|
|
'badge_text' => $badge_text,
|
|
'badge_html' => $is_vip ? aksrt_render_vip_badge($user_id) : '',
|
|
'name' => $is_vip ? ($badge_text . '会员') : '普通用户',
|
|
];
|
|
}
|