$mixed_items_sanitized, 'mediaItems' => $media_urls, // 读取并传递首页显示时长设置 单位为秒 0 表示无限 'displayDurationSeconds' => intval(get_option('yoone_snow_home_duration', 0)), // 传递资源基础映射 用于前端按需加载 SVG 图像 'assetsMap' => array( 'santa_hat' => plugins_url('assets/圣诞雪帽.svg', __FILE__), 'candy_cane' => plugins_url('assets/圣诞拐杖.svg', __FILE__), 'christmas_sock' => plugins_url('assets/圣诞袜子.svg', __FILE__), 'christmas_tree' => plugins_url('assets/圣诞树.svg', __FILE__), 'reindeer' => plugins_url('assets/圣诞麋鹿.svg', __FILE__), 'christmas_berry' => plugins_url('assets/圣诞果.svg', __FILE__), ), )); } // 在后台设置页面加载媒体库脚本和交互脚本 用于选择 SVG 或图片 function yoone_snow_admin_enqueue($hook) { // 条件判断 仅在插件设置页面加载脚本 保持性能 if ($hook !== 'settings_page_yoone_snow') { return; } // 加载媒体库脚本 以便使用 wp.media 选择器 wp_enqueue_media(); // 注册并加载后台交互脚本 $admin_script_handle = 'yoone-snow-admin-media'; wp_register_script($admin_script_handle, plugins_url('js/admin-media.js', __FILE__), array(), '1.1.0', true); wp_enqueue_script($admin_script_handle); } function yoone_snow_render_overlay() { if (!yoone_snow_is_enabled()) { return; } static $yoone_snow_rendered = false; if ($yoone_snow_rendered) { return; } $yoone_snow_rendered = true; echo ''; } add_action('wp_enqueue_scripts', 'yoone_snow_enqueue_assets'); add_action('wp_body_open', 'yoone_snow_render_overlay'); add_action('wp_footer', 'yoone_snow_render_overlay', 100); // 注册设置页面和设置项 用于选择雪花形状 function yoone_snow_register_settings() { // 移除形状下拉选项 仅保留复选集合设置 // 注册 mixed 形状集合设置项 默认包含 dot 和 flake register_setting('yoone_snow_options', 'yoone_snow_mixed_items', array( 'type' => 'array', 'sanitize_callback' => function($value) { // 将输入统一为数组 并过滤到允许的集合 $allowed = array('dot','flake','yuanbao','coin','santa_hat','candy_cane','christmas_sock','christmas_tree','reindeer','christmas_berry'); if (is_string($value)) { $value = array_filter(array_map('trim', explode(',', $value))); } if (!is_array($value)) { $value = array('dot','flake'); } $filtered = array_values(array_unique(array_intersect($value, $allowed))); return !empty($filtered) ? $filtered : array('dot','flake'); }, 'default' => array('dot','flake'), )); // 添加设置分区 标题为 Snow Settings add_settings_section( 'yoone_snow_section', 'Snow Settings', function() { // 输出分区描述 使用英文标点保证兼容 echo '
Configure snow appearance
'; }, 'yoone_snow' ); // 移除下拉字段 保留复选框作为唯一选择入口 // 添加形状复选集合 用于选择参与渲染的形状 add_settings_field( 'yoone_snow_mixed_items', 'Shapes', function() { $current_list = get_option('yoone_snow_mixed_items', array('dot','flake')); if (is_string($current_list)) { $current_list = array_filter(array_map('trim', explode(',', $current_list))); } $options = array( 'dot' => 'Dot', 'flake' => 'Snowflake', 'yuanbao' => 'Yuanbao', 'coin' => 'Coin', 'santa_hat' => 'Santa Hat', 'candy_cane' => 'Candy Cane', 'christmas_sock' => 'Christmas Sock', 'christmas_tree' => 'Christmas Tree', 'reindeer' => 'Reindeer', 'christmas_berry' => 'Christmas Berry', ); foreach ($options as $key => $label) { $checked = in_array($key, $current_list, true) ? 'checked' : ''; echo ''; } echo 'Choose shapes to render
'; }, 'yoone_snow', 'yoone_snow_section' ); // 注册媒体形状集合 设置项保存为附件 ID 数组 register_setting('yoone_snow_options', 'yoone_snow_media_items', array( 'type' => 'array', 'sanitize_callback' => function($value) { // 将输入统一为整数 ID 数组 并过滤无效值 if (is_string($value)) { $value = array_filter(array_map('trim', explode(',', $value))); } if (!is_array($value)) { $value = array(); } $ids = array(); foreach ($value as $item) { $id = intval($item); if ($id > 0) { $ids[] = $id; } } return array_values(array_unique($ids)); }, 'default' => array(), )); // 添加媒体形状选择字段 支持从媒体库选择图片或 SVG add_settings_field( 'yoone_snow_media_items', 'Media Shapes', function() { // 读取当前已选择的附件 ID 列表 并渲染缩略图列表与添加按钮 $current_media = get_option('yoone_snow_media_items', array()); if (!is_array($current_media)) { $current_media = array(); } echo 'Choose images or SVG from media library to render
'; }, 'yoone_snow', 'yoone_snow_section' ); // 注册首页显示时长设置 项为整数秒 0 表示无限 register_setting('yoone_snow_options', 'yoone_snow_home_duration', array( 'type' => 'integer', 'sanitize_callback' => function($value) { // 将输入转换为非负整数 单位为秒 0 表示无限 $num = intval($value); if ($num < 0) { $num = 0; } return $num; }, 'default' => 0, )); // 添加首页显示时长字段 输入为数字最小值为 0 add_settings_field( 'yoone_snow_home_duration', 'Home Display Duration Seconds', function() { // 读取当前设置值 并渲染数字输入框 $current = intval(get_option('yoone_snow_home_duration', 0)); echo ''; echo 'Duration in seconds for snow on home 0 means infinite
'; }, 'yoone_snow', 'yoone_snow_section' ); } // 添加设置页面到后台菜单 条目在设置菜单下 function yoone_snow_add_settings_page() { add_options_page( 'Yoone Snow', 'Yoone Snow', 'manage_options', 'yoone_snow', function() { // 渲染设置页面 表单提交到 options.php echo '