- 通用 fa fa-X 前缀改为 fa fas fa-X(12 个生产文件) - 重命名图标映射:fa-sign-in→fa-sign-in-alt、fa-envelope-o→far fa-envelope、 fa-trash-o→far fa-trash-alt、fa-file-image-o→far fa-file-image、 fa-dot-circle-o→far fa-dot-circle、fa-play-circle-o→far fa-play-circle、 fa-pencil→fas fa-pencil-alt - 修复 FA5 中不存在的 fa-pencil-square→fas fa-edit
180 lines
7.8 KiB
PHP
180 lines
7.8 KiB
PHP
<?php
|
|
/**
|
|
* VIP modal view model + card HTML (legacy pay-vip modal / vip-card parity).
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
namespace AKSRT\Content;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
trait VipServiceModal {
|
|
|
|
/**
|
|
* Build the minimal JSON view model consumed by pay-vip.js.
|
|
*
|
|
* The catalog, member state, package prices, payment methods, and allowed
|
|
* actions are all calculated server-side. No payment gateway response or
|
|
* server-rendered modal HTML is included in this payload.
|
|
*
|
|
* @return array<string,mixed>
|
|
*/
|
|
public function get_modal_view_model(int $user_id, int $prefer_level = 1): array {
|
|
$catalog = $this->get_catalog($user_id);
|
|
$vip = $this->get_vip_settings_context();
|
|
$member = $this->get_vip_member_context($user_id);
|
|
$levels = is_array($vip['levels'] ?? null) ? $vip['levels'] : [];
|
|
$prefer_level = max(1, min(2, $prefer_level));
|
|
|
|
$level_view = [];
|
|
foreach ([1, 2] as $level) {
|
|
if (empty($levels[$level]['enabled'])) {
|
|
continue;
|
|
}
|
|
$equity = (string) ($levels[$level]['equity'] ?? '');
|
|
$equity = function_exists('aksrt_format_vip_equity_html')
|
|
? (string) aksrt_format_vip_equity_html($equity)
|
|
: wp_kses_post($equity);
|
|
$level_view[] = [
|
|
'level' => $level,
|
|
'name' => (string) ($levels[$level]['name'] ?? ('VIP' . $level)),
|
|
'desc' => (string) ($levels[$level]['desc'] ?? ''),
|
|
'equity' => $equity,
|
|
'img_icon' => esc_url_raw((string) ($levels[$level]['img_icon'] ?? '')),
|
|
];
|
|
}
|
|
|
|
$package_ids = [];
|
|
$has_renew = false;
|
|
$has_upgrade = false;
|
|
$groups = is_array($catalog['level_packages'] ?? null) ? $catalog['level_packages'] : [];
|
|
foreach ($groups as $group) {
|
|
if (!is_array($group)) {
|
|
continue;
|
|
}
|
|
$action = sanitize_key((string) ($group['action'] ?? 'pay'));
|
|
$has_renew = $has_renew || $action === 'renew';
|
|
$has_upgrade = $has_upgrade || $action === 'upgrade';
|
|
foreach ((array) ($group['items'] ?? []) as $item) {
|
|
if (is_array($item) && (int) ($item['package_id'] ?? 0) > 0) {
|
|
$package_ids[] = (int) $item['package_id'];
|
|
}
|
|
}
|
|
}
|
|
$points_exchange = is_array($catalog['points_exchange'] ?? null) ? $catalog['points_exchange'] : [];
|
|
$methods = is_array($catalog['payment_methods'] ?? null) ? $catalog['payment_methods'] : [];
|
|
$no_payment_method = $methods === [];
|
|
$action_reasons = [
|
|
'purchase' => $no_payment_method
|
|
? 'no_payment_method'
|
|
: ($package_ids === [] ? 'no_package' : ''),
|
|
'renew' => $no_payment_method
|
|
? 'no_payment_method'
|
|
: ($has_renew ? '' : 'not_available'),
|
|
'upgrade' => $no_payment_method
|
|
? 'no_payment_method'
|
|
: ($has_upgrade ? '' : 'not_available'),
|
|
'points_exchange' => !empty($points_exchange['enabled']) && !empty($points_exchange['packages'])
|
|
? ''
|
|
: 'not_available',
|
|
];
|
|
|
|
$member_state = (string) ($member['state'] ?? 'unopened');
|
|
$member_version = substr(hash('sha256', (string) wp_json_encode([
|
|
'level' => (int) ($member['level'] ?? 0),
|
|
'expires' => (int) ($member['expires'] ?? 0),
|
|
'state' => $member_state,
|
|
])), 0, 16);
|
|
$catalog_version = substr(hash('sha256', (string) wp_json_encode([
|
|
'packages' => $groups,
|
|
'points' => $points_exchange,
|
|
'methods' => $methods,
|
|
'levels' => $level_view,
|
|
])), 0, 16);
|
|
|
|
$user = get_userdata($user_id);
|
|
$avatar_url = function_exists('get_avatar_url')
|
|
? (string) get_avatar_url($user_id, ['size' => 42])
|
|
: '';
|
|
|
|
return [
|
|
'enabled' => !empty($catalog['enabled']),
|
|
'prefer_level' => $prefer_level,
|
|
'catalog' => [
|
|
'desc' => (string) ($catalog['desc'] ?? ''),
|
|
'help_text' => (string) ($catalog['help_text'] ?? ''),
|
|
'more' => (string) ($vip['more'] ?? ''),
|
|
'currency_name' => (string) ($catalog['currency_name'] ?? ''),
|
|
'level_packages' => $groups,
|
|
'points_exchange' => $points_exchange,
|
|
'vip_url' => (string) ($catalog['vip_url'] ?? ''),
|
|
],
|
|
'member' => [
|
|
'id' => $user_id,
|
|
'name' => $user ? (string) $user->display_name : '',
|
|
'avatar_url' => $avatar_url,
|
|
'level' => (int) ($member['level'] ?? 0),
|
|
'expires' => (int) ($member['expires'] ?? 0),
|
|
'expires_label' => (string) ($member['expires_label'] ?? ''),
|
|
'state' => (string) ($member['state'] ?? 'unopened'),
|
|
'is_permanent' => !empty($member['is_permanent']),
|
|
'points' => (int) ($catalog['user_points'] ?? 0),
|
|
'logged_in' => $user_id > 0,
|
|
],
|
|
'levels' => $level_view,
|
|
'payment_methods' => $methods,
|
|
'allowed_actions' => [
|
|
'purchase' => $package_ids !== [] && $methods !== [],
|
|
'renew' => $has_renew && $methods !== [],
|
|
'upgrade' => $has_upgrade && $methods !== [],
|
|
'points_exchange' => !empty($points_exchange['enabled']) && !empty($points_exchange['packages']),
|
|
],
|
|
'action_reasons' => $action_reasons,
|
|
'version' => [
|
|
'schema' => 1,
|
|
'member' => $member_version,
|
|
'catalog' => $catalog_version,
|
|
// Stable revision token; do not use request time and bust short cache.
|
|
'updated_at' => $member_version . ':' . $catalog_version,
|
|
'tags' => ['vip', 'orders'],
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Mini hover card for header (legacy aksrtpay_get_vip_card).
|
|
*/
|
|
public function render_vip_card(int $level, int $user_id = 0): string {
|
|
$level = max(1, min(2, $level));
|
|
$vip = $this->get_vip_settings_context();
|
|
$levels = is_array($vip['levels'] ?? null) ? $vip['levels'] : [];
|
|
if (empty($levels[$level]['enabled'])) {
|
|
return '';
|
|
}
|
|
$name = (string) ($levels[$level]['name'] ?? ('VIP' . $level));
|
|
$equity = (string) ($levels[$level]['equity'] ?? '');
|
|
$cls = $user_id > 0 ? ' pay-vip' : ' signin-loader';
|
|
|
|
$equity_html = $equity !== ''
|
|
? '<ul class="mb10 relative">' . wp_kses_post($equity) . '</ul>'
|
|
: '';
|
|
|
|
$icon_url = esc_url((string) ($levels[$level]['img_icon'] ?? ''));
|
|
$icon = $icon_url !== ''
|
|
? '<img' . aksrt_get_lazy_attr('lazy_other', $icon_url, 'img-icon') . ' title="' . esc_attr($name) . '" alt="' . esc_attr($name) . '" decoding="async">'
|
|
: '<i class="fa fas fa-gem" aria-hidden="true"></i>';
|
|
$html = '<div class="vip-card pointer level-' . $level . ' vip-theme' . $level . $cls . '" vip-level="' . $level . '">';
|
|
$html .= '<div class="abs-center vip-baicon" aria-hidden="true">' . $icon . '</div>';
|
|
$html .= '<div class="vip-img abs-right">' . $icon . '</div>';
|
|
$html .= '<div class="relative">';
|
|
$html .= '<div class="vip-name mb10"><span class="mr6">' . $icon . '</span>' . esc_html($name) . '</div>';
|
|
$html .= $equity_html;
|
|
$html .= '<a class="but jb-blue radius payvip-button" href="javascript:;">'
|
|
. esc_html(sprintf(__('开通%s', 'aksrt'), $name))
|
|
. '<span class="ml6"><i class="fa fas fa-chevron-circle-right" aria-hidden="true"></i></span></a>';
|
|
$html .= '</div></div>';
|
|
return $html;
|
|
}
|
|
}
|