Files
wordpress-theme-aksrt/inc/helpers/aksrt-vip.php
T
kate522andClaude Fable 5 4862142fb6 feat(payment): VIP 作者分成档位 + get_user_vip_level
实现 aksrt_get_user_vip_level(0/1/2) 与 aksrt_is_vip2,统一 aksrt_is_vip;
Creator_Revenue 现有 resolve_share_ratio 按 VIP1/VIP2 比例生效。
赠送 vip_days 时补写 aksrt_vip_level≥1,不降级 VIP2。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 13:45:24 +08:00

189 lines
5.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* AKSRT VIP Helper — VIP 会员等级与展示辅助函数
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
/**
* 解析用户 VIP 等级:0=非 VIP,1=VIP1,2=VIP2。
*
* 判定顺序:
* 1. VIP 功能未启用 → 0
* 2. 角色在 vip_exempt_roles 白名单 → 当前启用的最高档
* 3. user meta aksrt_vip_level + aksrt_vip_expires(过期 lazy 清 0;expires=0 且 level>0 视为永久)
* 4. 有效 VIP 订单兜底 → 1(套餐无 level 列,订单无法区分 VIP2)
* 5. 按 pay_user_vip_1/2 开关钳制
*
* @param int $user_id 用户 ID,0 时取当前用户。
* @return int 0|1|2
*/
function aksrt_get_user_vip_level(int $user_id = 0): int {
if ($user_id <= 0) {
$user_id = get_current_user_id();
}
if ($user_id <= 0) {
return 0;
}
if (!class_exists('AKSRT_Settings')) {
return 0;
}
$vip_settings = AKSRT_Settings::get_payment_vip_settings();
if (empty($vip_settings['enabled'])) {
return 0;
}
$levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : [];
$vip1_enabled = !empty($levels[1]['enabled']);
$vip2_enabled = !empty($levels[2]['enabled']);
// 1. 角色豁免:特权角色取当前启用最高档。
$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((array) $user->roles, $exempt_roles))) {
if ($vip2_enabled) {
return 2;
}
if ($vip1_enabled) {
return 1;
}
return 0;
}
}
$candidate = 0;
// 2. meta 主路径。
$meta_level = (int) get_user_meta($user_id, 'aksrt_vip_level', true);
$expires = (int) get_user_meta($user_id, 'aksrt_vip_expires', true);
if ($meta_level > 0) {
if ($expires > 0 && $expires < time()) {
// 过期:lazy 清 level,与 capabilities 读 meta 对齐。
update_user_meta($user_id, 'aksrt_vip_level', 0);
$candidate = 0;
} else {
// expires === 0 视为永久;expires >= now 视为有效。
$candidate = min(2, max(0, $meta_level));
}
}
// 3. 订单兜底(meta 无有效等级时)。
if ($candidate <= 0 && 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 (is_array($valid_order) && !empty($valid_order)) {
$order_expires = trim((string) ($valid_order['expires_at'] ?? ''));
$order_expired = false;
if ($order_expires !== '') {
$ts = strtotime($order_expires);
if ($ts !== false && $ts < time()) {
$order_expired = true;
}
}
if (!$order_expired) {
// 套餐无 level 列:有效 VIP 订单至少视为 VIP1。
$candidate = 1;
}
}
}
// 4. 按档位开关钳制。
if ($candidate >= 2) {
if ($vip2_enabled) {
return 2;
}
if ($vip1_enabled) {
return 1;
}
return 0;
}
if ($candidate === 1) {
return $vip1_enabled ? 1 : 0;
}
return 0;
}
/**
* 检查用户是否为 VIP(level >= 1)。
*
* @param int $user_id
* @return bool
*/
function aksrt_is_vip(int $user_id = 0): bool {
return aksrt_get_user_vip_level($user_id) >= 1;
}
/**
* 检查用户是否为 VIP2(level >= 2)。
*
* @param int $user_id
* @return bool
*/
function aksrt_is_vip2(int $user_id = 0): bool {
return aksrt_get_user_vip_level($user_id) >= 2;
}
/**
* 获取 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, level: int, badge_text: string, badge_html: string, name: string}
*/
function aksrt_get_vip_info(int $user_id = 0): array {
$level = aksrt_get_user_vip_level($user_id);
$is_vip = $level >= 1;
$badge_text = aksrt_get_vip_badge_text();
return [
'is_vip' => $is_vip,
'level' => $level,
'badge_text' => $badge_text,
'badge_html' => $is_vip ? aksrt_render_vip_badge($user_id) : '',
'name' => $is_vip ? ($badge_text . '会员') : '普通用户',
];
}