feat: rewrite schema-driven widget system

This commit is contained in:
2026-08-17 17:29:54 +08:00
parent 6c6c462df8
commit ad99ab53ce
28 changed files with 3489 additions and 0 deletions
+72
View File
@@ -0,0 +1,72 @@
<?php
namespace AKSRT\WidgetSystem;
defined('ABSPATH') || exit;
/** Registers the isolated widget bundle and optional interaction libraries. */
final class AssetManager {
private static bool $registered = false;
private static bool $configured = false;
public static function enqueue_for(WidgetDefinition $definition): void {
self::register();
foreach ($definition->assets() as $asset) {
self::enqueue_optional($asset);
}
wp_enqueue_style('aksrt-widgets');
wp_enqueue_script('aksrt-widgets');
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('aksrt-widgets', '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';
$js = $root . '/assets/widgets/frontend.js';
wp_register_style('aksrt-widgets', $uri . '/assets/widgets/frontend.css', [], is_file($css) ? (string) filemtime($css) : null);
wp_register_script('aksrt-widgets', $uri . '/assets/widgets/frontend.js', [], is_file($js) ? (string) filemtime($js) : null, true);
if (!wp_style_is('aksrt-swiper', 'registered')) {
wp_register_style('aksrt-swiper', $uri . '/assets/css/frontend/swiper-bundle.min.css', [], '11.0');
}
if (!wp_script_is('aksrt-swiper', 'registered')) {
wp_register_script('aksrt-swiper', $uri . '/assets/js/swiper-bundle.min.js', [], '11.0', true);
}
wp_register_style('aksrt-widget-dplayer', 'https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.css', [], '1.27.1');
wp_register_script('aksrt-widget-hls', 'https://cdn.jsdelivr.net/npm/hls.js@1.5.18/dist/hls.min.js', [], '1.5.18', true);
wp_register_script('aksrt-widget-flv', 'https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js', [], '1.6.2', true);
wp_register_script('aksrt-widget-dash', 'https://cdn.jsdelivr.net/npm/dashjs@4.7.4/dist/dash.all.min.js', [], '4.7.4', true);
wp_register_script('aksrt-widget-dplayer', 'https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.js', ['aksrt-widget-hls', 'aksrt-widget-flv', 'aksrt-widget-dash'], '1.27.1', true);
wp_register_script('aksrt-widget-tilt', 'https://cdn.jsdelivr.net/npm/vanilla-tilt@1.8.1/dist/vanilla-tilt.min.js', [], '1.8.1', true);
self::$registered = true;
}
private static function enqueue_optional(string $asset): void {
if ($asset === 'swiper') {
wp_enqueue_style('aksrt-swiper');
wp_enqueue_script('aksrt-swiper');
} elseif ($asset === 'dplayer') {
wp_enqueue_style('aksrt-widget-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');
}
}
}