923 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			923 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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'],
 | |
| 					'min_generateblocks_version' => $site['min_generateblocks_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();
 |