PluginProbe
Elementor Website Builder – more than just a page builder / 3.13.2
Elementor Website Builder – more than just a page builder v3.13.2
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / app / modules / import-export / processes / export.php

export.php in Elementor Website Builder – more than just a page builder 3.13.2, at app/modules/import-export/processes/export.php

335 lines 9.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\App\Modules\ImportExport\Processes;
4
5 use Elementor\App\Modules\ImportExport\Module;
6 use Elementor\App\Modules\ImportExport\Utils;
7 use Elementor\Core\Utils\Str;
8 use Elementor\Plugin;
9
10 use Elementor\App\Modules\ImportExport\Runners\Export\Elementor_Content;
11 use Elementor\App\Modules\ImportExport\Runners\Export\Export_Runner_Base;
12 use Elementor\App\Modules\ImportExport\Runners\Export\Plugins;
13 use Elementor\App\Modules\ImportExport\Runners\Export\Site_Settings;
14 use Elementor\App\Modules\ImportExport\Runners\Export\Taxonomies;
15 use Elementor\App\Modules\ImportExport\Runners\Export\Templates;
16 use Elementor\App\Modules\ImportExport\Runners\Export\Wp_Content;
17
18 class Export {
19 const ZIP_ARCHIVE_MODULE_MISSING = 'zip-archive-module-is-missing';
20
21 /**
22 * @var Export_Runner_Base[]
23 */
24 protected $runners = [];
25
26 /**
27 * Selected content types to export.
28 *
29 * @var array
30 */
31 private $settings_include;
32
33 /**
34 * The kit information. (e.g: title, description)
35 *
36 * @var array $export_data
37 */
38 private $settings_kit_info;
39
40 /**
41 * Selected plugins to export.
42 * Contains the plugins essential data for export. (e.g: name, path, version, etc.)
43 *
44 * @var array
45 */
46 private $settings_selected_plugins;
47
48 /**
49 * Selected custom post types to export.
50 *
51 * @var array
52 */
53 private $settings_selected_custom_post_types;
54
55 /**
56 * The output data of the export process.
57 * Will be written into the manifest.json file.
58 *
59 * @var array
60 */
61 private $manifest_data;
62
63 /**
64 * The zip archive object.
65 *
66 * @var \ZipArchive
67 */
68 private $zip;
69
70 public function __construct( $settings = [] ) {
71 $this->settings_include = ! empty( $settings['include'] ) ? $settings['include'] : null;
72 $this->settings_kit_info = ! empty( $settings['kitInfo'] ) ? $settings['kitInfo'] : null;
73 $this->settings_selected_plugins = isset( $settings['plugins'] ) ? $settings['plugins'] : null;
74 $this->settings_selected_custom_post_types = isset( $settings['selectedCustomPostTypes'] ) ? $settings['selectedCustomPostTypes'] : null;
75 }
76
77 /**
78 * Register a runner.
79 *
80 * @param Export_Runner_Base $runner_instance
81 */
82 public function register( Export_Runner_Base $runner_instance ) {
83 $this->runners[ $runner_instance::get_name() ] = $runner_instance;
84 }
85
86 public function register_default_runners() {
87 $this->register( new Site_Settings() );
88 $this->register( new Plugins() );
89 $this->register( new Templates() );
90 $this->register( new Taxonomies() );
91 $this->register( new Elementor_Content() );
92 $this->register( new Wp_Content() );
93 }
94
95 /**
96 * Execute the export process.
97 *
98 * @return array The export data output.
99 *
100 * @throws \Exception If no export runners have been specified.
101 */
102 public function run() {
103 if ( empty( $this->runners ) ) {
104 throw new \Exception( 'Couldn’t execute the export process because no export runners have been specified. Try again by specifying export runners.' );
105 }
106
107 $this->set_default_settings();
108
109 $this->init_zip_archive();
110 $this->init_manifest_data();
111
112 $data = [
113 'include' => $this->settings_include,
114 'selected_plugins' => $this->settings_selected_plugins,
115 'selected_custom_post_types' => $this->settings_selected_custom_post_types,
116 ];
117
118 foreach ( $this->runners as $runner ) {
119 if ( $runner->should_export( $data ) ) {
120 $export_result = $runner->export( $data );
121 $this->handle_export_result( $export_result );
122 }
123 }
124
125 $this->add_json_file( 'manifest', $this->manifest_data );
126
127 $zip_file_name = $this->zip->filename;
128 $this->zip->close();
129
130 return [
131 'manifest' => $this->manifest_data,
132 'file_name' => $zip_file_name,
133 ];
134 }
135
136 /**
137 * Set default settings for the export.
138 */
139 private function set_default_settings() {
140 if ( ! is_array( $this->get_settings_include() ) ) {
141 $this->settings_include( $this->get_default_settings_include() );
142 }
143
144 if ( ! is_array( $this->get_settings_kit_info() ) ) {
145 $this->settings_kit_info( $this->get_default_settings_kit_info() );
146 }
147
148 if ( ! is_array( $this->get_settings_selected_custom_post_types() ) && in_array( 'content', $this->settings_include, true ) ) {
149 $this->settings_selected_custom_post_types( $this->get_default_settings_custom_post_types() );
150 }
151
152 if ( ! is_array( $this->get_settings_selected_plugins() ) && in_array( 'plugins', $this->settings_include, true ) ) {
153 $this->settings_selected_plugins( $this->get_default_settings_selected_plugins() );
154 }
155 }
156
157 public function settings_include( $include ) {
158 $this->settings_include = $include;
159 }
160
161 public function get_settings_include() {
162 return $this->settings_include;
163 }
164
165 private function settings_kit_info( $kit_info ) {
166 $this->settings_kit_info = $kit_info;
167 }
168
169 private function get_settings_kit_info() {
170 return $this->settings_kit_info;
171 }
172
173 public function settings_selected_custom_post_types( $selected_custom_post_types ) {
174 $this->settings_selected_custom_post_types = $selected_custom_post_types;
175 }
176
177 public function get_settings_selected_custom_post_types() {
178 return $this->settings_selected_custom_post_types;
179 }
180
181 public function settings_selected_plugins( $plugins ) {
182 $this->settings_selected_plugins = $plugins;
183 }
184
185 public function get_settings_selected_plugins() {
186 return $this->settings_selected_plugins;
187 }
188
189 /**
190 * Get the default settings of which content types should be exported.
191 *
192 * @return array
193 */
194 private function get_default_settings_include() {
195 return [ 'templates', 'content', 'settings', 'plugins' ];
196 }
197
198 /**
199 * Get the default settings of the kit info.
200 *
201 * @return array
202 */
203 private function get_default_settings_kit_info() {
204 return [
205 'title' => 'kit',
206 'description' => '',
207 ];
208 }
209
210 /**
211 * Get the default settings of the plugins that should be exported.
212 *
213 * @return array{name: string, plugin:string, pluginUri: string, version: string}
214 */
215 private function get_default_settings_selected_plugins() {
216 $installed_plugins = Plugin::$instance->wp->get_plugins();
217
218 return $installed_plugins->map( function ( $item, $key ) {
219 return [
220 'name' => $item['Name'],
221 'plugin' => $key,
222 'pluginUri' => $item['PluginURI'],
223 'version' => $item['Version'],
224 ];
225 } )->all();
226 }
227
228 /**
229 * Get the default settings of all the custom post types that should be exported.
230 * Should be all the custom post types that are not built in to WordPress and not part of Elementor.
231 *
232 * @return array
233 */
234 private function get_default_settings_custom_post_types() {
235 return Utils::get_registered_cpt_names();
236 }
237
238 /**
239 * Init the zip archive.
240 */
241 private function init_zip_archive() {
242 if ( ! class_exists( '\ZipArchive' ) ) {
243 throw new \Error( static::ZIP_ARCHIVE_MODULE_MISSING );
244 }
245
246 $zip = new \ZipArchive();
247
248 $temp_dir = Plugin::$instance->uploads_manager->create_unique_dir();
249
250 $zip_file_name = $temp_dir . sanitize_title( $this->settings_kit_info['title'] ) . '.zip';
251
252 $zip->open( $zip_file_name, \ZipArchive::CREATE | \ZipArchive::OVERWRITE );
253
254 $this->zip = $zip;
255 }
256
257 /**
258 * Init the manifest data and add some basic info to it.
259 */
260 private function init_manifest_data() {
261 $kit_post = Plugin::$instance->kits_manager->get_active_kit()->get_post();
262
263 $manifest_data = [
264 'name' => sanitize_title( $this->settings_kit_info['title'] ),
265 'title' => $this->settings_kit_info['title'],
266 'description' => $this->settings_kit_info['description'],
267 'author' => get_the_author_meta( 'display_name', $kit_post->post_author ),
268 'version' => Module::FORMAT_VERSION,
269 'elementor_version' => ELEMENTOR_VERSION,
270 'created' => gmdate( 'Y-m-d H:i:s' ),
271 'thumbnail' => get_the_post_thumbnail_url( $kit_post ),
272 'site' => get_site_url(),
273 ];
274
275 $this->manifest_data = $manifest_data;
276 }
277
278 /**
279 * Handle the export process output.
280 * Add the manifest data from the runner to the manifest.json file.
281 * Create files according to the files array that should be exported by the runner.
282 *
283 * @param array $export_result
284 */
285 private function handle_export_result( $export_result ) {
286 foreach ( $export_result['manifest'] as $data ) {
287 $this->manifest_data += $data;
288 }
289
290 if ( isset( $export_result['files']['path'] ) ) {
291 $export_result['files'] = [ $export_result['files'] ];
292 }
293
294 foreach ( $export_result['files'] as $file ) {
295 $file_extension = pathinfo( $file['path'], PATHINFO_EXTENSION );
296 if ( empty( $file_extension ) ) {
297 $this->add_json_file(
298 $file['path'],
299 $file['data']
300 );
301 } else {
302 $this->add_file(
303 $file['path'],
304 $file['data']
305 );
306 }
307 }
308 }
309
310 /**
311 * Add json file to the zip archive.
312 *
313 * @param string $path The relative path to the file.
314 * @param array $content The content of the file.
315 * @param int $json_flags
316 */
317 private function add_json_file( $path, array $content, $json_flags = 0 ) {
318 if ( ! Str::ends_with( $path, '.json' ) ) {
319 $path .= '.json';
320 }
321
322 $this->add_file( $path, wp_json_encode( $content, $json_flags ) );
323 }
324
325 /**
326 * Add file to the zip archive.
327 *
328 * @param string $file
329 * @param string $content The content of the file.
330 */
331 private function add_file( $file, $content ) {
332 $this->zip->addFromString( $file, $content );
333 }
334 }
335