(string) $json, 'sidebar_id' => $sidebar]); } public static function ajax_import(): void { self::authorize(); $sidebar = self::target_sidebar(); $raw = isset($_POST['json']) ? trim((string) wp_unslash($_POST['json'])) : ''; if ($raw === '') { wp_send_json_error(['message' => __('请粘贴 JSON 内容。', 'jio')]); } if (strlen($raw) > 2 * MB_IN_BYTES) { wp_send_json_error(['message' => __('JSON 内容超过 2MB。', 'jio')]); } $payload = json_decode($raw, true); if (!is_array($payload)) { wp_send_json_error(['message' => __('JSON 解析失败,请检查格式。', 'jio')]); } $mode = self::import_mode(); $result = self::run_import($payload, $sidebar, $mode); $message = $mode === 'append' /* translators: 1: sidebar name, 2: imported widget count */ ? __('已向侧栏「%1$s」末尾追加 %2$d 个小工具。请刷新页面后查看效果。', 'jio') /* translators: 1: sidebar name, 2: imported widget count */ : __('已覆盖侧栏「%1$s」并导入 %2$d 个小工具。请刷新页面后查看效果。', 'jio'); self::send_result($sidebar, $mode, $result, $message); } public static function ajax_list_templates(): void { self::authorize(); $list = []; foreach (WidgetTransfer::templates() as $id => $template) { $list[] = [ 'id' => (string) $id, 'title' => (string) $template['title'], 'desc' => (string) ($template['desc'] ?? ''), 'remind' => (string) ($template['remind'] ?? ''), 'modules' => WidgetTransfer::template_modules((string) $id), ]; } wp_send_json_success(['templates' => $list]); } public static function ajax_import_template(): void { self::authorize(); $sidebar = self::target_sidebar(); $template = isset($_POST['template_id']) ? sanitize_key(wp_unslash($_POST['template_id'])) : ''; try { $payload = WidgetTransfer::template_payload($template); } catch (\InvalidArgumentException $error) { wp_send_json_error(['message' => $error->getMessage()]); } $mode = self::import_mode(); $result = self::run_import($payload, $sidebar, $mode); $message = $mode === 'append' /* translators: 1: sidebar name, 2: imported widget count */ ? __('已从模板向侧栏「%1$s」末尾追加 %2$d 个小工具。请刷新页面后查看效果。', 'jio') /* translators: 1: sidebar name, 2: imported widget count */ : __('已用模板覆盖侧栏「%1$s」并导入 %2$d 个小工具。请刷新页面后查看效果。', 'jio'); self::send_result($sidebar, $mode, $result, $message, ['template_id' => $template]); } private static function authorize(): void { check_ajax_referer(self::NONCE, 'nonce'); if (!current_user_can('edit_theme_options')) { wp_send_json_error(['message' => __('权限不足', 'jio')], 403); } } private static function target_sidebar(): string { $sidebar = isset($_POST['sidebar_id']) ? sanitize_key(wp_unslash($_POST['sidebar_id'])) : ''; if ($sidebar === '' || !isset($GLOBALS['wp_registered_sidebars'][$sidebar])) { wp_send_json_error(['message' => __('无效的侧栏。', 'jio')]); } return $sidebar; } private static function import_mode(): string { $mode = isset($_POST['import_mode']) ? sanitize_key(wp_unslash($_POST['import_mode'])) : 'append'; return $mode === 'replace' ? 'replace' : 'append'; } /** @return array{sidebars:int,widgets:int} */ private static function run_import(array $payload, string $sidebar, string $mode): array { try { return WidgetTransfer::import($payload, $mode, $sidebar); } catch (\InvalidArgumentException $error) { wp_send_json_error(['message' => $error->getMessage()]); } } /** @param array{sidebars:int,widgets:int} $result */ private static function send_result(string $sidebar, string $mode, array $result, string $message, array $extra = []): void { $name = (string) ($GLOBALS['wp_registered_sidebars'][$sidebar]['name'] ?? $sidebar); wp_send_json_success(array_merge([ 'imported' => (int) $result['widgets'], 'sidebar_id' => $sidebar, 'import_mode' => $mode, 'warnings' => [], 'message' => sprintf($message, $name, (int) $result['widgets']), ], $extra)); } }