- 删除 AksrtFrontend registry/rehydrate 双路架构及 build/public.js 拼包入口,
前台唯一初始路径为 PHP 本地栈(jQuery 1.9.1 → Bootstrap 3.4.1)
→ loader_js(_win/aksrtData 唯一注入)→ tbquire(['main']) → runtime/main.min.js
- window.auto_fun = debounce(z_auto_fun, 100) 为唯一重扫入口;所有模块改为
执行一次 + off/on('auto_fun.aksrt-*') 命名空间重扫,data/class 标记幂等
- 局部更新协议统一:HTML 注入 → post_ajax.ed → auto_fun();
远程 modal → loaded.bs.modal → auto_fun();JSON 成功 → zib_ajax.success
- 灯箱恢复 Miniimgbox/imgbox 唯一 owner(imgbox-container、a[data-imgbox]、
imgbox_data),删除 AksrtLightbox/data-aksrt-lightbox 第二实现及 CSS/overlay,
_win.imgbox* 重新接上 post-display 设置
- 死代码清理:runtime 下 11 组被自有实现替代的旧模块副本、无消费 vendored 库、
顶层 grade.min.js、revenue.js、无调用方的 aksrt_get_win_runtime_config(),
以及 loader 中 16 条死 mapping
- PHP 入队改为本地栈 + loader_js,routed/widget/submit 依赖统一换绑;
用户卡片发布按钮恢复 nav_user_newposts_btn 设置门控
- 测试对齐:新增 frontend-lifecycle-contract,重写 navigation/lazyload/toast/
auth-source/comment/page-display/post-visual 等断言为目标架构契约
验证:node --test widget-system+navigation 223 通过 0 失败;
构建脚本重建 main/imgbox min 与 CSS bundles;改动 PHP php -l、JS node --check
全部通过;git diff --check 干净;credits 重入 harness 通过。
79 lines
2.5 KiB
PHP
79 lines
2.5 KiB
PHP
<?php
|
|
/**
|
|
* Float button commerce types + runtime window._win bridge (legacy parity).
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
if (!function_exists('aksrt_get_float_pay_vip_html')) :
|
|
/**
|
|
* Floating VIP open button.
|
|
*
|
|
* Always opens the site VIP modal for logged-in non-max VIP users
|
|
* (class pay-vip → assets/js/pay-vip.js). Guests get signin-loader.
|
|
* Admin "link/hover" fields are intentionally ignored for this type.
|
|
*/
|
|
function aksrt_get_float_pay_vip_html(array $item = []): string {
|
|
$show_vip = false;
|
|
if (class_exists('\AKSRT\Settings\Settings')) {
|
|
$vs = \AKSRT\Settings\Settings::get_payment_vip_settings();
|
|
$show_vip = !empty($vs['enabled']);
|
|
}
|
|
if (!$show_vip) {
|
|
return '';
|
|
}
|
|
$user_id = get_current_user_id();
|
|
$level = 0;
|
|
if ($user_id > 0 && function_exists('aksrt_get_user_vip_level')) {
|
|
$level = (int) aksrt_get_user_vip_level($user_id);
|
|
}
|
|
// Already top tier — no upsell entry on float rail.
|
|
if ($level >= 2) {
|
|
return '';
|
|
}
|
|
|
|
// Prefer admin title; fallback by upgrade vs open.
|
|
$admin_title = trim((string) ($item['text'] ?? ''));
|
|
if ($admin_title !== '') {
|
|
$title = $admin_title;
|
|
} else {
|
|
$title = $level === 1 ? __('升级会员', 'aksrt') : __('开通会员', 'aksrt');
|
|
}
|
|
|
|
$icon = trim((string) ($item['icon'] ?? ''));
|
|
if ($icon === '') {
|
|
$icon = 'fa fas fa-gem';
|
|
}
|
|
if (!preg_match('/^fa\s+(?:fas|far|fab)\s+fa-[a-z0-9-]+(?:\s+fa-[a-z0-9-]+)*$/i', $icon)) {
|
|
$icon = 'fa fas fa-gem';
|
|
}
|
|
|
|
// Logged-in: open modal. Guest: open login.
|
|
$cls = $user_id > 0 ? 'float-btn pay-vip nowave' : 'float-btn signin-loader nowave';
|
|
$style = [];
|
|
if (!empty($item['color'])) {
|
|
$style[] = '--this-color:' . esc_attr((string) $item['color']);
|
|
}
|
|
if (!empty($item['bg'])) {
|
|
$style[] = '--this-bg:' . esc_attr((string) $item['bg']);
|
|
}
|
|
// Default VIP accent when admin left color empty.
|
|
if (empty($item['color'])) {
|
|
$style[] = '--this-color:#f5a623';
|
|
}
|
|
$style_attr = $style ? ' style="' . implode(';', $style) . '"' : '';
|
|
|
|
// Prefer upgrading one tier when already VIP1.
|
|
$target_level = $user_id > 0 ? max(1, min(2, $level + 1)) : 1;
|
|
$vip_level_attr = $user_id > 0
|
|
? ' vip-level="' . esc_attr((string) $target_level) . '" data-vip-level="' . esc_attr((string) $target_level) . '"'
|
|
: '';
|
|
|
|
return '<a class="' . esc_attr($cls) . '" href="javascript:;" role="button" aria-label="' . esc_attr($title) . '" title="' . esc_attr($title) . '"' . $style_attr . $vip_level_attr . '>'
|
|
. '<i class="' . esc_attr($icon) . '" aria-hidden="true"></i>'
|
|
. '</a>';
|
|
}
|
|
endif;
|