542 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			542 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Rest API functions
 | |
|  *
 | |
|  * @package GenerateBlocks
 | |
|  */
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Class GenerateBlocks_Rest
 | |
|  */
 | |
| class GeneratePress_Pro_Rest extends WP_REST_Controller {
 | |
| 	/**
 | |
| 	 * Instance.
 | |
| 	 *
 | |
| 	 * @access private
 | |
| 	 * @var object Instance
 | |
| 	 */
 | |
| 	private static $instance;
 | |
| 
 | |
| 	/**
 | |
| 	 * Namespace.
 | |
| 	 *
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $namespace = 'generatepress-pro/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;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * GeneratePress_Pro_Rest constructor.
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 		add_action( 'rest_api_init', array( $this, 'register_routes' ) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Register rest routes.
 | |
| 	 */
 | |
| 	public function register_routes() {
 | |
| 		$namespace = $this->namespace . $this->version;
 | |
| 
 | |
| 		register_rest_route(
 | |
| 			$namespace,
 | |
| 			'/modules/',
 | |
| 			array(
 | |
| 				'methods'             => WP_REST_Server::EDITABLE,
 | |
| 				'callback'            => array( $this, 'update_module' ),
 | |
| 				'permission_callback' => array( $this, 'update_settings_permission' ),
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		register_rest_route(
 | |
| 			$namespace,
 | |
| 			'/license/',
 | |
| 			array(
 | |
| 				'methods'             => WP_REST_Server::EDITABLE,
 | |
| 				'callback'            => array( $this, 'update_licensing' ),
 | |
| 				'permission_callback' => array( $this, 'update_settings_permission' ),
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		register_rest_route(
 | |
| 			$namespace,
 | |
| 			'/export/',
 | |
| 			array(
 | |
| 				'methods'             => WP_REST_Server::EDITABLE,
 | |
| 				'callback'            => array( $this, 'export' ),
 | |
| 				'permission_callback' => array( $this, 'update_settings_permission' ),
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		register_rest_route(
 | |
| 			$namespace,
 | |
| 			'/import/',
 | |
| 			array(
 | |
| 				'methods'             => WP_REST_Server::EDITABLE,
 | |
| 				'callback'            => array( $this, 'import' ),
 | |
| 				'permission_callback' => array( $this, 'update_settings_permission' ),
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		register_rest_route(
 | |
| 			$namespace,
 | |
| 			'/reset/',
 | |
| 			array(
 | |
| 				'methods'             => WP_REST_Server::EDITABLE,
 | |
| 				'callback'            => array( $this, 'reset' ),
 | |
| 				'permission_callback' => array( $this, 'update_settings_permission' ),
 | |
| 			)
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get edit options permissions.
 | |
| 	 *
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public function update_settings_permission() {
 | |
| 		return current_user_can( 'manage_options' );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Update modules.
 | |
| 	 *
 | |
| 	 * @param WP_REST_Request $request request object.
 | |
| 	 *
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	public function update_module( WP_REST_Request $request ) {
 | |
| 		$module_key = $request->get_param( 'key' );
 | |
| 		$action = $request->get_param( 'action' );
 | |
| 		$current_setting = get_option( $module_key, false );
 | |
| 		$modules = GeneratePress_Pro_Dashboard::get_modules();
 | |
| 		$safe_module_keys = array();
 | |
| 
 | |
| 		foreach ( $modules as $key => $data ) {
 | |
| 			$safe_module_keys[] = $data['key'];
 | |
| 		}
 | |
| 
 | |
| 		if ( ! in_array( $module_key, $safe_module_keys ) ) {
 | |
| 			return $this->failed( 'Bad module key.' );
 | |
| 		}
 | |
| 
 | |
| 		$message = '';
 | |
| 
 | |
| 		if ( 'activate' === $action ) {
 | |
| 			update_option( $module_key, 'activated' );
 | |
| 			$message = __( 'Module activated.', 'gp-premium' );
 | |
| 		}
 | |
| 
 | |
| 		if ( 'deactivate' === $action ) {
 | |
| 			update_option( $module_key, 'deactivated' );
 | |
| 			$message = __( 'Module deactivated.', 'gp-premium' );
 | |
| 		}
 | |
| 
 | |
| 		return $this->success( $message );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Update licensing.
 | |
| 	 *
 | |
| 	 * @param WP_REST_Request $request request object.
 | |
| 	 *
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	public function update_licensing( WP_REST_Request $request ) {
 | |
| 		$new_license_key = $request->get_param( 'key' );
 | |
| 		$new_beta_tester = $request->get_param( 'betaTester' );
 | |
| 		$old_license = get_option( 'gen_premium_license_key', '' );
 | |
| 		$old_status = get_option( 'gen_premium_license_key_status', 'deactivated' );
 | |
| 		$new_license = strpos( $new_license_key, '***' ) !== false
 | |
| 			? trim( $old_license )
 | |
| 			: trim( $new_license_key );
 | |
| 
 | |
| 
 | |
| 		if ( $new_license ) {
 | |
| 			$api_params = array(
 | |
| 				'edd_action' => 'activate_license',
 | |
| 				'license'    => sanitize_key( $new_license ),
 | |
| 				'item_name'  => rawurlencode( 'GP Premium' ),
 | |
| 				'url'        => home_url(),
 | |
| 			);
 | |
| 		} elseif ( $old_license && 'valid' === $old_status ) {
 | |
| 			$api_params = array(
 | |
| 				'edd_action' => 'deactivate_license',
 | |
| 				'license'    => sanitize_key( $old_license ),
 | |
| 				'item_name'  => rawurlencode( 'GP Premium' ),
 | |
| 				'url'        => home_url(),
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $api_params ) ) {
 | |
| 			$response = wp_remote_post(
 | |
| 				'https://generatepress.com',
 | |
| 				array(
 | |
| 					'timeout' => 30,
 | |
| 					'sslverify' => false,
 | |
| 					'body' => $api_params,
 | |
| 				)
 | |
| 			);
 | |
| 
 | |
| 			if ( is_wp_error( $response ) || 200 !== (int) wp_remote_retrieve_response_code( $response ) ) {
 | |
| 				if ( is_object( $response ) ) {
 | |
| 					return $this->failed( $response->get_error_message() );
 | |
| 				} elseif ( is_array( $response ) && isset( $response['response']['message'] ) ) {
 | |
| 					if ( 'Forbidden' === $response['response']['message'] ) {
 | |
| 						$message = __( '403 Forbidden. Your server is not able to communicate with generatepress.com in order to activate your license key.', 'gp-premium' );
 | |
| 					} else {
 | |
| 						$message = $response['response']['message'];
 | |
| 					}
 | |
| 				}
 | |
| 			} else {
 | |
| 				$license_data = json_decode( wp_remote_retrieve_body( $response ) );
 | |
| 
 | |
| 				if ( false === $license_data->success ) {
 | |
| 					switch ( $license_data->error ) {
 | |
| 						case 'expired':
 | |
| 							$message = sprintf(
 | |
| 								/* translators: License key expiration date. */
 | |
| 								__( 'Your license key expired on %s.', 'gp-premium' ),
 | |
| 								date_i18n( get_option( 'date_format' ), strtotime( $license_data->expires, current_time( 'timestamp' ) ) ) // phpcs:ignore
 | |
| 							);
 | |
| 							break;
 | |
| 
 | |
| 						case 'disabled':
 | |
| 						case 'revoked':
 | |
| 							$message = __( 'Your license key has been disabled.', 'gp-premium' );
 | |
| 							break;
 | |
| 
 | |
| 						case 'missing':
 | |
| 							$message = __( 'Invalid license.', 'gp-premium' );
 | |
| 							break;
 | |
| 
 | |
| 						case 'invalid':
 | |
| 						case 'site_inactive':
 | |
| 							$message = __( 'Your license is not active for this URL.', 'gp-premium' );
 | |
| 							break;
 | |
| 
 | |
| 						case 'item_name_mismatch':
 | |
| 							/* translators: GP Premium */
 | |
| 							$message = sprintf( __( 'This appears to be an invalid license key for %s.', 'gp-premium' ), __( 'GP Premium', 'gp-premium' ) );
 | |
| 							break;
 | |
| 
 | |
| 						case 'no_activations_left':
 | |
| 							$message = __( 'Your license key has reached its activation limit.', 'gp-premium' );
 | |
| 							break;
 | |
| 
 | |
| 						default:
 | |
| 							$message = __( 'An error occurred, please try again.', 'gp-premium' );
 | |
| 							break;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			update_option( 'gen_premium_license_key_status', esc_attr( $license_data->license ) );
 | |
| 		}
 | |
| 
 | |
| 		if ( ! empty( $new_beta_tester ) ) {
 | |
| 			update_option( 'gp_premium_beta_testing', true, false );
 | |
| 		} else {
 | |
| 			delete_option( 'gp_premium_beta_testing' );
 | |
| 		}
 | |
| 
 | |
| 		update_option( 'gen_premium_license_key', sanitize_key( $new_license ) );
 | |
| 
 | |
| 		if ( ! isset( $api_params ) ) {
 | |
| 			return $this->success( __( 'Settings saved.', 'gp-premium' ) );
 | |
| 		}
 | |
| 
 | |
| 		if ( ! empty( $message ) ) {
 | |
| 			return $this->failed( $message );
 | |
| 		}
 | |
| 
 | |
| 		return $this->success( $license_data );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Export settings.
 | |
| 	 *
 | |
| 	 * @param WP_REST_Request $request request object.
 | |
| 	 *
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	public function export( WP_REST_Request $request ) {
 | |
| 		$exportable_modules = $request->get_param( 'items' );
 | |
| 
 | |
| 		if ( ! $exportable_modules ) {
 | |
| 			$exportable_modules = GeneratePress_Pro_Dashboard::get_exportable_modules();
 | |
| 		}
 | |
| 
 | |
| 		$export_type = $request->get_param( 'type' );
 | |
| 
 | |
| 		if ( 'all' === $export_type ) {
 | |
| 			$data = array(
 | |
| 				'modules' => array(),
 | |
| 				'mods' => array(),
 | |
| 				'options' => array(),
 | |
| 			);
 | |
| 
 | |
| 			$module_settings = array();
 | |
| 
 | |
| 			foreach ( $exportable_modules as $exported_module_key => $exported_module_data ) {
 | |
| 				if ( isset( $exported_module_data['settings'] ) ) {
 | |
| 					$module_settings[] = $exported_module_data['settings'];
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			$modules = GeneratePress_Pro_Dashboard::get_modules();
 | |
| 
 | |
| 			// Export module status of the exported options.
 | |
| 			foreach ( $modules as $module_key => $module_data ) {
 | |
| 				if ( isset( $module_data['settings'] ) && in_array( $module_data['settings'], $module_settings ) ) {
 | |
| 					$data['modules'][ $module_key ] = $module_data['key'];
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			$theme_mods = GeneratePress_Pro_Dashboard::get_theme_mods();
 | |
| 
 | |
| 			foreach ( $theme_mods as $theme_mod ) {
 | |
| 				if ( 'generate_copyright' === $theme_mod ) {
 | |
| 					if ( in_array( 'copyright', $module_settings ) ) {
 | |
| 						$data['mods'][ $theme_mod ] = get_theme_mod( $theme_mod );
 | |
| 					}
 | |
| 				} else {
 | |
| 					if ( in_array( 'generate_settings', $module_settings ) ) {
 | |
| 						$data['mods'][ $theme_mod ] = get_theme_mod( $theme_mod );
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			$settings = GeneratePress_Pro_Dashboard::get_setting_keys();
 | |
| 
 | |
| 			foreach ( $settings as $setting ) {
 | |
| 				if ( in_array( $setting, $module_settings ) ) {
 | |
| 					$data['options'][ $setting ] = get_option( $setting );
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( 'global-colors' === $export_type ) {
 | |
| 			$data['global-colors'] = generate_get_option( 'global_colors' );
 | |
| 		}
 | |
| 
 | |
| 		if ( 'typography' === $export_type ) {
 | |
| 			$data['font-manager'] = generate_get_option( 'font_manager' );
 | |
| 			$data['typography'] = generate_get_option( 'typography' );
 | |
| 		}
 | |
| 
 | |
| 		$data = apply_filters( 'generate_export_data', $data, $export_type );
 | |
| 
 | |
| 		return $this->success( $data );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Import settings.
 | |
| 	 *
 | |
| 	 * @param WP_REST_Request $request request object.
 | |
| 	 *
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	public function import( WP_REST_Request $request ) {
 | |
| 		$settings = $request->get_param( 'import' );
 | |
| 
 | |
| 		if ( empty( $settings ) ) {
 | |
| 			$this->failed( __( 'No settings to import.', 'gp-premium' ) );
 | |
| 		}
 | |
| 
 | |
| 		if ( ! empty( $settings['typography'] ) ) {
 | |
| 			$existing_settings = get_option( 'generate_settings', array() );
 | |
| 			$existing_settings['typography'] = $settings['typography'];
 | |
| 
 | |
| 			if ( ! empty( $settings['font-manager'] ) ) {
 | |
| 				$existing_settings['font_manager'] = $settings['font-manager'];
 | |
| 			}
 | |
| 
 | |
| 			update_option( 'generate_settings', $existing_settings );
 | |
| 		} elseif ( ! empty( $settings['global-colors'] ) ) {
 | |
| 			$existing_settings = get_option( 'generate_settings', array() );
 | |
| 			$existing_settings['global_colors'] = $settings['global-colors'];
 | |
| 
 | |
| 			update_option( 'generate_settings', $existing_settings );
 | |
| 		} else {
 | |
| 			$modules = GeneratePress_Pro_Dashboard::get_modules();
 | |
| 
 | |
| 			foreach ( (array) $settings['modules'] as $key => $val ) {
 | |
| 				if ( isset( $modules[ $key ] ) && in_array( $val, $modules[ $key ] ) ) {
 | |
| 					update_option( $val, 'activated' );
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			foreach ( (array) $settings['mods'] as $key => $val ) {
 | |
| 				if ( in_array( $key, GeneratePress_Pro_Dashboard::get_theme_mods() ) ) {
 | |
| 					set_theme_mod( $key, $val );
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			foreach ( (array) $settings['options'] as $key => $val ) {
 | |
| 				if ( in_array( $key, GeneratePress_Pro_Dashboard::get_setting_keys() ) ) {
 | |
| 					update_option( $key, $val );
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Delete existing 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 );
 | |
| 
 | |
| 		return $this->success( __( 'Settings imported.', 'gp-premium' ) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Reset settings.
 | |
| 	 *
 | |
| 	 * @param WP_REST_Request $request request object.
 | |
| 	 *
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	public function reset( WP_REST_Request $request ) {
 | |
| 		$reset_items = $request->get_param( 'items' );
 | |
| 
 | |
| 		if ( ! $reset_items ) {
 | |
| 			$reset_items = GeneratePress_Pro_Dashboard::get_exportable_modules();
 | |
| 		}
 | |
| 
 | |
| 		$module_settings = array();
 | |
| 
 | |
| 		foreach ( $reset_items as $reset_module_key => $reset_module_data ) {
 | |
| 			if ( isset( $reset_module_data['settings'] ) ) {
 | |
| 				$module_settings[] = $reset_module_data['settings'];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$theme_mods = GeneratePress_Pro_Dashboard::get_theme_mods();
 | |
| 
 | |
| 		foreach ( $theme_mods as $theme_mod ) {
 | |
| 			if ( 'generate_copyright' === $theme_mod ) {
 | |
| 				if ( in_array( 'copyright', $module_settings ) ) {
 | |
| 					remove_theme_mod( $theme_mod );
 | |
| 				}
 | |
| 			} else {
 | |
| 				if ( in_array( 'generate_settings', $module_settings ) ) {
 | |
| 					remove_theme_mod( $theme_mod );
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$settings = GeneratePress_Pro_Dashboard::get_setting_keys();
 | |
| 
 | |
| 		foreach ( $settings as $setting ) {
 | |
| 			if ( in_array( $setting, $module_settings ) ) {
 | |
| 				delete_option( $setting );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Delete our dynamic CSS option.
 | |
| 		delete_option( 'generate_dynamic_css_output' );
 | |
| 		delete_option( 'generate_dynamic_css_cached_version' );
 | |
| 
 | |
| 		// Reset our dynamic CSS file updated time so it regenerates.
 | |
| 		$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 );
 | |
| 
 | |
| 		// Delete any GeneratePress Site CSS in Additional CSS.
 | |
| 		$additional_css = wp_get_custom_css_post();
 | |
| 
 | |
| 		if ( ! empty( $additional_css ) ) {
 | |
| 			$additional_css->post_content = preg_replace( '#(/\\* GeneratePress Site CSS \\*/).*?(/\\* End GeneratePress Site CSS \\*/)#s', '', $additional_css->post_content );
 | |
| 			wp_update_custom_css_post( $additional_css->post_content );
 | |
| 		}
 | |
| 
 | |
| 		return $this->success( __( 'Settings reset.', '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_Pro_Rest::get_instance();
 |