Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages
The information in this browser tab may be outdated, please refresh this page for the latest updates.

Repository URL to install this package:

jsarnowski/generatepress-premium / class-site-library-rest.php
Size: Mime:
<?php
/**
 * Rest API functions
 *
 * @package GP Premium
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class GeneratePress_Site_Library_Rest
 */
class GeneratePress_Site_Library_Rest extends WP_REST_Controller {
	/**
	 * Instance.
	 *
	 * @access private
	 * @var object Instance
	 */
	private static $instance;

	/**
	 * Namespace.
	 *
	 * @var string
	 */
	protected $namespace = 'generatepress-site-library/v';

	/**
	 * Version.
	 *
	 * @var string
	 */
	protected $version = '1';

	/**
	 * Initiator.
	 *
	 * @return object initialized object of class.
	 */
	public static function get_instance() {
		if ( ! isset( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * GenerateBlocks_Rest constructor.
	 */
	public function __construct() {
		add_action( 'rest_api_init', array( $this, 'register_routes' ) );
		add_action( 'init', array( 'GeneratePress_Site_Library_Helper', 'woocommerce_no_new_pages' ), 4 );
	}

	/**
	 * Register rest routes.
	 */
	public function register_routes() {
		$namespace = $this->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', false );
				update_option( 'generatepress_sites_expiration', strtotime( '+5 minutes' ), false );
				return $this->failed( 'no results' );
			}

			$data = json_decode( wp_remote_retrieve_body( $data ), true );

			if ( ! is_array( $data ) ) {
				update_option( 'generatepress_sites', 'no results', false );
				update_option( 'generatepress_sites_expiration', strtotime( '+5 minutes' ), false );
				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'],
					'min_theme_version' => $site['min_theme_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, false );
			update_option( 'generatepress_sites_expiration', strtotime( '+1 day' ), false );
		}

		$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();