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-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'
];
// 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);
}
}
// 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']);