*/ 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 !== '' ? '' : ''; $icon_url = esc_url((string) ($levels[$level]['img_icon'] ?? '')); $icon = $icon_url !== '' ? '' : ''; $html = '
'; $html .= ''; $html .= '
' . $icon . '
'; $html .= '
'; $html .= '
' . $icon . '' . esc_html($name) . '
'; $html .= $equity_html; $html .= '' . esc_html(sprintf(__('开通%s', 'aksrt'), $name)) . ''; $html .= '
'; return $html; } }