wp_create_nonce('wpavatar_admin_nonce'), 'ajaxurl' => admin_url('admin-ajax.php'), 'cache_path' => get_site_option('wpavatar_cache_path', WPAVATAR_CACHE_DIR), 'plugin_url' => WPAVATAR_PLUGIN_URL, 'assets_url' => WPAVATAR_PLUGIN_URL . 'assets/', 'is_network_admin' => is_network_admin() ? '1' : '0', ]); wp_localize_script('wpavatar-admin', 'wpavatar_l10n', [ 'checking' => __('检查中...', 'wpavatar'), 'checking_status' => __('正在检查缓存状态...', 'wpavatar'), 'check_failed' => __('检查失败,请重试', 'wpavatar'), 'request_failed' => __('请求失败,请检查网络连接', 'wpavatar'), 'check_cache' => __('检查缓存状态', 'wpavatar'), 'confirm_purge' => __('确定要清空所有缓存头像吗?此操作无法撤销。', 'wpavatar'), 'purging' => __('清空中...', 'wpavatar'), 'purging_cache' => __('正在清空缓存...', 'wpavatar'), 'purge_failed' => __('清空失败,请重试', 'wpavatar'), 'purge_cache' => __('清空缓存', 'wpavatar'), 'enter_custom_cdn' => __('请输入自定义CDN域名', 'wpavatar'), 'enter_cache_path' => __('请输入缓存目录路径', 'wpavatar'), 'settings_saved' => __('设置已成功保存。', 'wpavatar'), 'confirm_import' => __('确定要从所选站点导入设置吗?此操作将覆盖当前的网络设置。', 'wpavatar'), 'confirm_reset' => __('确定要重置所有控制选项吗?该操作会将所有站点恢复为各自的设置。', 'wpavatar') ]); } /** * Add network menu */ public static function add_network_menu() { add_submenu_page( 'settings.php', __('WPAvatar网络设置', 'wpavatar'), __('WPAvatar', 'wpavatar'), 'manage_network_options', 'wpavatar-network', [__CLASS__, 'render_network_page'] ); } /** * Add network action links */ public static function add_network_action_links($links) { $settings_link = '' . __('网络设置', 'wpavatar') . ''; array_unshift($links, $settings_link); return $links; } /** * Display network managed notice on site-level settings */ public static function network_managed_notice() { $screen = get_current_screen(); if (!$screen || $screen->id !== 'settings_page_wpavatar-settings') { return; } $network_controlled_options = get_site_option('wpavatar_network_controlled_options', self::$default_controlled_options); if (!is_array($network_controlled_options)) { $network_controlled_options = explode(',', $network_controlled_options); } $controlled_count = count($network_controlled_options); $option_count = 15; // Approximate total number of WPAvatar options if (get_site_option('wpavatar_network_enforce', 0)) { echo '

' . __('WPAvatar 插件正由网络管理员强制管理。所有设置将使用网络级别配置,任何更改将被忽略。如有疑问请联系网络管理员。', 'wpavatar') . '

'; } else if ($controlled_count > 0) { echo '

' . sprintf( __('WPAvatar 插件的 %d 项设置由网络管理员控制。这些设置的更改将不会生效。', 'wpavatar'), $controlled_count ) . '

'; } } /** * Maybe remove site menu if network settings enforced */ public static function maybe_remove_site_menu() { // If network settings completely override site settings if (get_site_option('wpavatar_network_enforce', 0)) { remove_submenu_page('options-general.php', 'wpavatar-settings'); } } /** * Render network settings page */ public static function render_network_page() { if (!current_user_can('manage_network_options')) { wp_die(__('您没有足够权限访问此页面。', 'wpavatar')); } // Display update message if settings were just updated if (isset($_GET['updated']) && $_GET['updated'] == 'true') { echo '

' . __('网络设置已保存。', 'wpavatar') . '

'; } $active_tab = isset($_GET['tab']) ? sanitize_text_field($_GET['tab']) : 'network'; ?>

__('启用初认头像', 'wpavatar'), 'wpavatar_cdn_type' => __('线路选择', 'wpavatar'), 'wpavatar_cravatar_route' => __('Cravatar官方源', 'wpavatar'), 'wpavatar_third_party_mirror' => __('第三方镜像', 'wpavatar'), 'wpavatar_custom_cdn' => __('自定义CDN', 'wpavatar'), 'wpavatar_hash_method' => __('头像哈希方法', 'wpavatar'), 'wpavatar_timeout' => __('超时设置', 'wpavatar'), 'wpavatar_enable_cache' => __('启用本地缓存', 'wpavatar'), 'wpavatar_cache_path' => __('缓存目录', 'wpavatar'), 'wpavatar_cache_expire' => __('缓存过期时间', 'wpavatar'), 'wpavatar_seo_alt' => __('SEO替代文本', 'wpavatar'), 'wpavatar_fallback_mode' => __('头像加载失败处理', 'wpavatar'), 'wpavatar_fallback_avatar' => __('备用头像选择', 'wpavatar'), 'wpavatar_shortcode_size' => __('默认头像大小', 'wpavatar'), 'wpavatar_shortcode_class' => __('默认CSS类名', 'wpavatar'), 'wpavatar_shortcode_shape' => __('默认头像形状', 'wpavatar'), 'wpavatar_commenters_count' => __('评论者数量', 'wpavatar'), 'wpavatar_commenters_size' => __('评论者头像大小', 'wpavatar'), 'wpavatar_users_count' => __('用户数量', 'wpavatar'), 'wpavatar_users_size' => __('用户头像大小', 'wpavatar'), ]; // Group options by category $option_groups = [ 'basic' => [ 'title' => __('基础设置', 'wpavatar'), 'options' => [ 'wpavatar_enable_cravatar', 'wpavatar_cdn_type', 'wpavatar_cravatar_route', 'wpavatar_third_party_mirror', 'wpavatar_custom_cdn', 'wpavatar_hash_method', 'wpavatar_timeout' ] ], 'cache' => [ 'title' => __('缓存控制', 'wpavatar'), 'options' => [ 'wpavatar_enable_cache', 'wpavatar_cache_path', 'wpavatar_cache_expire' ] ], 'advanced' => [ 'title' => __('高级设置', 'wpavatar'), 'options' => [ 'wpavatar_seo_alt', 'wpavatar_fallback_mode', 'wpavatar_fallback_avatar' ] ], 'shortcodes' => [ 'title' => __('头像简码', 'wpavatar'), 'options' => [ 'wpavatar_shortcode_size', 'wpavatar_shortcode_class', 'wpavatar_shortcode_shape' ] ], 'marketing' => [ 'title' => __('营销组件', 'wpavatar'), 'options' => [ 'wpavatar_commenters_count', 'wpavatar_commenters_size', 'wpavatar_users_count', 'wpavatar_users_size' ] ] ]; // Output options by group echo '
'; foreach ($option_groups as $group => $group_data) { echo '
'; echo '

' . esc_html($group_data['title']) . '

'; foreach ($group_data['options'] as $option) { echo '
'; } echo '
'; } echo '
'; ?>

> > >




$avatar) : ?>

[wpavatar_latest_commenters]
  • number -
  • size -
[wpavatar_latest_commenters number="10" size="50"]
[wpavatar_latest_users]
  • number -
  • size -
[wpavatar_latest_users number="12" size="40"]
[wpavatar_random_users]
  • number -
  • size -
[wpavatar_random_users number="12" size="40"]
[wpavatar_author]
  • size -
[wpavatar_author size="96"]

'wpavatar-network', 'updated' => 'true' ], network_admin_url('settings.php')); // Add the tab if it exists if (!empty($current_tab)) { $redirect_url = add_query_arg('tab', $current_tab, $redirect_url); } wp_redirect($redirect_url); exit; } /** * Import settings from a site to network settings */ public static function import_site_settings() { if (!isset($_POST['import_blog_id']) || !current_user_can('manage_network_options')) { wp_die(__('无效的请求或权限不足。', 'wpavatar')); return; } check_admin_referer('wpavatar_import_site_settings'); $blog_id = intval($_POST['import_blog_id']); if ($blog_id <= 0) { wp_die(__('无效的站点ID。', 'wpavatar')); return; } // Switch to the selected blog to get its settings switch_to_blog($blog_id); // List of all options we want to import $options_to_import = [ 'wpavatar_enable_cravatar', 'wpavatar_cdn_type', 'wpavatar_cravatar_route', 'wpavatar_third_party_mirror', 'wpavatar_custom_cdn', 'wpavatar_hash_method', 'wpavatar_timeout', 'wpavatar_enable_cache', 'wpavatar_cache_path', 'wpavatar_cache_expire', 'wpavatar_seo_alt', 'wpavatar_fallback_mode', 'wpavatar_fallback_avatar', 'wpavatar_shortcode_size', 'wpavatar_shortcode_class', 'wpavatar_shortcode_shape', // 添加营销组件选项 'wpavatar_commenters_count', 'wpavatar_commenters_size', 'wpavatar_users_count', 'wpavatar_users_size' ]; // Copy options from site to network foreach ($options_to_import as $option) { $value = get_option($option); if ($value !== false) { update_site_option($option, $value); } } restore_current_blog(); // Redirect back with success message wp_redirect(add_query_arg([ 'page' => 'wpavatar-network', 'tab' => 'tools', 'imported' => 'true' ], network_admin_url('settings.php'))); exit; } /** * Apply network settings to all sites */ public static function apply_to_all_sites() { if (!current_user_can('manage_network_options')) { wp_die(__('权限不足。', 'wpavatar')); return; } check_admin_referer('wpavatar_apply_to_all_sites'); // Get list of all sites $sites = get_sites(array('number' => 500)); // Limit to 500 sites for performance // Get network-controlled options $controlled_options = get_site_option('wpavatar_network_controlled_options', self::$default_controlled_options); if (!is_array($controlled_options)) { $controlled_options = explode(',', $controlled_options); } // Apply settings to each site foreach ($sites as $site) { switch_to_blog($site->blog_id); // Apply all options in the controlled list foreach ($controlled_options as $option) { $network_value = get_site_option($option); if ($network_value !== false) { update_option($option, $network_value); } } // 确保也应用营销组件设置 $marketing_options = [ 'wpavatar_commenters_count', 'wpavatar_commenters_size', 'wpavatar_users_count', 'wpavatar_users_size' ]; foreach ($marketing_options as $option) { if (in_array($option, $controlled_options)) { $network_value = get_site_option($option); if ($network_value !== false) { update_option($option, $network_value); } } } // Ensure site cache directory exists $cache_base = get_site_option('wpavatar_cache_path', WPAVATAR_CACHE_DIR); $site_cache_dir = trailingslashit($cache_base) . 'site-' . $site->blog_id; if (!file_exists($site_cache_dir)) { wp_mkdir_p($site_cache_dir); // Create index.php $index_file = $site_cache_dir . '/index.php'; if (!file_exists($index_file)) { @file_put_contents($index_file, ' 'wpavatar-network', 'tab' => 'tools', 'applied' => 'true' ], network_admin_url('settings.php'))); exit; } } // Add actions for tools add_action('network_admin_edit_wpavatar_import_site_settings', ['\WPAvatar\Network', 'import_site_settings']); add_action('network_admin_edit_wpavatar_apply_to_all_sites', ['\WPAvatar\Network', 'apply_to_all_sites']);