From 6618f67be2eda3455d6bdee2a84e5089f6f71fee Mon Sep 17 00:00:00 2001 From: tikkhun Date: Sat, 13 Dec 2025 10:19:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=B7=AF=E7=94=B1=E6=98=BE=E7=A4=BA):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B7=AF=E7=94=B1=E5=8C=B9=E9=85=8D=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E8=AE=BE=E7=BD=AE=E5=92=8C=E5=8A=9F=E8=83=BD=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增路由显示模式选项,支持首页显示、全站显示和URL路径匹配三种模式 在路径匹配模式下,可以通过规则列表配置需要显示雪花的URL路径 更新翻译文件和版本号至1.9.0 --- languages/yoone-snow-zh_CN.mo | Bin 3838 -> 4635 bytes languages/yoone-snow-zh_CN.po | 29 +++++++++- readme.txt | 78 ++++++++++++++++++++++++++ yoone-snow.php | 101 +++++++++++++++++++++++++++++++++- 4 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 readme.txt diff --git a/languages/yoone-snow-zh_CN.mo b/languages/yoone-snow-zh_CN.mo index cd1a4a9519d9c0181329a2f897895a86d25d1df3..acefc5707d8f4e5635c57e59599bce9d35ca77bf 100644 GIT binary patch delta 2055 zcmZwH?{5@E7{KuBwNwQaIwArhQhq2Fr6@*&ni5EjCZaFgw%hj7yW8{b8mPRu z2HJ!IrN(Qem7+NyP-4P?O)UsL)R>6A@eeT3kaX{dl2l(1Bk|YwxgD@1PHy(I^X%-* zGqbz*_oAaqV?S0D4Jb-2^+9UU45ePh>xCRBH8YiZ0ykm_25|{?7>98-?JKwpzr|ww z6{Y|0ScNkP&ch{GhU+|IY6~Yz3GBd!vE4X?MYJby0e*!G@dvyMZ(sobGS}M(&Zpgl zlKUXaeZ%-9jv=|IUr-kM8y2Y;+00U^l)!wH%rwdX)hGk3N4c@i#OpCc`*qxk-{1C-+_xO%QLVUZ?k>^kr_zKFzEhvv9YTEl_oX8CW#$j{egz=n-PoNC+ zHARVdGT3T6D8C+)xJ9%N9tQJ#M_ zRaS97Rf_y)$Qv$+t*6R6Auk|v-7b%D#wO*zsI|DIiEa&-c zl9#52x{N9>j%=a)c}RK2BY%`j#v~^lXM+Rzk!a5*5 z>?R#{+M{+v#S_H~=fB{Kg#1>AuFuExHmAvsKVQ7F_Ql;+AjB-yRs&Z`svG=HOZCc< z>PV{-Qj(wY=JW0|ja!q)FBY$eZ4cTy+|CdoJFNXaT8&O1WQA>QwOGDjB&x&qJMA`x zBwyQ1h>a%X&8pBd+1`WyEnhj+3}>C>S8Q+c*F~5KJ4;>-Yv=_edM#;z!jZ2{l2R3B6Q01 zpHGh@+{=CO#GE&_ki=x_;Q#Nom#Ok*$e!+U_YaxIv@GJ~rEA)fec8mJ$qSw7V+pUH zp1g24n;cJ{-)quJ_GeT3G*h{!_GUg!WfEt-3ub2R_Vi|0d47#qgJM+Ii@*IIX~t>a zQe-;#@XGvx^y$j!tqB9zjO|#3`%z;%WZx60!Jj~yx)iqJeN?@9R6iN}zGUxnnBf2J zE17O8MCm<-M=*d_Q5{VpRa_d^;WONZFR=!fa3kie{2SH2l84%buofFp?K{n0Y~%lK zh>Vtg6gBgU<|W)fIf>uULoMwUdf^{#61U=Qyo^t=2cuNdz>Z=&odY%#{=dN9;SQ{_u(xZ#4M`bU(^76th353sEKr-CKf}gxDnKf9<%aTE$goa z6D$?lqhbcUWE|dw6J1bVs!` zI#`+s6Dg)$Jhi8#qyt(xn)>H$y8|N>R(`YIbX^d&uZi z>V!Hk?!P&=;E$Ji_o_zy!xzq-3VUN!&0b$1GWS04uH2ihS@j~p(Z<5#RN>+C<-3`c Z+4<$^7lo Yoone Snow` 进入设置页进行配置 + +== Usage == +- 在设置页的 Shapes 字段卡片区域管理所有雪花元素 支持 Default Emoji Media Text 四种类型 +- Default 类型下可从下拉内嵌列表选择默认形状 左侧有图案预览 点击后会添加到下方卡片列表 +- Emoji 类型可通过别名下拉或直接输入字符加入元素 别名示例 snow tree bell 等 +- Media 类型通过按钮从媒体库选择图片或 SVG 并加入元素列表 +- Text 类型输入文本并加入元素列表 +- 每个元素卡片包含一个权重输入框 权重为非负整数 非法值会在保存时被矫正 + +== Settings == +- Shapes 卡片列表 管理默认形状 emoji 媒体和文本元素 每个元素支持权重输入 +- Display Duration Seconds 主页显示时长 单位秒 0 表示无限 +- Max Snowflakes On Screen 在屏最大数量 0 表示根据视口面积自动控制 上限为 1000 +- Snow Size 最小与最大半径 随机范围 在前端根据此范围生成不同尺寸 +- Drift Speed Random Range 垂直漂移速度的随机范围 控制落下速度基线 +- Swing Amplitude Random Range 水平摆动幅度随机范围 控制左右摆动基线 + +== FAQ == +问 如何控制某个形状出现概率 +答 在对应形状卡片的权重输入框设置权重 权重越大出现概率越高 权重为 0 时禁用该形状 + +问 如何添加自定义图片或 SVG 作为雪花 +答 在 Media 面板点击 Add Images 按钮 从媒体库选择图片或 SVG 将自动添加到卡片列表并可设置权重 + +问 Emoji 如何快速添加 +答 在 Emoji 面板通过下拉选择常用别名或在输入框中直接输入 emoji 字符 支持别名搜索和粘贴识别 + +问 性能如何设置 +答 通过 Max Snowflakes On Screen 限制在屏数量 通过尺寸 漂移和摆动范围控制动画强度 如需更节省资源可调小上限与范围值 + +== Screenshots == +1 设置页形状选择下拉内嵌预览示例 +2 元素卡片列表与权重输入示例 +3 媒体元素与 emoji 元素示例 + +== Changelog == += 1.1.0 = +- 增加形状选择下拉内嵌预览 每项左侧显示图案 +- 将权重输入整合到卡片列表中 支持默认形状 emoji 媒体和文本 +- 增强后台交互 包括 emoji 别名选择与建议列表 媒体多选以及文本快速添加 + += 1.0.0 = +- 初始版本 支持基础雪花效果与默认形状选择 + +== Upgrade Notice == += 1.1.0 = +升级后请在设置页检查各元素权重与在屏最大数量 以确保性能与效果符合预期 + +== Localization == +- 文本域为 `yoone-snow` 插件已加载本地化文本 可在 `languages` 目录提供翻译文件 + diff --git a/yoone-snow.php b/yoone-snow.php index 4ab1d5a..86700f6 100644 --- a/yoone-snow.php +++ b/yoone-snow.php @@ -2,13 +2,44 @@ /* Plugin Name: Yoone Snow Description: 首页 canvas 雪花效果 -Version: 1.7.0 +Version: 1.9.0 Author: Yoone */ if (!defined('ABSPATH')) { exit; } function yoone_snow_is_enabled() { + $mode = get_option('yoone_snow_display_routes_mode', 'home'); + if ($mode === 'all') { + return true; + } + if ($mode === 'match') { + $routes = get_option('yoone_snow_display_routes', array()); + if (is_string($routes)) { + $routes = array_filter(array_map('trim', explode("\n", $routes))); + } + if (!is_array($routes)) { + $routes = array(); + } + $requestUri = isset($_SERVER['REQUEST_URI']) ? (string)$_SERVER['REQUEST_URI'] : ''; + $path = parse_url($requestUri, PHP_URL_PATH); + $path = is_string($path) ? $path : ''; + foreach ($routes as $rule) { + $r = trim((string)$rule); + if ($r === '') { continue; } + if (substr($r, -1) === '*') { + $prefix = substr($r, 0, -1); + if ($prefix === '' || strpos($path, $prefix) === 0) { + return true; + } + } else { + if ($path === $r) { + return true; + } + } + } + return false; + } return function_exists('is_front_page') ? is_front_page() : false; } @@ -64,6 +95,14 @@ function yoone_snow_enqueue_assets() { $script_ver = @filemtime(plugin_dir_path(__FILE__) . 'js/snow-canvas.js'); $deps = array($shape_index_handle); $needs_utils = false; + $mixed_items_option = get_option('yoone_snow_mixed_items', array('dot','flake')); + if (is_string($mixed_items_option)) { + $mixed_items_option = array_filter(array_map('trim', explode(',', $mixed_items_option))); + } + $allowed_shapes = array('dot','flake','yuanbao','coin','santa_hat','candy_cane','christmas_sock','christmas_tree','reindeer','christmas_berry'); + $mixed_items_sanitized = array_values(array_unique(array_intersect(is_array($mixed_items_option) ? $mixed_items_option : array('dot','flake'), $allowed_shapes))); + if (empty($mixed_items_sanitized)) { $mixed_items_sanitized = array('dot','flake'); } + $media_urls = array(); foreach ($mixed_items_sanitized as $key) { if ($key === 'dot') { $deps[] = $shape_dot_handle; } if ($key === 'flake') { $deps[] = $shape_flake_handle; } @@ -726,7 +765,7 @@ function yoone_snow_register_settings() { // 添加首页显示时长字段 输入为数字最小值为 0 add_settings_field( 'yoone_snow_home_duration', - esc_html__('Home Display Duration Seconds', 'yoone-snow'), + esc_html__('Display Duration Seconds', 'yoone-snow'), function() { // 读取当前设置值 并渲染数字输入框 $current = intval(get_option('yoone_snow_home_duration', 0)); @@ -861,6 +900,64 @@ function yoone_snow_register_settings() { 'yoone_snow', 'yoone_snow_section' ); + + // 路由显示模式设置 + register_setting('yoone_snow_options', 'yoone_snow_display_routes_mode', array( + 'type' => 'string', + 'sanitize_callback' => function($value) { + $val = strtolower(trim((string)$value)); + $allowed = array('home','all','match'); + return in_array($val, $allowed, true) ? $val : 'home'; + }, + 'default' => 'home', + )); + add_settings_field( + 'yoone_snow_display_routes_mode', + esc_html__('Display Routes Mode', 'yoone-snow'), + function() { + $current = get_option('yoone_snow_display_routes_mode', 'home'); + echo ''; + echo ''; + echo ''; + echo '

' . esc_html__('Default Home Only choose All Pages to enable globally choose Match URL Path to enable only for matched routes', 'yoone-snow') . '

'; + }, + 'yoone_snow', + 'yoone_snow_section' + ); + // 路由匹配规则列表设置 + register_setting('yoone_snow_options', 'yoone_snow_display_routes', array( + 'type' => 'array', + 'sanitize_callback' => function($value) { + if (is_string($value)) { + $value = preg_split('/\\r?\\n/', $value); + } + if (!is_array($value)) { $value = array(); } + $out = array(); + foreach ($value as $item) { + $s = trim((string)$item); + if ($s !== '') { $out[] = $s; } + } + return array_values(array_unique($out)); + }, + 'default' => array(), + )); + add_settings_field( + 'yoone_snow_display_routes', + esc_html__('Match Routes', 'yoone-snow'), + function() { + $current = get_option('yoone_snow_display_routes', array()); + if (is_string($current)) { + $current = preg_split('/\\r?\\n/', $current); + } + if (!is_array($current)) { $current = array(); } + $text = implode("\n", array_map('strval', $current)); + $placeholder = esc_attr__("Example /about\n/blog/*\n/shop", 'yoone-snow'); + echo ''; + echo '

' . esc_html__('One rule per line compare against request path example exact path /about prefix match with trailing star /blog/*', 'yoone-snow') . '

'; + }, + 'yoone_snow', + 'yoone_snow_section' + ); } // 添加设置页面到后台菜单 条目在设置菜单下