PluginProbe
Elementor Website Builder – more than just a page builder / 3.16.2
Elementor Website Builder – more than just a page builder v3.16.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
← All changes | includes/managers/widgets.php +30 -165 4.2.0-dev23.16.2 View file →
@@ -2,17 +2,11 @@
2 2 namespace Elementor;
3 3
4 4 use Elementor\Core\Common\Modules\Ajax\Module as Ajax;
5 5 use Elementor\Core\Utils\Collection;
6 +use Elementor\Core\Utils\Exceptions;
6 7 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 8 use Elementor\Modules\NestedAccordion\Widgets\Nested_Accordion;
14 -use Elementor\Modules\NestedElements\Module as NestedElementsModule;
15 9 use Elementor\Modules\NestedTabs\Widgets\NestedTabs;
16 10
17 11 if ( ! defined( 'ABSPATH' ) ) {
18 12 exit; // Exit if accessed directly.
@@ -48,40 +42,26 @@
48 42 * @since 3.15.0
49 43 * @access private
50 44 *
51 45 * @var Widget_Base[]
52 - *
53 - * @return array
54 46 */
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 - ],
47 + private $_promoted_widgets = [
48 + 'nested-elements' => NestedTabs::class,
49 + 'nested-accordion' => Nested_Accordion::class,
68 50 ];
69 51
70 52 /**
71 53 * Init widgets.
72 54 *
73 - * Initialize Elementor widgets manager. Include all the widgets files
55 + * Initialize Elementor widgets manager. Include all the the widgets files
74 56 * and register each Elementor and WordPress widget.
75 57 *
76 58 * @since 2.0.0
77 59 * @access private
78 - */
60 + */
79 61 private function init_widgets() {
80 62 $build_widgets_filename = [
81 - 'common-base',
82 63 'common',
83 - 'common-optimized',
84 64 'inner-section',
85 65 'heading',
86 66 'image',
87 67 'text-editor',
@@ -110,15 +90,12 @@
110 90 'html',
111 91 'menu-anchor',
112 92 'sidebar',
113 93 'read-more',
114 - 'rating',
115 94 ];
116 95
117 96 $this->_widget_types = [];
118 97
119 - $this->register_promoted_widgets();
120 -
121 98 foreach ( $build_widgets_filename as $widget_filename ) {
122 99 include ELEMENTOR_PATH . 'includes/widgets/' . $widget_filename . '.php';
123 100
124 101 $class_name = str_replace( '-', '_', $widget_filename );
@@ -127,8 +104,10 @@
127 104
128 105 $this->register( new $class_name() );
129 106 }
130 107
108 + $this->register_promoted_widgets();
109 +
131 110 $this->register_wp_widgets();
132 111
133 112 /**
134 113 * After widgets registered.
@@ -168,9 +147,9 @@
168 147 * plugin authors can filter the black list.
169 148 *
170 149 * @since 2.0.0
171 150 * @access private
172 - */
151 + */
173 152 private function register_wp_widgets() {
174 153 global $wp_widget_factory;
175 154
176 155 // Allow themes/plugins to filter out their widgets.
@@ -209,9 +188,9 @@
209 188 * Require Elementor widget base class.
210 189 *
211 190 * @since 2.0.0
212 191 * @access private
213 - */
192 + */
214 193 private function require_files() {
215 194 require ELEMENTOR_PATH . 'includes/base/widget-base.php';
216 195 }
217 196
@@ -237,9 +216,9 @@
237 216 *
238 217 * @param Widget_Base $widget Elementor widget.
239 218 *
240 219 * @return true True if the widget was registered.
241 - */
220 + */
242 221 public function register_widget_type( Widget_Base $widget ) {
243 222 Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function(
244 223 __METHOD__,
245 224 '3.5.0',
@@ -253,11 +232,12 @@
253 232 * Register a new widget type.
254 233 *
255 234 * @param \Elementor\Widget_Base $widget_instance Elementor Widget.
256 235 *
257 - * @return bool True if the widget was registered.
236 + * @return true True if the widget was registered.
258 237 * @since 3.5.0
259 238 * @access public
239 + *
260 240 */
261 241 public function register( Widget_Base $widget_instance ) {
262 242 if ( is_null( $this->_widget_types ) ) {
263 243 $this->init_widgets();
@@ -262,38 +242,28 @@
262 242 if ( is_null( $this->_widget_types ) ) {
263 243 $this->init_widgets();
264 244 }
265 245
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 246 $this->_widget_types[ $widget_instance->get_name() ] = $widget_instance;
281 247
282 248 return true;
283 249 }
284 250
285 - /** Register promoted widgets
251 + /** register promoted widgets
286 252 *
287 253 * 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.
254 + * location on our widgets panel we need to use an hard coded solution fort his
289 255 *
290 256 * @return void
291 257 */
292 258 private function register_promoted_widgets() {
293 259
294 - foreach ( $this->promoted_widgets as $experiment_name => $classes ) {
295 - $this->register_promoted_active_widgets( $experiment_name, $classes );
260 + foreach ( $this->_promoted_widgets as $module_name => $class_name ) {
261 +
262 + if ( Plugin::$instance->experiments->is_feature_active( $module_name ) ) {
263 + $instance = new $class_name();
264 + $this->_widget_types[ $instance->get_name() ] = $instance;
265 + }
296 266 }
297 267 }
298 268
299 269 /**
@@ -307,9 +277,9 @@
307 277 *
308 278 * @param string $name Widget name.
309 279 *
310 280 * @return true True if the widget was unregistered, False otherwise.
311 - */
281 + */
312 282 public function unregister_widget_type( $name ) {
313 283 Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function(
314 284 __METHOD__,
315 285 '3.5.0',
@@ -351,9 +321,9 @@
351 321 *
352 322 * @param string $widget_name Optional. Widget name. Default is null.
353 323 *
354 324 * @return Widget_Base|Widget_Base[]|null Registered widget types.
355 - */
325 + */
356 326 public function get_widget_types( $widget_name = null ) {
357 327 if ( is_null( $this->_widget_types ) ) {
358 328 $this->init_widgets();
359 329 }
@@ -373,9 +343,9 @@
373 343 * @since 1.0.0
374 344 * @access public
375 345 *
376 346 * @return array Registered widget types with each widget config.
377 - */
347 + */
378 348 public function get_widget_types_config() {
379 349 $config = [];
380 350
381 351 foreach ( $this->get_widget_types() as $widget_key => $widget ) {
@@ -385,9 +355,9 @@
385 355 return $config;
386 356 }
387 357
388 358 /**
389 - * @throws \Exception If current user don't have permissions to edit the post.
359 + * @throws \Exception
390 360 */
391 361 public function ajax_get_widget_types_controls_config( array $data ) {
392 362 Plugin::$instance->documents->check_permissions( $data['editor_post_id'] );
393 363
@@ -408,35 +378,8 @@
408 378
409 379 return $config;
410 380 }
411 381
412 - /**
413 - * @throws \Exception If current user don't have permissions to edit the post.
414 - */
415 - public function ajax_refresh_widgets_config( array $data ) {
416 - Plugin::$instance->documents->check_permissions( $data['editor_post_id'] );
417 -
418 - wp_raise_memory_limit( 'admin' );
419 -
420 - $widgets = [];
421 -
422 - foreach ( $this->get_widget_types() as $widget_key => $widget ) {
423 - $widget_config = $widget->get_config();
424 -
425 - // get_config() omits controls when the stack isn't initialized yet (see Widget_Base::get_initial_config).
426 - // During an AJAX refresh the instances are fresh, so we force-initialize and merge them explicitly.
427 - $widget_config['controls'] = $widget->get_stack( false )['controls'];
428 - $widget_config['tabs_controls'] = $widget->get_tabs_controls();
429 -
430 - $widgets[ $widget_key ] = $widget_config;
431 - }
432 -
433 - return [
434 - 'widgets' => $widgets,
435 - 'categories' => Plugin::$instance->elements_manager->get_categories(),
436 - ];
437 - }
438 -
439 382 public function ajax_get_widgets_default_value_translations( array $data = [] ) {
440 383 $locale = empty( $data['locale'] )
441 384 ? get_locale()
442 385 : $data['locale'];
@@ -520,9 +463,9 @@
520 463 *
521 464 * @param array $request Ajax request.
522 465 *
523 466 * @return bool|string Rendered widget form.
524 - * @throws \Exception If current user don't have permissions to edit the post.
467 + * @throws \Exception
525 468 */
526 469 public function ajax_get_wp_widget_form( $request ) {
527 470 Plugin::$instance->documents->check_permissions( $request['editor_post_id'] );
528 471
@@ -560,9 +503,9 @@
560 503 * template, for all the registered widget types.
561 504 *
562 505 * @since 1.0.0
563 506 * @access public
564 - */
507 + */
565 508 public function render_widgets_content() {
566 509 foreach ( $this->get_widget_types() as $widget ) {
567 510 $widget->print_template();
568 511 }
@@ -577,9 +520,9 @@
577 520 * @since 1.3.0
578 521 * @access public
579 522 *
580 523 * @return array Registered widget types with settings keys for each widget.
581 - */
524 + */
582 525 public function get_widgets_frontend_settings_keys() {
583 526 $keys = [];
584 527
585 528 foreach ( $this->get_widget_types() as $widget_type_name => $widget_type ) {
@@ -593,63 +536,8 @@
593 536 return $keys;
594 537 }
595 538
596 539 /**
597 - * Widgets with styles.
598 - *
599 - * This method returns the list of all the widgets in the `/includes/`
600 - * folder that have styles.
601 - *
602 - * @since 3.24.0
603 - * @access public
604 - *
605 - * @return array The names of the widgets that have styles.
606 - */
607 - public function widgets_with_styles(): array {
608 - return [
609 - 'counter',
610 - 'divider',
611 - 'google_maps',
612 - 'heading',
613 - 'image',
614 - 'image-carousel',
615 - 'menu-anchor',
616 - 'rating',
617 - 'social-icons',
618 - 'spacer',
619 - 'testimonial',
620 - 'text-editor',
621 - 'video',
622 - ];
623 - }
624 -
625 - /**
626 - * Widgets with responsive styles.
627 - *
628 - * This method returns the list of all the widgets in the `/includes/`
629 - * folder that have responsive styles.
630 - *
631 - * @since 3.24.0
632 - * @access public
633 - *
634 - * @return array The names of the widgets that have responsive styles.
635 - */
636 - public function widgets_with_responsive_styles(): array {
637 - return [
638 - 'accordion',
639 - 'alert',
640 - 'icon-box',
641 - 'icon-list',
642 - 'image-box',
643 - 'image-gallery',
644 - 'progress',
645 - 'star-rating',
646 - 'tabs',
647 - 'toggle',
648 - ];
649 - }
650 -
651 - /**
652 540 * Enqueue widgets scripts.
653 541 *
654 542 * Enqueue all the scripts defined as a dependency for each widget.
655 543 *
@@ -654,9 +542,9 @@
654 542 * Enqueue all the scripts defined as a dependency for each widget.
655 543 *
656 544 * @since 1.3.0
657 545 * @access public
658 - */
546 + */
659 547 public function enqueue_widgets_scripts() {
660 548 foreach ( $this->get_widget_types() as $widget ) {
661 549 $widget->enqueue_scripts();
662 550 }
@@ -661,14 +549,8 @@
661 549 $widget->enqueue_scripts();
662 550 }
663 551 }
664 552
665 - public function register_frontend_handlers() {
666 - foreach ( $this->get_widget_types() as $widget ) {
667 - $widget->register_frontend_handlers();
668 - }
669 - }
670 -
671 553 /**
672 554 * Enqueue widgets styles
673 555 *
674 556 * Enqueue all the styles defined as a dependency for each widget
@@ -743,9 +625,9 @@
743 625 * Initializing Elementor widgets manager.
744 626 *
745 627 * @since 1.0.0
746 628 * @access public
747 - */
629 + */
748 630 public function __construct() {
749 631 $this->require_files();
750 632
751 633 add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_actions' ] );
@@ -765,26 +647,9 @@
765 647 $ajax_manager->register_ajax_action( 'render_widget', [ $this, 'ajax_render_widget' ] );
766 648 $ajax_manager->register_ajax_action( 'editor_get_wp_widget_form', [ $this, 'ajax_get_wp_widget_form' ] );
767 649 $ajax_manager->register_ajax_action( 'get_widgets_config', [ $this, 'ajax_get_widget_types_controls_config' ] );
768 650
769 - $ajax_manager->register_ajax_action( 'refresh_widgets_config', [ $this, 'ajax_refresh_widgets_config' ] );
770 -
771 651 $ajax_manager->register_ajax_action( 'get_widgets_default_value_translations', function ( array $data ) {
772 652 return $this->ajax_get_widgets_default_value_translations( $data );
773 653 } );
774 - }
775 -
776 - /**
777 - * @param string $experiment_name
778 - * @param array $classes
779 - * @return void
780 - */
781 - public function register_promoted_active_widgets( string $experiment_name, array $classes ): void {
782 - if ( ! Plugin::$instance->experiments->is_feature_active( $experiment_name ) || empty( $classes ) ) {
783 - return;
784 - }
785 -
786 - foreach ( $classes as $class_name ) {
787 - $this->register( new $class_name() );
788 - }
789 654 }
790 655 }