wp/wp-includes/rest-api/endpoints/class-wp-rest-edit-site-export-controller.php
changeset 19 3d72ae0968f4
child 22 8c2e4d02f4ef
equal deleted inserted replaced
18:be944660c56a 19:3d72ae0968f4
       
     1 <?php
       
     2 /**
       
     3  * REST API: WP_REST_Edit_Site_Export_Controller class
       
     4  *
       
     5  * @package    WordPress
       
     6  * @subpackage REST_API
       
     7  */
       
     8 
       
     9 /**
       
    10  * Controller which provides REST endpoint for exporting current templates
       
    11  * and template parts.
       
    12  *
       
    13  * @since 5.9.0
       
    14  *
       
    15  * @see WP_REST_Controller
       
    16  */
       
    17 class WP_REST_Edit_Site_Export_Controller extends WP_REST_Controller {
       
    18 
       
    19 	/**
       
    20 	 * Constructor.
       
    21 	 *
       
    22 	 * @since 5.9.0
       
    23 	 */
       
    24 	public function __construct() {
       
    25 		$this->namespace = 'wp-block-editor/v1';
       
    26 		$this->rest_base = 'export';
       
    27 	}
       
    28 
       
    29 	/**
       
    30 	 * Registers the site export route.
       
    31 	 *
       
    32 	 * @since 5.9.0
       
    33 	 */
       
    34 	public function register_routes() {
       
    35 		register_rest_route(
       
    36 			$this->namespace,
       
    37 			'/' . $this->rest_base,
       
    38 			array(
       
    39 				array(
       
    40 					'methods'             => WP_REST_Server::READABLE,
       
    41 					'callback'            => array( $this, 'export' ),
       
    42 					'permission_callback' => array( $this, 'permissions_check' ),
       
    43 				),
       
    44 			)
       
    45 		);
       
    46 	}
       
    47 
       
    48 	/**
       
    49 	 * Checks whether a given request has permission to export.
       
    50 	 *
       
    51 	 * @since 5.9.0
       
    52 	 *
       
    53 	 * @return WP_Error|true True if the request has access, or WP_Error object.
       
    54 	 */
       
    55 	public function permissions_check() {
       
    56 		if ( current_user_can( 'edit_theme_options' ) ) {
       
    57 			return true;
       
    58 		}
       
    59 
       
    60 		return new WP_Error(
       
    61 			'rest_cannot_export_templates',
       
    62 			__( 'Sorry, you are not allowed to export templates and template parts.' ),
       
    63 			array( 'status' => rest_authorization_required_code() )
       
    64 		);
       
    65 	}
       
    66 
       
    67 	/**
       
    68 	 * Output a ZIP file with an export of the current templates
       
    69 	 * and template parts from the site editor, and close the connection.
       
    70 	 *
       
    71 	 * @since 5.9.0
       
    72 	 *
       
    73 	 * @return WP_Error|void
       
    74 	 */
       
    75 	public function export() {
       
    76 		// Generate the export file.
       
    77 		$filename = wp_generate_block_templates_export_file();
       
    78 
       
    79 		if ( is_wp_error( $filename ) ) {
       
    80 			$filename->add_data( array( 'status' => 500 ) );
       
    81 
       
    82 			return $filename;
       
    83 		}
       
    84 
       
    85 		$theme_name = basename( get_stylesheet() );
       
    86 		header( 'Content-Type: application/zip' );
       
    87 		header( 'Content-Disposition: attachment; filename=' . $theme_name . '.zip' );
       
    88 		header( 'Content-Length: ' . filesize( $filename ) );
       
    89 		flush();
       
    90 		readfile( $filename );
       
    91 		unlink( $filename );
       
    92 		exit;
       
    93 	}
       
    94 }