Files
wordpress-theme-aksrt/inc/helpers/aksrt-vip.php
T

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 . '会员') : '普通用户',
];
}