1,'flake'=>4,'yuanbao'=>1,'coin'=>1,'santa_hat'=>1,'candy_cane'=>1,'christmas_sock'=>1,'christmas_tree'=>1,'reindeer'=>1,'christmas_berry'=>1); $saved_weights = get_option('yoone_snow_shape_weights', $default_weights); if (!is_array($saved_weights)) { $saved_weights = array(); } $shape_weights = array(); foreach ($default_weights as $k => $v) { $val = isset($saved_weights[$k]) ? intval($saved_weights[$k]) : intval($v); if ($val < 0) { $val = 0; } $shape_weights[$k] = $val; } $size_group = get_option('yoone_snow_size', array('min' => 1.0, 'max' => 3.0)); $radius_min_val = isset($size_group['min']) ? floatval($size_group['min']) : floatval(get_option('yoone_snow_radius_min', 1.0)); $radius_max_val = isset($size_group['max']) ? floatval($size_group['max']) : floatval(get_option('yoone_snow_radius_max', 3.0)); if ($radius_min_val < 0) { $radius_min_val = 0.0; } if ($radius_max_val < $radius_min_val) { $radius_max_val = $radius_min_val; } wp_localize_script($script_handle, 'YooneSnowSettings', array( 'selectedShapes' => $mixed_items_sanitized, 'mediaItems' => $media_urls, 'displayDurationSeconds' => intval(get_option('yoone_snow_home_duration', 0)), 'maxCount' => intval(get_option('yoone_snow_max_count', 0)), 'maxCountSmall' => (function(){ $grp = get_option('yoone_snow_max_count_breakpoints', array('small' => 0, 'medium' => 0, 'large' => 0)); $val = isset($grp['small']) ? intval($grp['small']) : 0; return max(0, min(1000, $val)); })(), 'maxCountMedium' => (function(){ $grp = get_option('yoone_snow_max_count_breakpoints', array('small' => 0, 'medium' => 0, 'large' => 0)); $val = isset($grp['medium']) ? intval($grp['medium']) : 0; return max(0, min(1000, $val)); })(), 'maxCountLarge' => (function(){ $grp = get_option('yoone_snow_max_count_breakpoints', array('small' => 0, 'medium' => 0, 'large' => 0)); $val = isset($grp['large']) ? intval($grp['large']) : 0; return max(0, min(1000, $val)); })(), 'radiusMin' => $radius_min_val, 'radiusMax' => $radius_max_val, 'driftMin' => floatval(get_option('yoone_snow_drift_min', 0.4)), 'driftMax' => floatval(get_option('yoone_snow_drift_max', 1.0)), 'swingMin' => floatval(get_option('yoone_snow_swing_min', 0.2)), 'swingMax' => floatval(get_option('yoone_snow_swing_max', 1.0)), 'assetsMap' => array( 'santa_hat' => plugins_url('dist/assets/圣诞雪帽.svg', dirname(__FILE__)), 'candy_cane' => plugins_url('dist/assets/圣诞拐杖.svg', dirname(__FILE__)), 'christmas_sock' => plugins_url('dist/assets/圣诞袜子.svg', dirname(__FILE__)), 'christmas_tree' => plugins_url('dist/assets/圣诞树.svg', dirname(__FILE__)), 'reindeer' => plugins_url('dist/assets/圣诞麋鹿.svg', dirname(__FILE__)), 'christmas_berry' => plugins_url('dist/assets/圣诞果.svg', dirname(__FILE__)), ), 'shapeWeights' => $shape_weights, 'mediaWeights' => $media_weights_by_url, 'emojiItems' => (function(){ $items = get_option('yoone_snow_emoji_items', array()); if (!is_array($items)) { $items = array(); } $clean = array(); foreach ($items as $it) { $s = trim((string)$it); if ($s !== '') { $clean[] = $s; } } return $clean; })(), 'emojiWeights' => (function(){ $map = get_option('yoone_snow_emoji_weights', array()); if (!is_array($map)) { $map = array(); } $clean = array(); foreach ($map as $k => $v) { $key = trim((string)$k); $num = intval($v); if ($key !== '') { if ($num < 0) { $num = 0; } $clean[$key] = $num; } } return $clean; })(), 'textItems' => (function(){ $items = get_option('yoone_snow_text_items', array()); if (!is_array($items)) { $items = array(); } $clean = array(); foreach ($items as $it) { $s = trim((string)$it); if ($s !== '') { $clean[] = $s; } } return $clean; })(), 'textWeights' => (function(){ $map = get_option('yoone_snow_text_weights', array()); if (!is_array($map)) { $map = array(); } $clean = array(); foreach ($map as $k => $v) { $key = trim((string)$k); $num = intval($v); if ($key !== '') { if ($num < 0) { $num = 0; } $clean[$key] = $num; } } return $clean; })(), )); } function yoone_snow_admin_enqueue($hook) { if ($hook !== 'settings_page_yoone_snow') { return; } wp_enqueue_media(); $bundle_handle = 'yoone-snow-bundle'; $bundle_src = plugins_url('dist/snow.js', dirname(__FILE__)); $bundle_ver = @filemtime(plugin_dir_path(dirname(__FILE__)) . 'dist/snow.js'); wp_register_script($bundle_handle, $bundle_src, array(), $bundle_ver ? (string)$bundle_ver : '2.0.0', true); wp_enqueue_script($bundle_handle); wp_localize_script($bundle_handle, 'YooneSnowAdmin', array( 'assetsMap' => array( 'santa_hat' => plugins_url('dist/assets/圣诞雪帽.svg', dirname(__FILE__)), 'candy_cane' => plugins_url('dist/assets/圣诞拐杖.svg', dirname(__FILE__)), 'christmas_sock' => plugins_url('dist/assets/圣诞袜子.svg', dirname(__FILE__)), 'christmas_tree' => plugins_url('dist/assets/圣诞树.svg', dirname(__FILE__)), 'reindeer' => plugins_url('dist/assets/圣诞麋鹿.svg', dirname(__FILE__)), 'christmas_berry' => plugins_url('dist/assets/圣诞果.svg', dirname(__FILE__)), ), 'shapeLabels' => array( 'dot' => __('Dot', 'yoone-snow'), 'flake' => __('Snowflake', 'yoone-snow'), 'yuanbao' => __('Yuanbao', 'yoone-snow'), 'coin' => __('Coin', 'yoone-snow'), 'santa_hat' => __('Santa Hat', 'yoone-snow'), 'candy_cane' => __('Candy Cane', 'yoone-snow'), 'christmas_sock' => __('Christmas Sock', 'yoone-snow'), 'christmas_tree' => __('Christmas Tree', 'yoone-snow'), 'reindeer' => __('Reindeer', 'yoone-snow'), 'christmas_berry' => __('Christmas Berry', 'yoone-snow'), ), 'i18n' => array( 'cancel' => __('Cancel', 'yoone-snow'), 'remove' => __('Remove', 'yoone-snow'), 'select_images_or_svg' => __('Select images or SVG', 'yoone-snow'), ), )); $admin_script_handle = 'yoone-snow-admin-media'; wp_register_script( $admin_script_handle, plugins_url('js/admin-media.js', dirname(__FILE__)), array($bundle_handle), (@filemtime(plugin_dir_path(dirname(__FILE__)) . 'js/admin-media.js') ? (string)@filemtime(plugin_dir_path(dirname(__FILE__)) . 'js/admin-media.js') : '2.0.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_load_textdomain() { load_plugin_textdomain('yoone-snow', false, dirname(plugin_basename(__FILE__)) . '/languages'); } add_action('plugins_loaded', 'yoone_snow_load_textdomain'); add_action('admin_enqueue_scripts', 'yoone_snow_admin_enqueue'); function yoone_snow_admin_menu() { add_options_page(__('Yoone Snow', 'yoone-snow'), __('Yoone Snow', 'yoone-snow'), 'manage_options', 'yoone_snow', 'yoone_snow_render_settings_page'); } add_action('admin_menu', 'yoone_snow_admin_menu'); function yoone_snow_render_settings_page() { if (!current_user_can('manage_options')) { wp_die(__('Sorry, you are not allowed to access this page.')); } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['yoone_snow_save_settings'])) { check_admin_referer('yoone_snow_save_settings'); $mixed = isset($_POST['yoone_snow_mixed_items']) && is_array($_POST['yoone_snow_mixed_items']) ? array_values(array_filter(array_map('sanitize_text_field', $_POST['yoone_snow_mixed_items']))) : array(); update_option('yoone_snow_mixed_items', $mixed); $shape_weights = isset($_POST['yoone_snow_shape_weights']) && is_array($_POST['yoone_snow_shape_weights']) ? array_map('intval', $_POST['yoone_snow_shape_weights']) : array(); foreach ($shape_weights as $k => $v) { if (!is_string($k)) { unset($shape_weights[$k]); } else { $shape_weights[$k] = max(0, intval($v)); } } update_option('yoone_snow_shape_weights', $shape_weights); $media_ids = isset($_POST['yoone_snow_media_items']) && is_array($_POST['yoone_snow_media_items']) ? array_map('intval', $_POST['yoone_snow_media_items']) : array(); update_option('yoone_snow_media_items', $media_ids); $media_weights = isset($_POST['yoone_snow_media_weights']) && is_array($_POST['yoone_snow_media_weights']) ? array_map('intval', $_POST['yoone_snow_media_weights']) : array(); foreach ($media_weights as $k => $v) { $media_weights[$k] = max(0, intval($v)); } update_option('yoone_snow_media_weights', $media_weights); $emoji_items = isset($_POST['yoone_snow_emoji_items']) && is_array($_POST['yoone_snow_emoji_items']) ? array_values(array_filter(array_map('sanitize_text_field', $_POST['yoone_snow_emoji_items']))) : array(); update_option('yoone_snow_emoji_items', $emoji_items); $emoji_weights = isset($_POST['yoone_snow_emoji_weights']) && is_array($_POST['yoone_snow_emoji_weights']) ? array_map('intval', $_POST['yoone_snow_emoji_weights']) : array(); foreach ($emoji_weights as $k => $v) { if (!is_string($k)) { unset($emoji_weights[$k]); } else { $emoji_weights[$k] = max(0, intval($v)); } } update_option('yoone_snow_emoji_weights', $emoji_weights); $text_items = isset($_POST['yoone_snow_text_items']) && is_array($_POST['yoone_snow_text_items']) ? array_values(array_filter(array_map('sanitize_text_field', $_POST['yoone_snow_text_items']))) : array(); update_option('yoone_snow_text_items', $text_items); $text_weights = isset($_POST['yoone_snow_text_weights']) && is_array($_POST['yoone_snow_text_weights']) ? array_map('intval', $_POST['yoone_snow_text_weights']) : array(); foreach ($text_weights as $k => $v) { if (!is_string($k)) { unset($text_weights[$k]); } else { $text_weights[$k] = max(0, intval($v)); } } update_option('yoone_snow_text_weights', $text_weights); $display_duration = isset($_POST['yoone_snow_home_duration']) ? intval($_POST['yoone_snow_home_duration']) : 0; update_option('yoone_snow_home_duration', max(0, $display_duration)); $max_count = isset($_POST['yoone_snow_max_count']) ? intval($_POST['yoone_snow_max_count']) : 0; update_option('yoone_snow_max_count', max(0, min(1000, $max_count))); $max_breakpoints = array( 'small' => isset($_POST['yoone_snow_max_count_small']) ? intval($_POST['yoone_snow_max_count_small']) : 0, 'medium' => isset($_POST['yoone_snow_max_count_medium']) ? intval($_POST['yoone_snow_max_count_medium']) : 0, 'large' => isset($_POST['yoone_snow_max_count_large']) ? intval($_POST['yoone_snow_max_count_large']) : 0 ); foreach ($max_breakpoints as $k => $v) { $max_breakpoints[$k] = max(0, min(1000, intval($v))); } update_option('yoone_snow_max_count_breakpoints', $max_breakpoints); $radius_min = isset($_POST['yoone_snow_radius_min']) ? floatval($_POST['yoone_snow_radius_min']) : 1.0; $radius_max = isset($_POST['yoone_snow_radius_max']) ? floatval($_POST['yoone_snow_radius_max']) : 3.0; if ($radius_min < 0) { $radius_min = 0.0; } if ($radius_max < $radius_min) { $radius_max = $radius_min; } update_option('yoone_snow_size', array('min' => $radius_min, 'max' => $radius_max)); $drift_min = isset($_POST['yoone_snow_drift_min']) ? floatval($_POST['yoone_snow_drift_min']) : 0.4; $drift_max = isset($_POST['yoone_snow_drift_max']) ? floatval($_POST['yoone_snow_drift_max']) : 1.0; update_option('yoone_snow_drift_min', $drift_min); update_option('yoone_snow_drift_max', $drift_max); $swing_min = isset($_POST['yoone_snow_swing_min']) ? floatval($_POST['yoone_snow_swing_min']) : 0.2; $swing_max = isset($_POST['yoone_snow_swing_max']) ? floatval($_POST['yoone_snow_swing_max']) : 1.0; update_option('yoone_snow_swing_min', $swing_min); update_option('yoone_snow_swing_max', $swing_max); $mode = isset($_POST['yoone_snow_display_routes_mode']) ? sanitize_text_field($_POST['yoone_snow_display_routes_mode']) : 'home'; if (!in_array($mode, array('home','all','match'), true)) { $mode = 'home'; } update_option('yoone_snow_display_routes_mode', $mode); $routes_raw = isset($_POST['yoone_snow_display_routes']) ? (string)$_POST['yoone_snow_display_routes'] : ''; update_option('yoone_snow_display_routes', $routes_raw); echo '

' . esc_html__('Settings saved', 'yoone-snow') . '

'; } $mixed_items = get_option('yoone_snow_mixed_items', array('dot','flake')); if (is_string($mixed_items)) { $mixed_items = array_filter(array_map('trim', explode(',', $mixed_items))); } $shape_weights2 = get_option('yoone_snow_shape_weights', array()); $emoji_items2 = get_option('yoone_snow_emoji_items', array()); $emoji_weights2 = get_option('yoone_snow_emoji_weights', array()); $text_items2 = get_option('yoone_snow_text_items', array()); $text_weights2 = get_option('yoone_snow_text_weights', array()); $media_ids2 = get_option('yoone_snow_media_items', array()); $media_weights2 = get_option('yoone_snow_media_weights', array()); $size_group2 = get_option('yoone_snow_size', array('min' => 1.0, 'max' => 3.0)); $radius_min2 = isset($size_group2['min']) ? floatval($size_group2['min']) : 1.0; $radius_max2 = isset($size_group2['max']) ? floatval($size_group2['max']) : 3.0; $home_duration2 = intval(get_option('yoone_snow_home_duration', 0)); $max_count2 = intval(get_option('yoone_snow_max_count', 0)); $breakpoints2 = get_option('yoone_snow_max_count_breakpoints', array('small'=>0,'medium'=>0,'large'=>0)); $display_mode2 = get_option('yoone_snow_display_routes_mode', 'home'); $display_routes2 = get_option('yoone_snow_display_routes', ''); ?>

media

Drift Speed Random Range

Swing Amplitude Random Range