- 删除 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 通过。
82 lines
3.3 KiB
PHP
82 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace AKSRT\WidgetSystem;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
/** Registers the isolated widget bundle and optional interaction libraries. */
|
|
final class AssetManager {
|
|
private const STYLE_HANDLE = 'aksrt-widget-system';
|
|
private const SCRIPT_HANDLE = 'aksrt-widgets';
|
|
|
|
private static bool $registered = false;
|
|
private static bool $configured = false;
|
|
|
|
/** Enqueue before wp_head whenever at least one new widget is assigned. */
|
|
public static function enqueue_active(): void {
|
|
foreach (WidgetRegistry::all() as $definition) {
|
|
if (is_active_widget(false, false, $definition->id_base(), true)) {
|
|
self::enqueue_for($definition);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function enqueue_for(WidgetDefinition $definition): void {
|
|
self::register();
|
|
if ($definition->slug() === 'post_pay') {
|
|
wp_enqueue_style('aksrt-pay-box');
|
|
}
|
|
foreach ($definition->assets() as $asset) {
|
|
self::enqueue_optional($asset);
|
|
}
|
|
wp_enqueue_style(self::STYLE_HANDLE);
|
|
wp_enqueue_script(self::SCRIPT_HANDLE);
|
|
if (!self::$configured) {
|
|
$config = [
|
|
'restUrl' => esc_url_raw(rest_url('aksrt/v1/widgets/')),
|
|
'quoteUrl' => esc_url_raw(rest_url('aksrt/v1/widgets/quote')),
|
|
'i18n' => [
|
|
'loading' => __('正在加载…', 'aksrt'),
|
|
'error' => __('加载失败,请重试。', 'aksrt'),
|
|
'retry' => __('重试', 'aksrt'),
|
|
],
|
|
];
|
|
wp_add_inline_script(self::SCRIPT_HANDLE, 'window.aksrtWidgets=' . wp_json_encode($config) . ';', 'before');
|
|
self::$configured = true;
|
|
}
|
|
}
|
|
|
|
private static function register(): void {
|
|
if (self::$registered) {
|
|
return;
|
|
}
|
|
$root = get_template_directory();
|
|
$uri = get_template_directory_uri();
|
|
$css = $root . '/assets/widgets/frontend.css';
|
|
$pay_css = $root . '/assets/css/frontend/pay-box.css';
|
|
$js = $root . '/assets/widgets/frontend.js';
|
|
wp_register_style(self::STYLE_HANDLE, $uri . '/assets/widgets/frontend.css', ['aksrt-public'], is_file($css) ? (string) filemtime($css) : null);
|
|
wp_register_style('aksrt-pay-box', $uri . '/assets/css/frontend/pay-box.css', ['aksrt-public'], is_file($pay_css) ? (string) filemtime($pay_css) : null);
|
|
wp_register_script(self::SCRIPT_HANDLE, $uri . '/assets/widgets/frontend.js', ['loader_js'], is_file($js) ? (string) filemtime($js) : null, true);
|
|
$third_party = $uri . '/assets/widgets/third-party/';
|
|
wp_register_script('aksrt-widget-hls', $third_party . 'hls.min.js', [], 'reference-pinned', true);
|
|
wp_register_script('aksrt-widget-flv', $third_party . 'flv.min.js', [], 'reference-pinned', true);
|
|
wp_register_script('aksrt-widget-dash', $third_party . 'dash.all.min.js', [], 'reference-pinned', true);
|
|
wp_register_script('aksrt-widget-dplayer', $third_party . 'DPlayer.min.js', ['aksrt-widget-hls', 'aksrt-widget-flv', 'aksrt-widget-dash'], 'reference-pinned', true);
|
|
wp_register_script('aksrt-widget-tilt', $third_party . 'vanilla-tilt.min.js', [], 'reference-pinned', true);
|
|
self::$registered = true;
|
|
}
|
|
|
|
private static function enqueue_optional(string $asset): void {
|
|
if ($asset === 'swiper') {
|
|
// legacy main.js owns the single Swiper runtime and discovers .new-swiper.
|
|
} elseif ($asset === 'dplayer') {
|
|
wp_enqueue_script('aksrt-widget-dplayer');
|
|
} elseif (in_array($asset, ['hls', 'flv', 'dash'], true)) {
|
|
wp_enqueue_script('aksrt-widget-' . $asset);
|
|
} elseif ($asset === 'tilt') {
|
|
wp_enqueue_script('aksrt-widget-tilt');
|
|
}
|
|
}
|
|
}
|