PluginProbe
Elementor Website Builder – more than just a page builder / 3.10.0-dev1
Elementor Website Builder – more than just a page builder v3.10.0-dev1
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
← All changes | includes/template-library/manager.php +34 -575 4.0.83.10.0-dev1 View file →
@@ -5,12 +5,10 @@
5 5 use Elementor\Core\Common\Modules\Ajax\Module as Ajax;
6 6 use Elementor\Core\Settings\Manager as SettingsManager;
7 7 use Elementor\Includes\TemplateLibrary\Data\Controller;
8 8 use Elementor\TemplateLibrary\Classes\Import_Images;
9 -use Elementor\Core\Utils\Template_Library_Import_Export_Utils;
10 9 use Elementor\Plugin;
11 10 use Elementor\User;
12 -use Elementor\Utils;
13 11
14 12 if ( ! defined( 'ABSPATH' ) ) {
15 13 exit; // Exit if accessed directly.
16 14 }
@@ -24,11 +22,8 @@
24 22 * @since 1.0.0
25 23 */
26 24 class Manager {
27 25
28 - const ERROR_TEMPLATE_SOURCE_NOT_FOUND = 'Template source not found.';
29 - const ERROR_TEMPLATE_IDS_MISSING = 'Template IDs are missing.';
30 -
31 26 /**
32 27 * Registered template sources.
33 28 *
34 29 * Holds a list of all the supported sources with their instances.
@@ -36,9 +31,9 @@
36 31 * @access protected
37 32 *
38 33 * @var Source_Base[]
39 34 */
40 - protected $_registered_sources = []; // phpcs:ignore PSR2.Classes.PropertyDeclaration.Underscore
35 + protected $_registered_sources = [];
41 36
42 37 /**
43 38 * Imported template images.
44 39 *
@@ -47,9 +42,9 @@
47 42 * @access private
48 43 *
49 44 * @var Import_Images
50 45 */
51 - private $_import_images = null; // phpcs:ignore PSR2.Classes.PropertyDeclaration.Underscore
46 + private $_import_images = null;
52 47
53 48 /**
54 49 * Template library manager constructor.
55 50 *
@@ -136,10 +131,11 @@
136 131 *
137 132 * Remove an existing template sources from the list of registered template
138 133 * sources.
139 134 *
135 + * @deprecated 2.7.0
136 + *
140 137 * @since 1.0.0
141 - * @deprecated 2.7.0
142 138 * @access public
143 139 *
144 140 * @param string $id The source ID.
145 141 *
@@ -190,12 +186,12 @@
190 186 *
191 187 * Retrieve all the templates from all the registered sources.
192 188 *
193 189 * @param array $filter_sources
194 - * @param bool $force_update
190 + *
195 191 * @return array
196 192 */
197 - public function get_templates( array $filter_sources = [], bool $force_update = false ): array {
193 + public function get_templates( $filter_sources = [] ) {
198 194 $templates = [];
199 195
200 196 foreach ( $this->get_registered_sources() as $source ) {
201 197 if ( ! empty( $filter_sources ) && ! in_array( $source->get_id(), $filter_sources, true ) ) {
@@ -201,9 +197,9 @@
201 197 if ( ! empty( $filter_sources ) && ! in_array( $source->get_id(), $filter_sources, true ) ) {
202 198 continue;
203 199 }
204 200
205 - $templates = array_merge( $templates, $source->get_items( [ 'force_update' => $force_update ] ) );
201 + $templates = array_merge( $templates, $source->get_items() );
206 202 }
207 203
208 204 return $templates;
209 205 }
@@ -220,12 +216,10 @@
220 216 *
221 217 * @return array Library data.
222 218 */
223 219 public function get_library_data( array $args ) {
224 - $force_update = ! empty( $args['sync'] );
220 + $library_data = Api::get_library_data( ! empty( $args['sync'] ) );
225 221
226 - $library_data = Api::get_library_data( $force_update );
227 -
228 222 if ( empty( $library_data ) ) {
229 223 return $library_data;
230 224 }
231 225
@@ -233,20 +227,12 @@
233 227 Plugin::$instance->documents->get_document_types();
234 228
235 229 $filter_sources = ! empty( $args['filter_sources'] ) ? $args['filter_sources'] : [];
236 230
237 - $full_library_data = [
238 - 'templates' => $this->get_templates( $filter_sources, $force_update ),
231 + return [
232 + 'templates' => $this->get_templates( $filter_sources ),
239 233 'config' => $library_data['types_data'],
240 234 ];
241 -
242 - /**
243 - * Filter the full library data.
244 - *
245 - * @since 3.32.2
246 - * @param-out $full_library_data - 'templates' and 'config' data ('config' holds the list of categories).
247 - */
248 - return apply_filters( 'elementor/library/full-data', $full_library_data );
249 235 }
250 236
251 237 /**
252 238 * Save template.
@@ -266,25 +252,12 @@
266 252 if ( is_wp_error( $validate_args ) ) {
267 253 return $validate_args;
268 254 }
269 255
270 - $sources = (array) $args['source']; // BC
271 - $results = [];
272 -
273 - foreach ( $sources as $source ) {
274 - $args_copy = $args;
275 - $args_copy['source'] = $source;
276 - $results[] = $this->save_template_item( $args_copy );
277 - }
278 -
279 - return 1 === count( $results ) ? $results[0] : $results;
280 - }
281 -
282 - private function save_template_item( array $args ) {
283 256 $source = $this->get_source( $args['source'] );
284 257
285 258 if ( ! $source ) {
286 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
259 + return new \WP_Error( 'template_error', 'Template source not found.' );
287 260 }
288 261
289 262 $args['content'] = json_decode( $args['content'], true );
290 263
@@ -300,97 +273,8 @@
300 273
301 274 return $source->get_item( $template_id );
302 275 }
303 276
304 - public function move_template( array $args ) {
305 - $validate_args = $this->ensure_args( [ 'source', 'from_source', 'from_template_id' ], $args );
306 -
307 - if ( is_wp_error( $validate_args ) ) {
308 - return $validate_args;
309 - }
310 -
311 - $args['source'] = $args['source'][0];
312 -
313 - $result = $this->move_template_item( $args );
314 -
315 - if ( ! $this->is_action_to_same_source( $args ) ) {
316 - $this->delete_template( [
317 - 'source' => $args['from_source'],
318 - 'template_id' => $args['from_template_id'],
319 - ] );
320 - }
321 -
322 - return $result;
323 - }
324 -
325 - private function move_template_item( array $args ) {
326 - $validate_args = $this->ensure_args( [ 'source', 'from_source', 'from_template_id' ], $args );
327 -
328 - if ( is_wp_error( $validate_args ) ) {
329 - return $validate_args;
330 - }
331 -
332 - $source = $this->get_source( $args['source'] );
333 -
334 - if ( ! $source ) {
335 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
336 - }
337 -
338 - if ( $this->is_action_to_same_source( $args ) ) {
339 - return $source->move_template_to_folder( $args );
340 - }
341 -
342 - $from_source = $this->get_source( $args['from_source'] );
343 -
344 - if ( ! $from_source ) {
345 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
346 - }
347 -
348 - $args = $from_source->format_args_for_single_action( $args );
349 -
350 - $template_id = $source->save_item( $args );
351 -
352 - if ( is_wp_error( $template_id ) ) {
353 - return $template_id;
354 - }
355 -
356 - return $source->get_item( $template_id );
357 - }
358 -
359 - public function copy_template( array $args ) {
360 - $validate_args = $this->ensure_args( [ 'source', 'from_source', 'from_template_id' ], $args );
361 -
362 - if ( is_wp_error( $validate_args ) ) {
363 - return $validate_args;
364 - }
365 -
366 - $source = $this->get_source( $args['source'][0] );
367 -
368 - if ( ! $source ) {
369 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
370 - }
371 -
372 - $from_source = $this->get_source( $args['from_source'] );
373 -
374 - if ( ! $from_source ) {
375 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
376 - }
377 -
378 - $args = $from_source->format_args_for_single_action( $args );
379 -
380 - $template_id = $source->save_item( $args );
381 -
382 - if ( is_wp_error( $template_id ) ) {
383 - return $template_id;
384 - }
385 -
386 - return $source->get_item( $template_id );
387 - }
388 -
389 - private function is_action_to_same_source( $args ) {
390 - return $args['source'] === $args['from_source'];
391 - }
392 -
393 277 /**
394 278 * Update template.
395 279 *
396 280 * Update template on the database.
@@ -412,9 +296,9 @@
412 296
413 297 $source = $this->get_source( $template_data['source'] );
414 298
415 299 if ( ! $source ) {
416 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
300 + return new \WP_Error( 'template_error', 'Template source not found.' );
417 301 }
418 302
419 303 $template_data['content'] = json_decode( $template_data['content'], true );
420 304
@@ -426,30 +310,8 @@
426 310
427 311 return $source->get_item( $template_data['id'] );
428 312 }
429 313
430 - public function rename_template( array $template_data ) {
431 - $validate_args = $this->ensure_args( [ 'source', 'title', 'id' ], $template_data );
432 -
433 - if ( is_wp_error( $validate_args ) ) {
434 - return $validate_args;
435 - }
436 -
437 - $source = $this->get_source( $template_data['source'] );
438 -
439 - if ( ! $source ) {
440 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
441 - }
442 -
443 - $update = $source->update_item( $template_data );
444 -
445 - if ( is_wp_error( $update ) ) {
446 - return $update;
447 - }
448 -
449 - return $source->get_item( $template_data['id'] );
450 - }
451 -
452 314 /**
453 315 * Update templates.
454 316 *
455 317 * Update template on the database.
@@ -491,25 +353,18 @@
491 353 if ( is_wp_error( $validate_args ) ) {
492 354 return $validate_args;
493 355 }
494 356
357 + if ( isset( $args['edit_mode'] ) ) {
358 + Plugin::$instance->editor->set_edit_mode( $args['edit_mode'] );
359 + }
360 +
495 361 $source = $this->get_source( $args['source'] );
496 362
497 363 if ( ! $source ) {
498 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
364 + return new \WP_Error( 'template_error', 'Template source not found.' );
499 365 }
500 366
501 - if ( method_exists( $source, 'is_allowed_to_read_template' ) && ! $source->is_allowed_to_read_template( $args ) ) {
502 - return new \WP_Error(
503 - 'template_error',
504 - esc_html__( 'You do not have permission to access this template.', 'elementor' )
505 - );
506 - }
507 -
508 - if ( isset( $args['edit_mode'] ) ) {
509 - Plugin::$instance->editor->set_edit_mode( $args['edit_mode'] );
510 - }
511 -
512 367 do_action( 'elementor/template-library/before_get_source_data', $args, $source );
513 368
514 369 $data = $source->get_data( $args );
515 370
@@ -540,9 +395,9 @@
540 395
541 396 $source = $this->get_source( $args['source'] );
542 397
543 398 if ( ! $source ) {
544 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
399 + return new \WP_Error( 'template_error', 'Template source not found.' );
545 400 }
546 401
547 402 return $source->delete_template( $args['template_id'] );
548 403 }
@@ -549,10 +404,9 @@
549 404
550 405 /**
551 406 * Export template.
552 407 *
553 - * Export template to a file after ensuring it is a valid Elementor template
554 - * and checking user permissions for private posts.
408 + * Export template to a file.
555 409 *
556 410 * @since 1.0.0
557 411 * @access public
558 412 *
@@ -569,9 +423,9 @@
569 423
570 424 $source = $this->get_source( $args['source'] );
571 425
572 426 if ( ! $source ) {
573 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
427 + return new \WP_Error( 'template_error', 'Template source not found' );
574 428 }
575 429
576 430 return $source->export_template( $args['template_id'] );
577 431 }
@@ -582,10 +436,10 @@
582 436 */
583 437 public function direct_import_template() {
584 438 /** @var Source_Local $source */
585 439 $source = $this->get_source( 'local' );
586 - $file = Utils::get_super_global_value( $_FILES, 'file' ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
587 - return $source->import_template( $file['name'], $file['tmp_name'] );
440 +
441 + return $source->import_template( $_FILES['file']['name'], $_FILES['file']['tmp_name'] );
588 442 }
589 443
590 444 /**
591 445 * Import template.
@@ -610,15 +464,17 @@
610 464 remove_filter( 'elementor/files/allow-file-type/json', [ $this, 'enable_json_template_upload' ] );
611 465 remove_filter( 'elementor/files/allow_unfiltered_upload', [ $this, 'enable_json_template_upload' ] );
612 466
613 467 if ( is_wp_error( $upload_result ) ) {
468 + Plugin::$instance->uploads_manager->remove_file_or_dir( dirname( $upload_result['tmp_name'] ) );
469 +
614 470 return $upload_result;
615 471 }
616 472
617 - $source = $this->get_source( $data['source'] ?? 'local' );
473 + /** @var Source_Local $source_local */
474 + $source_local = $this->get_source( 'local' );
618 475
619 - $import_mode = $data['import_mode'] ?? 'match_site';
620 - $import_result = $source->import_template( $upload_result['name'], $upload_result['tmp_name'], $import_mode );
476 + $import_result = $source_local->import_template( $upload_result['name'], $upload_result['tmp_name'] );
621 477
622 478 // Remove the temporary directory generated for the stream-uploaded file.
623 479 Plugin::$instance->uploads_manager->remove_file_or_dir( dirname( $upload_result['tmp_name'] ) );
624 480
@@ -662,193 +518,8 @@
662 518
663 519 return $source->mark_as_favorite( $args['template_id'], filter_var( $args['favorite'], FILTER_VALIDATE_BOOLEAN ) );
664 520 }
665 521
666 - public function import_from_json( array $args ) {
667 - $validate_args = $this->ensure_args( [ 'editor_post_id', 'elements' ], $args );
668 -
669 - if ( is_wp_error( $validate_args ) ) {
670 - return $validate_args;
671 - }
672 -
673 - $elements = json_decode( $args['elements'], true );
674 -
675 - $document = Plugin::$instance->documents->get( $args['editor_post_id'] );
676 - if ( ! $document ) {
677 - return new \WP_Error( 'template_error', 'Document not found.' );
678 - }
679 -
680 - $import_data = $document->get_import_data( [ 'content' => $elements ] );
681 -
682 - return $import_data['content'];
683 - }
684 -
685 - public function process_global_styles( array $args ) {
686 - $validate_args = $this->ensure_args( [ 'content', 'import_mode' ], $args );
687 -
688 - if ( is_wp_error( $validate_args ) ) {
689 - return $validate_args;
690 - }
691 -
692 - $import_mode = Template_Library_Import_Export_Utils::sanitize_import_mode( $args['import_mode'] );
693 -
694 - $content = $this->get_validated_json_arg( $args, 'content' );
695 - if ( is_wp_error( $content ) ) {
696 - return $content;
697 - }
698 -
699 - $global_classes = $this->get_validated_json_arg( $args, 'global_classes', true );
700 - if ( is_wp_error( $global_classes ) ) {
701 - return $global_classes;
702 - }
703 -
704 - $global_variables = $this->get_validated_json_arg( $args, 'global_variables', true );
705 - if ( is_wp_error( $global_variables ) ) {
706 - return $global_variables;
707 - }
708 -
709 - $data = [
710 - 'global_classes' => $global_classes,
711 - 'global_variables' => $global_variables,
712 - ];
713 -
714 - $result = apply_filters(
715 - 'elementor/template_library/import/process_content',
716 - [ 'content' => $content ],
717 - $import_mode,
718 - $data,
719 - null
720 - );
721 -
722 - $response = [
723 - 'content' => $result['content'],
724 - ];
725 -
726 - if ( ! empty( $result['updated_global_classes'] ) ) {
727 - $response['updated_global_classes'] = $result['updated_global_classes'];
728 - }
729 -
730 - if ( ! empty( $result['updated_global_variables'] ) ) {
731 - $response['updated_global_variables'] = $result['updated_global_variables'];
732 - }
733 -
734 - $classes_to_flatten = $result['classes_to_flatten'] ?? [];
735 - $variables_to_flatten = $result['variables_to_flatten'] ?? [];
736 -
737 - if ( ! empty( $classes_to_flatten ) ) {
738 - $response['flattened_classes_count'] = count( $classes_to_flatten );
739 - }
740 -
741 - if ( ! empty( $variables_to_flatten ) ) {
742 - $response['flattened_variables_count'] = count( $variables_to_flatten );
743 - }
744 -
745 - return $response;
746 - }
747 -
748 - private function get_validated_json_arg( array $args, string $key, bool $is_optional = false ) {
749 - if ( ! array_key_exists( $key, $args ) || null === $args[ $key ] || '' === $args[ $key ] ) {
750 - return $is_optional ? null : new \WP_Error( "invalid_$key", "Invalid $key." );
751 - }
752 -
753 - $value = $args[ $key ];
754 - if ( is_string( $value ) ) {
755 - $decoded = json_decode( $value, true );
756 - if ( JSON_ERROR_NONE !== json_last_error() ) {
757 - return new \WP_Error( "invalid_$key", "Invalid JSON $key." );
758 - }
759 - return $decoded;
760 - }
761 -
762 - if ( ! is_array( $value ) ) {
763 - return new \WP_Error( "invalid_$key", "Invalid $key format." );
764 - }
765 -
766 - return $value;
767 - }
768 -
769 - public function get_item_children( array $args ) {
770 - $validate_args = $this->ensure_args( [ 'source', 'template_id' ], $args );
771 -
772 - if ( is_wp_error( $validate_args ) ) {
773 - return $validate_args;
774 - }
775 -
776 - $source = $this->get_source( $args['source'] );
777 -
778 - if ( ! $source ) {
779 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
780 - }
781 -
782 - return $source->get_item_children( $args );
783 - }
784 -
785 - public function search_templates( array $args ) {
786 - $validate_args = $this->ensure_args( [ 'source', 'search' ], $args );
787 -
788 - if ( is_wp_error( $validate_args ) ) {
789 - return $validate_args;
790 - }
791 -
792 - $source = $this->get_source( $args['source'] );
793 -
794 - if ( ! $source ) {
795 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
796 - }
797 -
798 - return $source->search_templates( $args );
799 - }
800 -
801 - public function load_more_templates( array $args ) {
802 - $validate_args = $this->ensure_args( [ 'source', 'offset' ], $args );
803 -
804 - if ( is_wp_error( $validate_args ) ) {
805 - return $validate_args;
806 - }
807 -
808 - $source = $this->get_source( $args['source'] );
809 -
810 - if ( ! $source ) {
811 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
812 - }
813 -
814 - return $source->get_items( $args );
815 - }
816 -
817 - public function create_folder( array $args ) {
818 - $validate_args = $this->ensure_args( [ 'source', 'title' ], $args );
819 -
820 - if ( is_wp_error( $validate_args ) ) {
821 - return $validate_args;
822 - }
823 -
824 - $source = $this->get_source( $args['source'] );
825 -
826 - if ( ! $source ) {
827 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
828 - }
829 -
830 - return $source->save_folder( $args );
831 - }
832 -
833 - public function get_folders( array $args ) {
834 - $validate_args = $this->ensure_args( [ 'source', 'offset' ], $args );
835 -
836 - if ( is_wp_error( $validate_args ) ) {
837 - return $validate_args;
838 - }
839 -
840 - $source = $this->get_source( $args['source'] );
841 -
842 - if ( ! $source ) {
843 - return new \WP_Error( 'template_error', 'Folder source not found.' );
844 - }
845 -
846 - $args['templateType'] = 'folder';
847 -
848 - return $source->get_items( $args );
849 - }
850 -
851 522 /**
852 523 * Register default template sources.
853 524 *
854 525 * Register the 'local' and 'remote' template sources that Elementor use by
@@ -860,9 +531,8 @@
860 531 private function register_default_sources() {
861 532 $sources = [
862 533 'local',
863 534 'remote',
864 - 'cloud',
865 535 ];
866 536
867 537 foreach ( $sources as $source_filename ) {
868 538 $class_name = ucwords( $source_filename );
@@ -881,16 +551,16 @@
881 551 * @access private
882 552 *
883 553 * @param string $ajax_request Ajax request.
884 554 *
885 - * @param array $data
555 + * @param array $data
886 556 *
887 557 * @return mixed
888 - * @throws \Exception If current user has no permission or the post is not found.
558 + * @throws \Exception
889 559 */
890 560 private function handle_ajax_request( $ajax_request, array $data ) {
891 561 if ( ! User::is_current_user_can_edit_post_type( Source_Local::CPT ) ) {
892 - throw new \Exception( 'Access denied.' );
562 + throw new \Exception( 'Access Denied' );
893 563 }
894 564
895 565 if ( ! empty( $data['editor_post_id'] ) ) {
896 566 $editor_post_id = absint( $data['editor_post_id'] );
@@ -895,9 +565,9 @@
895 565 if ( ! empty( $data['editor_post_id'] ) ) {
896 566 $editor_post_id = absint( $data['editor_post_id'] );
897 567
898 568 if ( ! get_post( $editor_post_id ) ) {
899 - throw new \Exception( 'Post not found.' );
569 + throw new \Exception( esc_html__( 'Post not found.', 'elementor' ) );
900 570 }
901 571
902 572 Plugin::$instance->db->switch_to_post( $editor_post_id );
903 573 }
@@ -904,9 +574,9 @@
904 574
905 575 $result = call_user_func( [ $this, $ajax_request ], $data );
906 576
907 577 if ( is_wp_error( $result ) ) {
908 - throw new \Exception( esc_html( $result->get_error_message() ) );
578 + throw new \Exception( $result->get_error_message() );
909 579 }
910 580
911 581 return $result;
912 582 }
@@ -911,76 +581,8 @@
911 581 return $result;
912 582 }
913 583
914 584 /**
915 - * @throws \Exception If template import fails, file validation errors occur, or processing encounters issues.
916 - */
917 - public function save_template_screenshot( $data ): string {
918 - $validate_args = $this->ensure_args( [ 'template_id', 'screenshot' ], $data );
919 -
920 - if ( is_wp_error( $validate_args ) ) {
921 - return $validate_args;
922 - }
923 -
924 - $raw_binary = base64_decode( substr( $data['screenshot'], strlen( 'data:image/png;base64,' ) ) );
925 -
926 - return $this->get_source( 'cloud' )->save_item_preview( $data['template_id'], $raw_binary );
927 - }
928 -
929 - /**
930 - * @throws \Exception If template processing fails or data validation errors occur.
931 - */
932 - public function template_screenshot_failed( $data ): string {
933 - $validate_args = $this->ensure_args( [ 'template_id' ], $data );
934 -
935 - if ( is_wp_error( $validate_args ) ) {
936 - return $validate_args;
937 - }
938 -
939 - return $this->get_source( 'cloud' )->mark_preview_as_failed( $data['template_id'], $data['error'] );
940 - }
941 -
942 - public function bulk_delete_templates( $data ) {
943 - $validate_args = $this->ensure_args( [ 'template_ids', 'source' ], $data );
944 -
945 - if ( is_wp_error( $validate_args ) ) {
946 - return $validate_args;
947 - }
948 -
949 - $source = $this->get_source( $data['source'] );
950 -
951 - if ( ! $source ) {
952 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
953 - }
954 -
955 - if ( empty( $data['template_ids'] ) || ! is_array( $data['template_ids'] ) ) {
956 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_IDS_MISSING );
957 - }
958 -
959 - return $source->bulk_delete_items( $data['template_ids'] );
960 - }
961 -
962 - public function bulk_undo_delete_items( $data ) {
963 - $validate_args = $this->ensure_args( [ 'template_ids', 'source' ], $data );
964 -
965 - if ( is_wp_error( $validate_args ) ) {
966 - return $validate_args;
967 - }
968 -
969 - $source = $this->get_source( $data['source'] );
970 -
971 - if ( ! $source ) {
972 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
973 - }
974 -
975 - if ( empty( $data['template_ids'] ) || ! is_array( $data['template_ids'] ) ) {
976 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_IDS_MISSING );
977 - }
978 -
979 - return $source->bulk_undo_delete_items( $data['template_ids'] );
980 - }
981 -
982 - /**
983 585 * Init ajax calls.
984 586 *
985 587 * Initialize template library ajax calls for allowed ajax requests.
986 588 *
@@ -997,25 +599,8 @@
997 599 'update_templates',
998 600 'delete_template',
999 601 'import_template',
1000 602 'mark_template_as_favorite',
1001 - 'import_from_json',
1002 - 'get_item_children',
1003 - 'search_templates',
1004 - 'rename_template',
1005 - 'load_more_templates',
1006 - 'create_folder',
1007 - 'get_folders',
1008 - 'save_template_screenshot',
1009 - 'move_template',
1010 - 'copy_template',
1011 - 'bulk_move_templates',
1012 - 'bulk_delete_templates',
1013 - 'bulk_copy_templates',
1014 - 'bulk_undo_delete_items',
1015 - 'get_templates_quota',
1016 - 'template_screenshot_failed',
1017 - 'process_global_styles',
1018 603 ];
1019 604
1020 605 foreach ( $library_ajax_requests as $ajax_request ) {
1021 606 $ajax->register_ajax_action( $ajax_request, function( $data ) use ( $ajax_request ) {
@@ -1039,25 +624,12 @@
1039 624 if ( ! $ajax->verify_request_nonce() ) {
1040 625 $this->handle_direct_action_error( 'Access Denied' );
1041 626 }
1042 627
1043 - $action = Utils::get_super_global_value( $_REQUEST, 'library_action' ); // phpcs:ignore -- Nonce already verified.
628 + $action = $_REQUEST['library_action'];
1044 629
1045 - $whitelist_methods = [
1046 - 'export_template',
1047 - 'direct_import_template',
1048 - ];
630 + $result = $this->$action( $_REQUEST );
1049 631
1050 - if ( 'direct_import_template' === $action && ! User::is_current_user_can_upload_json() ) {
1051 - return;
1052 - }
1053 -
1054 - if ( in_array( $action, $whitelist_methods, true ) ) {
1055 - $result = $this->$action( $_REQUEST ); // phpcs:ignore -- Nonce already verified.
1056 - } else {
1057 - $result = new \WP_Error( 'method_not_exists', 'Method Not exists' );
1058 - }
1059 -
1060 632 if ( is_wp_error( $result ) ) {
1061 633 /** @var \WP_Error $result */
1062 634 $this->handle_direct_action_error( $result->get_error_message() . '.' );
1063 635 }
@@ -1114,119 +686,6 @@
1114 686 return new \WP_Error( 'arguments_not_specified', sprintf( 'The required argument(s) "%s" not specified.', implode( ', ', $not_specified_args ) ) );
1115 687 }
1116 688
1117 689 return true;
1118 - }
1119 -
1120 - public function bulk_move_templates( array $args ) {
1121 - $validate_args = $this->ensure_args( [ 'source', 'from_source', 'from_template_id' ], $args );
1122 -
1123 - if ( is_wp_error( $validate_args ) ) {
1124 - return $validate_args;
1125 - }
1126 -
1127 - $args['source'] = $args['source'][0];
1128 -
1129 - return $this->bulk_move_template_items( $args );
1130 - }
1131 -
1132 - private function bulk_move_template_items( array $args ) {
1133 - $source = $this->get_source( $args['source'] );
1134 -
1135 - if ( ! $source ) {
1136 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
1137 - }
1138 -
1139 - if ( $this->is_action_to_same_source( $args ) ) {
1140 - return $source->move_bulk_templates_to_folder( $args );
1141 - }
1142 -
1143 - $from_source = $this->get_source( $args['from_source'] );
1144 -
1145 - if ( ! $from_source ) {
1146 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
1147 - }
1148 -
1149 - $bulk_args = $from_source->format_args_for_bulk_action( $args );
1150 -
1151 - if ( $source->supports_quota() && ! $this->is_action_to_same_source( $args ) ) {
1152 - $quota_validation = $source->validate_quota( $bulk_args );
1153 -
1154 - if ( is_wp_error( $quota_validation ) ) {
1155 - return $quota_validation;
1156 - }
1157 -
1158 - if ( false === $quota_validation ) {
1159 - return new \WP_Error( 'quota_error', 'The moving failed because it will pass the maximum templates you can save.' );
1160 - }
1161 - }
1162 -
1163 - $bulk_save = $source->save_bulk_items( $bulk_args );
1164 -
1165 - if ( ! empty( $bulk_save ) ) {
1166 - $this->bulk_delete_templates( [
1167 - 'template_ids' => $args['from_template_id'],
1168 - 'source' => $args['from_source'],
1169 - ] );
1170 - }
1171 -
1172 - return $bulk_save;
1173 - }
1174 -
1175 - public function bulk_copy_templates( array $args ) {
1176 - $validate_args = $this->ensure_args( [ 'source', 'from_source', 'from_template_id' ], $args );
1177 -
1178 - if ( is_wp_error( $validate_args ) ) {
1179 - return $validate_args;
1180 - }
1181 -
1182 - $args['source'] = $args['source'][0];
1183 -
1184 - return $this->bulk_copy_template_items( $args );
1185 - }
1186 -
1187 - private function bulk_copy_template_items( array $args ) {
1188 - $source = $this->get_source( $args['source'] );
1189 -
1190 - if ( ! $source ) {
1191 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
1192 - }
1193 -
1194 - $from_source = $this->get_source( $args['from_source'] );
1195 -
1196 - if ( ! $from_source ) {
1197 - return new \WP_Error( 'template_error', self::ERROR_TEMPLATE_SOURCE_NOT_FOUND );
1198 - }
1199 -
1200 - $bulk_args = $from_source->format_args_for_bulk_action( $args );
1201 -
1202 - if ( $source->supports_quota() && ! $this->is_action_to_same_source( $args ) ) {
1203 - $quota_validation = $source->validate_quota( $bulk_args );
1204 -
1205 - if ( is_wp_error( $quota_validation ) ) {
1206 - return $quota_validation;
1207 - }
1208 -
1209 - if ( false === $quota_validation ) {
1210 - return new \WP_Error( 'quota_error', 'The copying failed because it will pass the maximum templates you can save.' );
1211 - }
1212 - }
1213 -
1214 - return $source->save_bulk_items( $bulk_args );
1215 - }
1216 -
1217 - public function get_templates_quota( array $args ) {
1218 - $validate_args = $this->ensure_args( [ 'source' ], $args );
1219 -
1220 - if ( is_wp_error( $validate_args ) ) {
1221 - return $validate_args;
1222 - }
1223 -
1224 - $source = $this->get_source( $args['source'] );
1225 -
1226 - if ( ! $source ) {
1227 - return new \WP_Error( 'template_error', 'Source not found.' );
1228 - }
1229 -
1230 - return $source->get_quota();
1231 690 }
1232 691 }