|
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 } |