\WP_REST_Server::CREATABLE, 'callback' => [$this, 'preview'], 'permission_callback' => $permission, ]); register_rest_route(PagesController::NAMESPACE, '/import/commit', [ 'methods' => \WP_REST_Server::CREATABLE, 'callback' => [$this, 'commit'], 'permission_callback' => $permission, ]); } public function canManage(): bool { return current_user_can('manage_options'); } /** * Body: `{ "content": "" }`. */ public function preview(\WP_REST_Request $request) { $content = $request->get_param('content'); if (! is_string($content) || $content === '') { return $this->invalid(new ImportInvalid('no_file', __('Choose a file to import.', 'admin-options-pages'))); } try { return new \WP_REST_Response(Importer::preview($content)); } catch (ImportInvalid $invalid) { return $this->invalid($invalid); } } /** * Body: `{ "token": "…", "menus": { "": "import|overwrite|skip" }, "options": { "": "write|keep" }, "exclude": { "": ["1", "0:2"] } }`. */ public function commit(\WP_REST_Request $request) { $token = $request->get_param('token'); $menus = $request->get_param('menus'); $options = $request->get_param('options'); $exclude = $request->get_param('exclude'); if (! is_string($token) || ($menus !== null && ! is_array($menus)) || ($options !== null && ! is_array($options)) || ($exclude !== null && ! is_array($exclude))) { return $this->invalid(new ImportInvalid('bad_request', __('The request is not complete.', 'admin-options-pages'))); } try { return new \WP_REST_Response(Importer::commit($token, $this->choices($menus), $this->choices($options), $this->exclusions($exclude))); } catch (ImportInvalid $invalid) { return $this->invalid($invalid); } } /** * Keys and values are text: anything else cannot be a choice. * * @return array */ private function choices($input): array { $choices = []; foreach ((array) $input as $key => $value) { $choices[(string) $key] = is_string($value) ? $value : ''; } return $choices; } /** * @return array menu_slug => the keys of what was unchecked; the importer checks them. */ private function exclusions($input): array { $exclusions = []; foreach ((array) $input as $slug => $keys) { $exclusions[(string) $slug] = is_array($keys) ? array_values($keys) : []; } return $exclusions; } private function invalid(ImportInvalid $invalid): \WP_Error { return new \WP_Error( 'aop_import_' . $invalid->reason(), $invalid->getMessage(), ['status' => $invalid->getCode() ?: 400, 'details' => $invalid->details()] ); } }