Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/includes/managers/widgets.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 + namespace Elementor;
3 +
4 + use Elementor\Core\Common\Modules\Ajax\Module as Ajax;
5 + use Elementor\Core\Utils\Collection;
6 + use Elementor\Core\Utils\Force_Locale;
7 + use Elementor\Modules\AtomicWidgets\Elements\Atomic_Button\Atomic_Button;
8 + use Elementor\Modules\AtomicWidgets\Elements\Atomic_Divider\Atomic_Divider;
9 + use Elementor\Modules\AtomicWidgets\Elements\Atomic_Heading\Atomic_Heading;
10 + use Elementor\Modules\AtomicWidgets\Elements\Atomic_Image\Atomic_Image;
11 + use Elementor\Modules\AtomicWidgets\Elements\Atomic_Paragraph\Atomic_Paragraph;
12 + use Elementor\Modules\AtomicWidgets\Elements\Atomic_Svg\Atomic_Svg;
13 + use Elementor\Modules\NestedAccordion\Widgets\Nested_Accordion;
14 + use Elementor\Modules\NestedElements\Module as NestedElementsModule;
15 + use Elementor\Modules\NestedTabs\Widgets\NestedTabs;
16 +
17 + if ( ! defined( 'ABSPATH' ) ) {
18 + exit; // Exit if accessed directly.
19 + }
20 +
21 + /**
22 + * Elementor widgets manager.
23 + *
24 + * Elementor widgets manager handler class is responsible for registering and
25 + * initializing all the supported Elementor widgets.
26 + *
27 + * @since 1.0.0
28 + */
29 + class Widgets_Manager {
30 +
31 + /**
32 + * Widget types.
33 + *
34 + * Holds the list of all the widget types.
35 + *
36 + * @since 1.0.0
37 + * @access private
38 + *
39 + * @var Widget_Base[]
40 + */
41 + private $_widget_types = null;
42 +
43 + /**
44 + * Promoted widget types.
45 + *
46 + * Holds the list of all the Promoted widget types.
47 + *
48 + * @since 3.15.0
49 + * @access private
50 + *
51 + * @var Widget_Base[]
52 + *
53 + * @return array
54 + */
55 + private array $promoted_widgets = [
56 + NestedElementsModule::EXPERIMENT_NAME => [
57 + NestedTabs::class,
58 + Nested_Accordion::class,
59 + ],
60 + 'atomic_widgets' => [
61 + Atomic_Heading::class,
62 + Atomic_Image::class,
63 + Atomic_Paragraph::class,
64 + Atomic_Button::class,
65 + Atomic_Svg::class,
66 + Atomic_Divider::class,
67 + ],
68 + ];
69 +
70 + /**
71 + * Init widgets.
72 + *
73 + * Initialize Elementor widgets manager. Include all the widgets files
74 + * and register each Elementor and WordPress widget.
75 + *
76 + * @since 2.0.0
77 + * @access private
78 + */
79 + private function init_widgets() {
80 + $build_widgets_filename = [
81 + 'common-base',
82 + 'common',
83 + 'common-optimized',
84 + 'inner-section',
85 + 'heading',
86 + 'image',
87 + 'text-editor',
88 + 'video',
89 + 'button',
90 + 'divider',
91 + 'spacer',
92 + 'image-box',
93 + 'google-maps',
94 + 'icon',
95 + 'icon-box',
96 + 'star-rating',
97 + 'image-carousel',
98 + 'image-gallery',
99 + 'icon-list',
100 + 'counter',
101 + 'progress',
102 + 'testimonial',
103 + 'tabs',
104 + 'accordion',
105 + 'toggle',
106 + 'social-icons',
107 + 'alert',
108 + 'audio',
109 + 'shortcode',
110 + 'html',
111 + 'menu-anchor',
112 + 'sidebar',
113 + 'read-more',
114 + 'rating',
115 + ];
116 +
117 + $this->_widget_types = [];
118 +
119 + $this->register_promoted_widgets();
120 +
121 + foreach ( $build_widgets_filename as $widget_filename ) {
122 + include ELEMENTOR_PATH . 'includes/widgets/' . $widget_filename . '.php';
123 +
124 + $class_name = str_replace( '-', '_', $widget_filename );
125 +
126 + $class_name = __NAMESPACE__ . '\Widget_' . $class_name;
127 +
128 + $this->register( new $class_name() );
129 + }
130 +
131 + $this->register_wp_widgets();
132 +
133 + /**
134 + * After widgets registered.
135 + *
136 + * Fires after Elementor widgets are registered.
137 + *
138 + * @since 1.0.0
139 + * @deprecated 3.5.0 Use `elementor/widgets/register` hook instead.
140 + *
141 + * @param Widgets_Manager $this The widgets manager.
142 + */
143 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->do_deprecated_action(
144 + 'elementor/widgets/widgets_registered',
145 + [ $this ],
146 + '3.5.0',
147 + 'elementor/widgets/register'
148 + );
149 +
150 + /**
151 + * After widgets registered.
152 + *
153 + * Fires after Elementor widgets are registered.
154 + *
155 + * @since 3.5.0
156 + *
157 + * @param Widgets_Manager $this The widgets manager.
158 + */
159 + do_action( 'elementor/widgets/register', $this );
160 + }
161 +
162 + /**
163 + * Register WordPress widgets.
164 + *
165 + * Add native WordPress widget to the list of registered widget types.
166 + *
167 + * Exclude the widgets that are in Elementor widgets black list. Theme and
168 + * plugin authors can filter the black list.
169 + *
170 + * @since 2.0.0
171 + * @access private
172 + */
173 + private function register_wp_widgets() {
174 + global $wp_widget_factory;
175 +
176 + // Allow themes/plugins to filter out their widgets.
177 + $black_list = [];
178 +
179 + /**
180 + * Elementor widgets black list.
181 + *
182 + * Filters the widgets black list that won't be displayed in the panel.
183 + *
184 + * @since 1.0.0
185 + *
186 + * @param array $black_list A black list of widgets. Default is an empty array.
187 + */
188 + $black_list = apply_filters( 'elementor/widgets/black_list', $black_list );
189 +
190 + foreach ( $wp_widget_factory->widgets as $widget_class => $widget_obj ) {
191 +
192 + if ( in_array( $widget_class, $black_list ) ) {
193 + continue;
194 + }
195 +
196 + $elementor_widget_class = __NAMESPACE__ . '\Widget_WordPress';
197 +
198 + $this->register(
199 + new $elementor_widget_class( [], [
200 + 'widget_name' => $widget_class,
201 + ] )
202 + );
203 + }
204 + }
205 +
206 + /**
207 + * Require files.
208 + *
209 + * Require Elementor widget base class.
210 + *
211 + * @since 2.0.0
212 + * @access private
213 + */
214 + private function require_files() {
215 + require ELEMENTOR_PATH . 'includes/base/widget-base.php';
216 + }
217 +
218 + private function pluck_default_controls( $controls ) {
219 + return ( new Collection( $controls ) )
220 + ->reduce( function ( $controls_defaults, $control, $control_key ) {
221 + if ( ! empty( $control['default'] ) ) {
222 + $controls_defaults[ $control_key ]['default'] = $control['default'];
223 + }
224 +
225 + return $controls_defaults;
226 + }, [] );
227 + }
228 +
229 + /**
230 + * Register widget type.
231 + *
232 + * Add a new widget type to the list of registered widget types.
233 + *
234 + * @since 1.0.0
235 + * @access public
236 + * @deprecated 3.5.0 Use `register()` method instead.
237 + *
238 + * @param Widget_Base $widget Elementor widget.
239 + *
240 + * @return true True if the widget was registered.
241 + */
242 + public function register_widget_type( Widget_Base $widget ) {
243 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function(
244 + __METHOD__,
245 + '3.5.0',
246 + 'register()'
247 + );
248 +
249 + return $this->register( $widget );
250 + }
251 +
252 + /**
253 + * Register a new widget type.
254 + *
255 + * @param \Elementor\Widget_Base $widget_instance Elementor Widget.
256 + *
257 + * @return bool True if the widget was registered.
258 + * @since 3.5.0
259 + * @access public
260 + */
261 + public function register( Widget_Base $widget_instance ) {
262 + if ( is_null( $this->_widget_types ) ) {
263 + $this->init_widgets();
264 + }
265 +
266 + /**
267 + * Should widget be registered.
268 + *
269 + * @since 3.18.0
270 + *
271 + * @param bool $should_register Should widget be registered. Default is `true`.
272 + * @param \Elementor\Widget_Base $widget_instance Widget instance.
273 + */
274 + $should_register = apply_filters( 'elementor/widgets/is_widget_enabled', true, $widget_instance );
275 +
276 + if ( ! $should_register ) {
277 + return false;
278 + }
279 +
280 + $this->_widget_types[ $widget_instance->get_name() ] = $widget_instance;
281 +
282 + return true;
283 + }
284 +
285 + /** Register promoted widgets
286 + *
287 + * Since we cannot allow widgets to place themselves is a specific
288 + * location on our widgets panel we need to use a hard coded solution for this.
289 + *
290 + * @return void
291 + */
292 + private function register_promoted_widgets() {
293 +
294 + foreach ( $this->promoted_widgets as $experiment_name => $classes ) {
295 + $this->register_promoted_active_widgets( $experiment_name, $classes );
296 + }
297 + }
298 +
299 + /**
300 + * Unregister widget type.
301 + *
302 + * Removes widget type from the list of registered widget types.
303 + *
304 + * @since 1.0.0
305 + * @access public
306 + * @deprecated 3.5.0 Use `unregister()` method instead.
307 + *
308 + * @param string $name Widget name.
309 + *
310 + * @return true True if the widget was unregistered, False otherwise.
311 + */
312 + public function unregister_widget_type( $name ) {
313 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function(
314 + __METHOD__,
315 + '3.5.0',
316 + 'unregister()'
317 + );
318 +
319 + return $this->unregister( $name );
320 + }
321 +
322 + /**
323 + * Unregister widget type.
324 + *
325 + * Removes widget type from the list of registered widget types.
326 + *
327 + * @since 3.5.0
328 + * @access public
329 + *
330 + * @param string $name Widget name.
331 + *
332 + * @return boolean Whether the widget was unregistered.
333 + */
334 + public function unregister( $name ) {
335 + if ( ! isset( $this->_widget_types[ $name ] ) ) {
336 + return false;
337 + }
338 +
339 + unset( $this->_widget_types[ $name ] );
340 +
341 + return true;
342 + }
343 +
344 + /**
345 + * Get widget types.
346 + *
347 + * Retrieve the registered widget types list.
348 + *
349 + * @since 1.0.0
350 + * @access public
351 + *
352 + * @param string $widget_name Optional. Widget name. Default is null.
353 + *
354 + * @return Widget_Base|Widget_Base[]|null Registered widget types.
355 + */
356 + public function get_widget_types( $widget_name = null ) {
357 + if ( is_null( $this->_widget_types ) ) {
358 + $this->init_widgets();
359 + }
360 +
361 + if ( null !== $widget_name ) {
362 + return isset( $this->_widget_types[ $widget_name ] ) ? $this->_widget_types[ $widget_name ] : null;
363 + }
364 +
365 + return $this->_widget_types;
366 + }
367 +
368 + /**
369 + * Get widget types config.
370 + *
371 + * Retrieve all the registered widgets with config for each widgets.
372 + *
373 + * @since 1.0.0
374 + * @access public
375 + *
376 + * @return array Registered widget types with each widget config.
377 + */
378 + public function get_widget_types_config() {
379 + $config = [];
380 +
381 + foreach ( $this->get_widget_types() as $widget_key => $widget ) {
382 + $config[ $widget_key ] = $widget->get_config();
383 + }
384 +
385 + return $config;
386 + }
387 +
388 + /**
389 + * @throws \Exception If current user don't have permissions to edit the post.
390 + */
391 + public function ajax_get_widget_types_controls_config( array $data ) {
392 + Plugin::$instance->documents->check_permissions( $data['editor_post_id'] );
393 +
394 + wp_raise_memory_limit( 'admin' );
395 +
396 + $config = [];
397 +
398 + foreach ( $this->get_widget_types() as $widget_key => $widget ) {
399 + if ( isset( $data['exclude'][ $widget_key ] ) ) {
400 + continue;
401 + }
402 +
403 + $config[ $widget_key ] = [
404 + 'controls' => $widget->get_stack( false )['controls'],
405 + 'tabs_controls' => $widget->get_tabs_controls(),
406 + ];
407 + }
408 +
409 + return $config;
410 + }
411 +
412 + public function ajax_get_widgets_default_value_translations( array $data = [] ) {
413 + $locale = empty( $data['locale'] )
414 + ? get_locale()
415 + : $data['locale'];
416 +
417 + $force_locale = new Force_Locale( $locale );
418 + $force_locale->force();
419 +
420 + $controls = ( new Collection( $this->get_widget_types() ) )
421 + ->map( function ( Widget_Base $widget ) {
422 + $controls = $widget->get_stack( false )['controls'];
423 +
424 + return [
425 + 'controls' => $this->pluck_default_controls( $controls ),
426 + ];
427 + } )
428 + ->filter( function ( $widget ) {
429 + return ! empty( $widget['controls'] );
430 + } )
431 + ->all();
432 +
433 + $force_locale->restore();
434 +
435 + return $controls;
436 + }
437 +
438 + /**
439 + * Ajax render widget.
440 + *
441 + * Ajax handler for Elementor render_widget.
442 + *
443 + * Fired by `wp_ajax_elementor_render_widget` action.
444 + *
445 + * @since 1.0.0
446 + * @access public
447 + *
448 + * @throws \Exception If current user don't have permissions to edit the post.
449 + *
450 + * @param array $request Ajax request.
451 + *
452 + * @return array {
453 + * Rendered widget.
454 + *
455 + * @type string $render The rendered HTML.
456 + * }
457 + */
458 + public function ajax_render_widget( $request ) {
459 + $document = Plugin::$instance->documents->get_with_permissions( $request['editor_post_id'] );
460 +
461 + // Override the global $post for the render.
462 + query_posts(
463 + [
464 + 'p' => $request['editor_post_id'],
465 + 'post_type' => 'any',
466 + ]
467 + );
468 +
469 + $editor = Plugin::$instance->editor;
470 + $is_edit_mode = $editor->is_edit_mode();
471 + $editor->set_edit_mode( true );
472 +
473 + Plugin::$instance->documents->switch_to_document( $document );
474 +
475 + $render_html = $document->render_element( $request['data'] );
476 +
477 + $editor->set_edit_mode( $is_edit_mode );
478 +
479 + return [
480 + 'render' => $render_html,
481 + ];
482 + }
483 +
484 + /**
485 + * Ajax get WordPress widget form.
486 + *
487 + * Ajax handler for Elementor editor get_wp_widget_form.
488 + *
489 + * Fired by `wp_ajax_elementor_editor_get_wp_widget_form` action.
490 + *
491 + * @since 1.0.0
492 + * @access public
493 + *
494 + * @param array $request Ajax request.
495 + *
496 + * @return bool|string Rendered widget form.
497 + * @throws \Exception If current user don't have permissions to edit the post.
498 + */
499 + public function ajax_get_wp_widget_form( $request ) {
500 + Plugin::$instance->documents->check_permissions( $request['editor_post_id'] );
501 +
502 + if ( empty( $request['widget_type'] ) ) {
503 + return false;
504 + }
505 +
506 + if ( empty( $request['data'] ) ) {
507 + $request['data'] = [];
508 + }
509 +
510 + $element_data = [
511 + 'id' => $request['id'],
512 + 'elType' => 'widget',
513 + 'widgetType' => $request['widget_type'],
514 + 'settings' => $request['data'],
515 + ];
516 +
517 + /**
518 + * @var $widget_obj Widget_WordPress
519 + */
520 + $widget_obj = Plugin::$instance->elements_manager->create_element_instance( $element_data );
521 +
522 + if ( ! $widget_obj ) {
523 + return false;
524 + }
525 +
526 + return $widget_obj->get_form();
527 + }
528 +
529 + /**
530 + * Render widgets content.
531 + *
532 + * Used to generate the widget templates on the editor using Underscore JS
533 + * template, for all the registered widget types.
534 + *
535 + * @since 1.0.0
536 + * @access public
537 + */
538 + public function render_widgets_content() {
539 + foreach ( $this->get_widget_types() as $widget ) {
540 + $widget->print_template();
541 + }
542 + }
543 +
544 + /**
545 + * Get widgets frontend settings keys.
546 + *
547 + * Retrieve frontend controls settings keys for all the registered widget
548 + * types.
549 + *
550 + * @since 1.3.0
551 + * @access public
552 + *
553 + * @return array Registered widget types with settings keys for each widget.
554 + */
555 + public function get_widgets_frontend_settings_keys() {
556 + $keys = [];
557 +
558 + foreach ( $this->get_widget_types() as $widget_type_name => $widget_type ) {
559 + $widget_type_keys = $widget_type->get_frontend_settings_keys();
560 +
561 + if ( $widget_type_keys ) {
562 + $keys[ $widget_type_name ] = $widget_type_keys;
563 + }
564 + }
565 +
566 + return $keys;
567 + }
568 +
569 + /**
570 + * Widgets with styles.
571 + *
572 + * This method returns the list of all the widgets in the `/includes/`
573 + * folder that have styles.
574 + *
575 + * @since 3.24.0
576 + * @access public
577 + *
578 + * @return array The names of the widgets that have styles.
579 + */
580 + public function widgets_with_styles(): array {
581 + return [
582 + 'counter',
583 + 'divider',
584 + 'google_maps',
585 + 'heading',
586 + 'image',
587 + 'image-carousel',
588 + 'menu-anchor',
589 + 'rating',
590 + 'social-icons',
591 + 'spacer',
592 + 'testimonial',
593 + 'text-editor',
594 + 'video',
595 + ];
596 + }
597 +
598 + /**
599 + * Widgets with responsive styles.
600 + *
601 + * This method returns the list of all the widgets in the `/includes/`
602 + * folder that have responsive styles.
603 + *
604 + * @since 3.24.0
605 + * @access public
606 + *
607 + * @return array The names of the widgets that have responsive styles.
608 + */
609 + public function widgets_with_responsive_styles(): array {
610 + return [
611 + 'accordion',
612 + 'alert',
613 + 'icon-box',
614 + 'icon-list',
615 + 'image-box',
616 + 'image-gallery',
617 + 'progress',
618 + 'star-rating',
619 + 'tabs',
620 + 'toggle',
621 + ];
622 + }
623 +
624 + /**
625 + * Enqueue widgets scripts.
626 + *
627 + * Enqueue all the scripts defined as a dependency for each widget.
628 + *
629 + * @since 1.3.0
630 + * @access public
631 + */
632 + public function enqueue_widgets_scripts() {
633 + foreach ( $this->get_widget_types() as $widget ) {
634 + $widget->enqueue_scripts();
635 + }
636 + }
637 +
638 + public function register_frontend_handlers() {
639 + foreach ( $this->get_widget_types() as $widget ) {
640 + $widget->register_frontend_handlers();
641 + }
642 + }
643 +
644 + /**
645 + * Enqueue widgets styles
646 + *
647 + * Enqueue all the styles defined as a dependency for each widget
648 + *
649 + * @access public
650 + */
651 + public function enqueue_widgets_styles() {
652 + foreach ( $this->get_widget_types() as $widget ) {
653 + $widget->enqueue_styles();
654 + }
655 + }
656 +
657 + /**
658 + * Retrieve inline editing configuration.
659 + *
660 + * Returns general inline editing configurations like toolbar types etc.
661 + *
662 + * @access public
663 + * @since 1.8.0
664 + *
665 + * @return array {
666 + * Inline editing configuration.
667 + *
668 + * @type array $toolbar {
669 + * Toolbar types and the actions each toolbar includes.
670 + * Note: Wysiwyg controls uses the advanced toolbar, textarea controls
671 + * uses the basic toolbar and text controls has no toolbar.
672 + *
673 + * @type array $basic Basic actions included in the edit tool.
674 + * @type array $advanced Advanced actions included in the edit tool.
675 + * }
676 + * }
677 + */
678 + public function get_inline_editing_config() {
679 + $basic_tools = [
680 + 'bold',
681 + 'underline',
682 + 'italic',
683 + ];
684 +
685 + $advanced_tools = array_merge( $basic_tools, [
686 + 'createlink',
687 + 'unlink',
688 + 'h1' => [
689 + 'h1',
690 + 'h2',
691 + 'h3',
692 + 'h4',
693 + 'h5',
694 + 'h6',
695 + 'p',
696 + 'blockquote',
697 + 'pre',
698 + ],
699 + 'list' => [
700 + 'insertOrderedList',
701 + 'insertUnorderedList',
702 + ],
703 + ] );
704 +
705 + return [
706 + 'toolbar' => [
707 + 'basic' => $basic_tools,
708 + 'advanced' => $advanced_tools,
709 + ],
710 + ];
711 + }
712 +
713 + /**
714 + * Widgets manager constructor.
715 + *
716 + * Initializing Elementor widgets manager.
717 + *
718 + * @since 1.0.0
719 + * @access public
720 + */
721 + public function __construct() {
722 + $this->require_files();
723 +
724 + add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_actions' ] );
725 + }
726 +
727 + /**
728 + * Register ajax actions.
729 + *
730 + * Add new actions to handle data after an ajax requests returned.
731 + *
732 + * @since 2.0.0
733 + * @access public
734 + *
735 + * @param Ajax $ajax_manager
736 + */
737 + public function register_ajax_actions( Ajax $ajax_manager ) {
738 + $ajax_manager->register_ajax_action( 'render_widget', [ $this, 'ajax_render_widget' ] );
739 + $ajax_manager->register_ajax_action( 'editor_get_wp_widget_form', [ $this, 'ajax_get_wp_widget_form' ] );
740 + $ajax_manager->register_ajax_action( 'get_widgets_config', [ $this, 'ajax_get_widget_types_controls_config' ] );
741 +
742 + $ajax_manager->register_ajax_action( 'get_widgets_default_value_translations', function ( array $data ) {
743 + return $this->ajax_get_widgets_default_value_translations( $data );
744 + } );
745 + }
746 +
747 + /**
748 + * @param string $experiment_name
749 + * @param array $classes
750 + * @return void
751 + */
752 + public function register_promoted_active_widgets( string $experiment_name, array $classes ): void {
753 + if ( ! Plugin::$instance->experiments->is_feature_active( $experiment_name ) || empty( $classes ) ) {
754 + return;
755 + }
756 +
757 + foreach ( $classes as $class_name ) {
758 + $this->register( new $class_name() );
759 + }
760 + }
761 + }
762 +