namespace . $this->version; // Get Templates. register_rest_route( $namespace, '/get_sites/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'get_sites' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/get_site_data/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'get_site_data' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/import_theme_options/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'import_options' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/activate_plugins/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'activate_plugins' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/import_content/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'import_content' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/import_site_options/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'import_site_options' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/import_widgets/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'import_widgets' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/restore_theme_options/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'restore_theme_options' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); // Get Templates. register_rest_route( $namespace, '/restore_content/', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'restore_content' ), 'permission_callback' => array( $this, 'update_settings_permission' ), ) ); } /** * Get edit options permissions. * * @return bool */ public function update_settings_permission() { return current_user_can( 'manage_options' ); } /** * Export a group of assets. * * @param WP_REST_Request $request request object. * * @return mixed */ public function get_sites( WP_REST_Request $request ) { $force_refresh = $request->get_param( 'forceRefresh' ); $sites = get_option( 'generatepress_sites', array() ); $time_now = strtotime( 'now' ); $sites_expire = get_option( 'generatepress_sites_expiration', sanitize_text_field( $time_now ) ); if ( $force_refresh || empty( $sites ) || $sites_expire < $time_now ) { $sites = array(); $data = wp_safe_remote_get( 'https://gpsites.co/wp-json/wp/v2/sites?per_page=100' ); if ( is_wp_error( $data ) ) { update_option( 'generatepress_sites', 'no results' ); update_option( 'generatepress_sites_expiration', strtotime( '+5 minutes' ) ); return $this->failed( 'no results' ); } $data = json_decode( wp_remote_retrieve_body( $data ), true ); if ( ! is_array( $data ) ) { update_option( 'generatepress_sites', 'no results' ); update_option( 'generatepress_sites_expiration', strtotime( '+5 minutes' ) ); return $this->failed( 'no results' ); } foreach ( (array) $data as $site ) { $sites[ $site['name'] ] = array( 'name' => $site['name'], 'directory' => $site['directory'], 'preview_url' => $site['preview_url'], 'author_name' => $site['author_name'], 'author_url' => $site['author_url'], 'description' => $site['description'], 'page_builder' => $site['page_builder'], 'category' => $site['category'], 'min_version' => $site['min_version'], 'uploads_url' => $site['uploads_url'], 'plugins' => $site['plugins'], 'documentation' => $site['documentation'], 'image_width' => ! empty( $site['image_width'] ) ? $site['image_width'] : 600, 'image_height' => ! empty( $site['image_height'] ) ? $site['image_height'] : 600, ); } update_option( 'generatepress_sites', $sites ); update_option( 'generatepress_sites_expiration', strtotime( '+1 day' ) ); } $sites = apply_filters( 'generate_add_sites', $sites ); return $this->success( $sites ); } /** * Export a group of assets. * * @param WP_REST_Request $request request object. * * @return mixed */ public function get_site_data( WP_REST_Request $request ) { $site_data = $request->get_param( 'siteData' ); if ( GeneratePress_Site_Library_Helper::file_exists( $site_data['directory'] . '/options.json' ) ) { $settings = GeneratePress_Site_Library_Helper::get_options( $site_data['directory'] . '/options.json' ); $data['options'] = true; $data['modules'] = $settings['modules']; $data['plugins'] = $settings['plugins']; if ( is_array( $data['plugins'] ) ) { include_once ABSPATH . 'wp-admin/includes/plugin.php'; $plugin_data = array(); foreach ( $data['plugins'] as $name => $slug ) { $basename = strtok( $slug, '/' ); $plugin_data[ $name ] = array( 'name' => $name, 'slug' => $slug, 'installed' => GeneratePress_Site_Library_Helper::is_plugin_installed( $slug ) ? true : false, 'active' => is_plugin_active( $slug ) ? true : false, 'repo' => GeneratePress_Site_Library_Helper::file_exists( 'https://api.wordpress.org/plugins/info/1.0/' . $basename ) ? true : false, ); } $data['plugin_data'] = $plugin_data; } } if ( GeneratePress_Site_Library_Helper::file_exists( $site_data['directory'] . '/content.xml' ) ) { $data['content'] = true; } else { $data['content'] = false; } if ( GeneratePress_Site_Library_Helper::file_exists( $site_data['directory'] . '/widgets.wie' ) ) { $data['widgets'] = true; } else { $data['widgets'] = false; } return $this->success( $data ); } /** * Export a group of assets. * * @param WP_REST_Request $request request object. * * @return mixed */ public function import_options( WP_REST_Request $request ) { $site_data = $request->get_param( 'siteData' ); if ( ! GeneratePress_Site_Library_Helper::file_exists( $site_data['directory'] . '/options.json' ) ) { return $this->failed( 'No theme options exist.' ); } // Delete existing backup. delete_option( '_generatepress_site_library_backup' ); // Backup options. $backup_data = get_option( '_generatepress_site_library_backup', array() ); $theme_mods = GeneratePress_Site_Library_Helper::get_theme_mods(); $settings = GeneratePress_Site_Library_Helper::get_theme_settings(); $data = array( 'mods' => array(), 'options' => array(), ); foreach ( $theme_mods as $theme_mod ) { $data['mods'][ $theme_mod ] = get_theme_mod( $theme_mod ); } foreach ( $settings as $setting ) { $data['options'][ $setting ] = get_option( $setting ); } $backup_data['theme_options'] = $data; $modules = GeneratePress_Site_Library_Helper::premium_modules(); $active_modules = array(); foreach ( $modules as $name => $key ) { if ( 'activated' === get_option( $key ) ) { $active_modules[ $name ] = $key; } } $backup_data['modules'] = $active_modules; $settings = GeneratePress_Site_Library_Helper::get_options( $site_data['directory'] . '/options.json' ); // Remove all existing theme options. $option_keys = array( 'generate_settings', 'generate_background_settings', 'generate_blog_settings', 'generate_hooks', 'generate_page_header_settings', 'generate_secondary_nav_settings', 'generate_spacing_settings', 'generate_menu_plus_settings', 'generate_woocommerce_settings', ); foreach ( $option_keys as $key ) { delete_option( $key ); } // Need to backup these items before we remove all theme mods. $backup_data['site_options']['nav_menu_locations'] = get_theme_mod( 'nav_menu_locations' ); $backup_data['site_options']['custom_logo'] = get_theme_mod( 'custom_logo' ); // Remove existing theme mods. remove_theme_mods(); // Remove existing activated premium modules. $premium_modules = GeneratePress_Site_Library_Helper::premium_modules(); foreach ( $premium_modules as $name => $key ) { delete_option( $key ); } // Activate necessary modules. foreach ( $settings['modules'] as $name => $key ) { // Only allow valid premium modules. if ( ! in_array( $key, $premium_modules ) ) { GeneratePress_Site_Library_Helper::log( 'Bad premium module key: ' . $key ); continue; } update_option( $key, 'activated' ); } // Set theme mods. foreach ( $settings['mods'] as $key => $val ) { // Only allow valid theme mods. if ( ! in_array( $key, GeneratePress_Site_Library_Helper::get_theme_mods() ) ) { GeneratePress_Site_Library_Helper::log( 'Bad theme mod key: ' . $key ); continue; } set_theme_mod( $key, $val ); } // Set theme options. foreach ( $settings['options'] as $key => $val ) { // Only allow valid options. if ( ! in_array( $key, GeneratePress_Site_Library_Helper::get_theme_settings() ) ) { GeneratePress_Site_Library_Helper::log( 'Bad theme setting key: ' . $key ); continue; } if ( is_array( $val ) || is_object( $val ) ) { foreach ( $val as $option_name => $option_value ) { // Import any images. if ( is_string( $option_value ) && preg_match( '/\.(jpg|jpeg|png|gif)/i', $option_value ) ) { $data = GeneratePress_Site_Library_Helper::sideload_image( $option_value ); if ( ! is_wp_error( $data ) ) { $val[ $option_name ] = $data->url; } } // Set these options if we import content. unset( $val['hide_title'] ); unset( $val['hide_tagline'] ); unset( $val['logo_width'] ); } } update_option( $key, $val ); } // Re-add non-theme option related theme mods. set_theme_mod( 'nav_menu_locations', $backup_data['site_options']['nav_menu_locations'] ); set_theme_mod( 'custom_logo', $backup_data['site_options']['custom_logo'] ); $existing_settings = get_option( 'generate_settings', array() ); if ( isset( $backup_data['theme_options']['options']['generate_settings']['hide_title'] ) ) { $existing_settings['hide_title'] = $backup_data['theme_options']['options']['generate_settings']['hide_title']; } if ( isset( $backup_data['theme_options']['options']['generate_settings']['hide_tagline'] ) ) { $existing_settings['hide_tagline'] = $backup_data['theme_options']['options']['generate_settings']['hide_tagline']; } if ( isset( $backup_data['theme_options']['options']['generate_settings']['logo_width'] ) ) { $existing_settings['logo_width'] = $backup_data['theme_options']['options']['generate_settings']['logo_width']; } update_option( 'generate_settings', $existing_settings ); // Remove dynamic CSS cache. delete_option( 'generate_dynamic_css_output' ); delete_option( 'generate_dynamic_css_cached_version' ); $dynamic_css_data = get_option( 'generatepress_dynamic_css_data', array() ); if ( isset( $dynamic_css_data['updated_time'] ) ) { unset( $dynamic_css_data['updated_time'] ); } update_option( 'generatepress_dynamic_css_data', $dynamic_css_data ); // Custom CSS. $css = $settings['custom_css']; $css = '/* GeneratePress Site CSS */ ' . $css . ' /* End GeneratePress Site CSS */'; $current_css = wp_get_custom_css_post(); if ( isset( $current_css->post_content ) ) { $current_css->post_content = preg_replace( '#(/\\* GeneratePress Site CSS \\*/).*?(/\\* End GeneratePress Site CSS \\*/)#s', '', $current_css->post_content ); $css = $current_css->post_content . $css; } wp_update_custom_css_post( $css ); update_option( '_generatepress_site_library_backup', $backup_data ); return $this->success( __( 'Options imported', 'gp-premium' ) ); } /** * Export a group of assets. * * @param WP_REST_Request $request request object. * * @return mixed */ public function activate_plugins( WP_REST_Request $request ) { $site_data = $request->get_param( 'siteData' ); $settings = GeneratePress_Site_Library_Helper::get_options( $site_data['directory'] . '/options.json' ); $plugins = $settings['plugins']; // Backup plugins. $backup_data = get_option( '_generatepress_site_library_backup', array() ); $backup_data['plugins'] = get_option( 'active_plugins', array() ); update_option( '_generatepress_site_library_backup', $backup_data ); if ( ! empty( $plugins ) ) { $pro_plugins = GeneratePress_Site_Library_Helper::check_for_pro_plugins(); include_once ABSPATH . 'wp-admin/includes/plugin.php'; foreach ( $plugins as $plugin ) { // If the plugin has a pro version and it exists, activate it instead. if ( array_key_exists( $plugin, $pro_plugins ) ) { if ( file_exists( WP_PLUGIN_DIR . '/' . $pro_plugins[ $plugin ] ) ) { $plugin = $pro_plugins[ $plugin ]; } } // Install BB lite if pro doesn't exist. if ( 'bb-plugin/fl-builder.php' === $plugin && ! file_exists( WP_PLUGIN_DIR . '/bb-plugin/fl-builder.php' ) ) { $plugin = 'beaver-builder-lite-version/fl-builder.php'; } if ( ! is_plugin_active( $plugin ) ) { activate_plugin( $plugin, '', false, true ); if ( 'woocommerce/woocommerce.php' === $plugin ) { add_option( 'generate_woocommerce_no_create_pages', true ); } } } return $this->success( __( 'Plugins activated', 'gp-premium' ) ); } } /** * Export a group of assets. * * @param WP_REST_Request $request request object. * * @return mixed */ public function import_content( WP_REST_Request $request ) { $site_data = $request->get_param( 'siteData' ); $site_slug = $request->get_param( 'siteSlug' ); $import_options = $request->get_param( 'importOptions' ); $import_content = $request->get_param( 'importContent' ); // Increase PHP max execution time. set_time_limit( apply_filters( 'generate_sites_content_import_time_limit', 300 ) ); $xml_path = $site_data['directory'] . '/content.xml'; $xml_file = GeneratePress_Site_Library_Helper::download_file( $xml_path ); $xml_path = $xml_file['data']['file']; if ( ! $xml_path ) { return $this->failed( 'No content found.' ); } // Increase PHP max execution time. set_time_limit( apply_filters( 'generate_sites_content_import_time_limit', 300 ) ); // Disable import of authors. add_filter( 'wxr_importer.pre_process.user', '__return_false' ); // Keep track of our progress. add_action( 'wxr_importer.processed.post', array( 'GeneratePress_Site_Library_Helper', 'track_post' ) ); add_action( 'wxr_importer.processed.term', array( 'GeneratePress_Site_Library_Helper', 'track_term' ) ); // Disables generation of multiple image sizes (thumbnails) in the content import step. if ( ! apply_filters( 'generate_sites_regen_thumbnails', true ) ) { add_filter( 'intermediate_image_sizes_advanced', '__return_null' ); } $backup_data = get_option( '_generatepress_site_library_backup', array() ); $backup_data['content'] = true; update_option( '_generatepress_site_library_backup', $backup_data ); GeneratePress_Site_Library_Helper::import_xml( $xml_path, $site_slug ); return $this->success( 'Content imported' ); } /** * Export a group of assets. * * @param WP_REST_Request $request request object. * * @return mixed */ public function import_site_options( WP_REST_Request $request ) { $site_data = $request->get_param( 'siteData' ); $site_slug = $request->get_param( 'siteSlug' ); $backup_data = get_option( '_generatepress_site_library_backup', array() ); $settings = GeneratePress_Site_Library_Helper::get_options( $site_data['directory'] . '/options.json' ); foreach ( $settings['site_options'] as $key => $val ) { switch ( $key ) { case 'page_for_posts': case 'page_on_front': $backup_data['site_options'][ $key ] = get_option( $key ); GeneratePress_Site_Library_Helper::set_reading_pages( $key, $val, $site_slug ); break; case 'woocommerce_shop_page_id': case 'woocommerce_cart_page_id': case 'woocommerce_checkout_page_id': case 'woocommerce_myaccount_page_id': $backup_data['site_options'][ $key ] = get_option( $key ); GeneratePress_Site_Library_Helper::set_woocommerce_pages( $key, $val, $site_slug ); break; case 'nav_menu_locations': if ( ! isset( $backup_data['site_options']['nav_menu_location'] ) ) { $backup_data['site_options']['nav_menu_locations'] = get_theme_mod( 'nav_menu_locations' ); } GeneratePress_Site_Library_Helper::set_nav_menu_locations( $val ); break; case 'element_locations': GeneratePress_Site_Library_Helper::set_element_locations( $val, $site_slug ); break; case 'element_exclusions': GeneratePress_Site_Library_Helper::set_element_exclusions( $val, $site_slug ); break; case 'custom_logo': if ( ! isset( $backup_data['site_options']['custom_logo'] ) ) { $backup_data['site_options']['custom_logo'] = get_theme_mod( 'custom_logo' ); } $data = GeneratePress_Site_Library_Helper::sideload_image( $val ); if ( ! is_wp_error( $data ) && isset( $data->attachment_id ) ) { set_theme_mod( 'custom_logo', $data->attachment_id ); update_post_meta( $data->attachment_id, '_wp_attachment_is_custom_header', get_option( 'stylesheet' ) ); } else { remove_theme_mod( 'custom_logo' ); } break; default: if ( in_array( $key, (array) GeneratePress_Site_Library_Helper::disallowed_options() ) ) { GeneratePress_Site_Library_Helper::log( 'Disallowed option: ' . $key ); } else { $backup_data['site_options'][ $key ] = get_option( $key ); delete_option( $key ); update_option( $key, $val ); } break; } } // Set theme options. $theme_settings = get_option( 'generate_settings', array() ); $update_theme_settings = false; foreach ( $settings['options'] as $key => $val ) { if ( 'generate_settings' !== $key ) { continue; } if ( is_array( $val ) || is_object( $val ) ) { foreach ( $val as $option_name => $option_value ) { if ( 'hide_title' === $option_name ) { $theme_settings['hide_title'] = $option_value; $update_theme_settings = true; } if ( 'hide_tagline' === $option_name ) { $theme_settings['hide_tagline'] = $option_value; $update_theme_settings = true; } if ( 'logo_width' === $option_name ) { $theme_settings['logo_width'] = $option_value; $update_theme_settings = true; } } } } if ( $update_theme_settings ) { update_option( 'generate_settings', $theme_settings ); // Remove dynamic CSS cache. delete_option( 'generate_dynamic_css_output' ); delete_option( 'generate_dynamic_css_cached_version' ); $dynamic_css_data = get_option( 'generatepress_dynamic_css_data', array() ); if ( isset( $dynamic_css_data['updated_time'] ) ) { unset( $dynamic_css_data['updated_time'] ); } update_option( 'generatepress_dynamic_css_data', $dynamic_css_data ); } // Set our backed up options. update_option( '_generatepress_site_library_backup', $backup_data ); // Update any custom menu link URLs. GeneratePress_Site_Library_Helper::update_menu_urls( $site_data['preview_url'] ); // Clear page builder cache. GeneratePress_Site_Library_Helper::clear_page_builder_cache(); return $this->success( 'Site options imported' ); } /** * Export a group of assets. * * @param WP_REST_Request $request request object. * * @return mixed */ public function import_widgets( WP_REST_Request $request ) { $site_data = $request->get_param( 'siteData' ); require_once GP_PREMIUM_DIR_PATH . 'site-library/classes/class-site-widget-importer.php'; $widgets_path = $site_data['directory'] . '/widgets.wie'; $wie_file = GeneratePress_Site_Library_Helper::download_file( $widgets_path ); $wie_path = $wie_file['data']['file']; $data = implode( '', file( $wie_path ) ); $data = json_decode( $data ); GeneratePress_Site_Library_Helper::clear_widgets(); add_filter( 'wie_widget_settings_array', array( 'GeneratePress_Site_Library_Helper', 'fix_custom_menu_widget_ids' ) ); $widgets_importer = GeneratePress_Sites_Widget_Importer::instance(); $widgets_importer->wie_import_data( $data ); remove_filter( 'wie_widget_settings_array', array( 'GeneratePress_Site_Library_Helper', 'fix_custom_menu_widget_ids' ) ); return $this->success( 'Widgets imported' ); } /** * Restore our theme options. */ public function restore_theme_options() { $backup_data = get_option( '_generatepress_site_library_backup', array() ); if ( ! empty( $backup_data ) ) { if ( ! empty( $backup_data['theme_options']['mods'] ) ) { remove_theme_mods(); } if ( ! empty( $backup_data['theme_options']['options'] ) ) { $option_keys = array( 'generate_settings', 'generate_background_settings', 'generate_blog_settings', 'generate_hooks', 'generate_page_header_settings', 'generate_secondary_nav_settings', 'generate_spacing_settings', 'generate_menu_plus_settings', 'generate_woocommerce_settings', ); foreach ( $option_keys as $key ) { delete_option( $key ); } } if ( ! empty( $backup_data['modules'] ) ) { $modules = GeneratePress_Site_Library_Helper::premium_modules(); foreach ( $modules as $name => $key ) { delete_option( $key ); } foreach ( (array) $backup_data['modules'] as $name => $key ) { update_option( $key, 'activated' ); } } if ( ! empty( $backup_data['theme_options']['mods'] ) ) { foreach ( $backup_data['theme_options']['mods'] as $key => $val ) { // Only allow valid theme mods. if ( ! in_array( $key, GeneratePress_Site_Library_Helper::get_theme_mods() ) ) { GeneratePress_Site_Library_Helper::log( 'Bad theme mod key: ' . $key ); continue; } set_theme_mod( $key, $val ); } } if ( ! empty( $backup_data['theme_options']['options'] ) ) { foreach ( $backup_data['theme_options']['options'] as $key => $val ) { // Only allow valid options. if ( ! in_array( $key, GeneratePress_Site_Library_Helper::get_theme_settings() ) ) { GeneratePress_Site_Library_Helper::log( 'Bad theme setting key: ' . $key ); continue; } update_option( $key, $val ); } } // Re-add non-theme option related theme mods. if ( isset( $backup_data['site_options']['nav_menu_locations'] ) ) { set_theme_mod( 'nav_menu_locations', $backup_data['site_options']['nav_menu_locations'] ); } if ( isset( $backup_data['site_options']['custom_logo'] ) ) { set_theme_mod( 'custom_logo', $backup_data['site_options']['custom_logo'] ); } } return $this->success( __( 'Theme options restored.', 'gp-premium' ) ); } /** * Restore content. */ public function restore_content() { $backup_data = get_option( '_generatepress_site_library_backup', array() ); // Plugins. if ( ! empty( $backup_data['plugins'] ) && ! empty( $backup_data['site_options'] ) ) { update_option( 'active_plugins', $backup_data['plugins'] ); } // Content. if ( ! empty( $backup_data ) ) { global $wpdb; $post_ids = $wpdb->get_col( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_generatepress_sites_imported_post'" ); $term_ids = $wpdb->get_col( "SELECT term_id FROM {$wpdb->termmeta} WHERE meta_key='_generatepress_sites_imported_term'" ); foreach ( $post_ids as $id ) { wp_delete_post( $id, true ); } } // Site options. if ( ! empty( $backup_data['site_options'] ) ) { foreach ( $backup_data['site_options'] as $key => $val ) { if ( in_array( $key, (array) GeneratePress_Site_Library_Helper::disallowed_options() ) ) { GeneratePress_Site_Library_Helper::log( 'Disallowed option: ' . $key ); continue; } if ( 'nav_menu_locations' === $key || 'custom_logo' === $key ) { set_theme_mod( $key, $val ); } else { if ( ! $val && ! is_numeric( $val ) ) { delete_option( $key ); } else { update_option( $key, $val ); } } } } // Widgets. if ( ! empty( $backup_data['widgets'] ) ) { update_option( 'sidebars_widgets', $backup_data['widgets'] ); } // CSS. $current_css = wp_get_custom_css_post(); if ( isset( $current_css->post_content ) ) { // Remove existing library CSS. $current_css->post_content = preg_replace( '#(/\\* GeneratePress Site CSS \\*/).*?(/\\* End GeneratePress Site CSS \\*/)#s', '', $current_css->post_content ); } wp_update_custom_css_post( $current_css->post_content ); // Clean up. delete_option( 'generate_dynamic_css_output' ); delete_option( 'generate_dynamic_css_cached_version' ); delete_option( '_generatepress_site_library_backup' ); return $this->success( __( 'Content restored.', 'gp-premium' ) ); } /** * Success rest. * * @param mixed $response response data. * @return mixed */ public function success( $response ) { return new WP_REST_Response( array( 'success' => true, 'response' => $response, ), 200 ); } /** * Failed rest. * * @param mixed $response response data. * @return mixed */ public function failed( $response ) { return new WP_REST_Response( array( 'success' => false, 'response' => $response, ), 200 ); } /** * Error rest. * * @param mixed $code error code. * @param mixed $response response data. * @return mixed */ public function error( $code, $response ) { return new WP_REST_Response( array( 'error' => true, 'success' => false, 'error_code' => $code, 'response' => $response, ), 401 ); } } GeneratePress_Site_Library_Rest::get_instance();