PluginProbe
Elementor Website Builder – more than just a page builder / 3.0.6
Elementor Website Builder – more than just a page builder v3.0.6
4.3.0-beta3 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 All 452 releases
← All changes | includes/managers/widgets.php +42 -305 4.3.0-beta33.0.6 View file →
@@ -1,18 +1,9 @@
1 1 <?php
2 2 namespace Elementor;
3 3
4 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\NestedTabs\Widgets\NestedTabs;
5 +use Elementor\Core\Utils\Exceptions;
15 6
16 7 if ( ! defined( 'ABSPATH' ) ) {
17 8 exit; // Exit if accessed directly.
18 9 }
@@ -39,49 +30,19 @@
39 30 */
40 31 private $_widget_types = null;
41 32
42 33 /**
43 - * Promoted widget types.
44 - *
45 - * Holds the list of all the Promoted widget types.
46 - *
47 - * @since 3.15.0
48 - * @access private
49 - *
50 - * @var Widget_Base[]
51 - *
52 - * @return array
53 - */
54 - private array $promoted_widgets = [
55 - 'container' => [
56 - NestedTabs::class,
57 - Nested_Accordion::class,
58 - ],
59 - 'atomic_widgets' => [
60 - Atomic_Heading::class,
61 - Atomic_Image::class,
62 - Atomic_Paragraph::class,
63 - Atomic_Button::class,
64 - Atomic_Svg::class,
65 - Atomic_Divider::class,
66 - ],
67 - ];
68 -
69 - /**
70 34 * Init widgets.
71 35 *
72 - * Initialize Elementor widgets manager. Include all the widgets files
36 + * Initialize Elementor widgets manager. Include all the the widgets files
73 37 * and register each Elementor and WordPress widget.
74 38 *
75 39 * @since 2.0.0
76 40 * @access private
77 - */
41 + */
78 42 private function init_widgets() {
79 43 $build_widgets_filename = [
80 - 'common-base',
81 44 'common',
82 - 'common-optimized',
83 - 'inner-section',
84 45 'heading',
85 46 'image',
86 47 'text-editor',
87 48 'video',
@@ -109,23 +70,20 @@
109 70 'html',
110 71 'menu-anchor',
111 72 'sidebar',
112 73 'read-more',
113 - 'rating',
114 74 ];
115 75
116 76 $this->_widget_types = [];
117 77
118 - $this->register_promoted_widgets();
119 -
120 78 foreach ( $build_widgets_filename as $widget_filename ) {
121 - include ELEMENTOR_PATH . 'includes/widgets/' . $widget_filename . '.php';
79 + include( ELEMENTOR_PATH . 'includes/widgets/' . $widget_filename . '.php' );
122 80
123 81 $class_name = str_replace( '-', '_', $widget_filename );
124 82
125 83 $class_name = __NAMESPACE__ . '\Widget_' . $class_name;
126 84
127 - $this->register( new $class_name() );
85 + $this->register_widget_type( new $class_name() );
128 86 }
129 87
130 88 $this->register_wp_widgets();
131 89
@@ -134,29 +92,12 @@
134 92 *
135 93 * Fires after Elementor widgets are registered.
136 94 *
137 95 * @since 1.0.0
138 - * @deprecated 3.5.0 Use `elementor/widgets/register` hook instead.
139 96 *
140 97 * @param Widgets_Manager $this The widgets manager.
141 98 */
142 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->do_deprecated_action(
143 - 'elementor/widgets/widgets_registered',
144 - [ $this ],
145 - '3.5.0',
146 - 'elementor/widgets/register'
147 - );
148 -
149 - /**
150 - * After widgets registered.
151 - *
152 - * Fires after Elementor widgets are registered.
153 - *
154 - * @since 3.5.0
155 - *
156 - * @param Widgets_Manager $this The widgets manager.
157 - */
158 - do_action( 'elementor/widgets/register', $this );
99 + do_action( 'elementor/widgets/widgets_registered', $this );
159 100 }
160 101
161 102 /**
162 103 * Register WordPress widgets.
@@ -167,12 +108,27 @@
167 108 * plugin authors can filter the black list.
168 109 *
169 110 * @since 2.0.0
170 111 * @access private
171 - */
112 + */
172 113 private function register_wp_widgets() {
173 114 global $wp_widget_factory;
174 115
116 + // Skip Pojo widgets.
117 + $pojo_allowed_widgets = [
118 + 'Pojo_Widget_Recent_Posts',
119 + 'Pojo_Widget_Posts_Group',
120 + 'Pojo_Widget_Gallery',
121 + 'Pojo_Widget_Recent_Galleries',
122 + 'Pojo_Slideshow_Widget',
123 + 'Pojo_Forms_Widget',
124 + 'Pojo_Widget_News_Ticker',
125 +
126 + 'Pojo_Widget_WC_Products',
127 + 'Pojo_Widget_WC_Products_Category',
128 + 'Pojo_Widget_WC_Product_Categories',
129 + ];
130 +
175 131 // Allow themes/plugins to filter out their widgets.
176 132 $black_list = [];
177 133
178 134 /**
@@ -191,11 +147,15 @@
191 147 if ( in_array( $widget_class, $black_list ) ) {
192 148 continue;
193 149 }
194 150
151 + if ( $widget_obj instanceof \Pojo_Widget_Base && ! in_array( $widget_class, $pojo_allowed_widgets ) ) {
152 + continue;
153 + }
154 +
195 155 $elementor_widget_class = __NAMESPACE__ . '\Widget_WordPress';
196 156
197 - $this->register(
157 + $this->register_widget_type(
198 158 new $elementor_widget_class( [], [
199 159 'widget_name' => $widget_class,
200 160 ] )
201 161 );
@@ -208,24 +168,13 @@
208 168 * Require Elementor widget base class.
209 169 *
210 170 * @since 2.0.0
211 171 * @access private
212 - */
172 + */
213 173 private function require_files() {
214 174 require ELEMENTOR_PATH . 'includes/base/widget-base.php';
215 175 }
216 176
217 - private function pluck_default_controls( $controls ) {
218 - return ( new Collection( $controls ) )
219 - ->reduce( function ( $controls_defaults, $control, $control_key ) {
220 - if ( ! empty( $control['default'] ) ) {
221 - $controls_defaults[ $control_key ]['default'] = $control['default'];
222 - }
223 -
224 - return $controls_defaults;
225 - }, [] );
226 - }
227 -
228 177 /**
229 178 * Register widget type.
230 179 *
231 180 * Add a new widget type to the list of registered widget types.
@@ -231,71 +180,23 @@
231 180 * Add a new widget type to the list of registered widget types.
232 181 *
233 182 * @since 1.0.0
234 183 * @access public
235 - * @deprecated 3.5.0 Use `register()` method instead.
236 184 *
237 185 * @param Widget_Base $widget Elementor widget.
238 186 *
239 187 * @return true True if the widget was registered.
240 - */
188 + */
241 189 public function register_widget_type( Widget_Base $widget ) {
242 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function(
243 - __METHOD__,
244 - '3.5.0',
245 - 'register()'
246 - );
247 -
248 - return $this->register( $widget );
249 - }
250 -
251 - /**
252 - * Register a new widget type.
253 - *
254 - * @param \Elementor\Widget_Base $widget_instance Elementor Widget.
255 - *
256 - * @return bool True if the widget was registered.
257 - * @since 3.5.0
258 - * @access public
259 - */
260 - public function register( Widget_Base $widget_instance ) {
261 190 if ( is_null( $this->_widget_types ) ) {
262 191 $this->init_widgets();
263 192 }
264 193
265 - /**
266 - * Should widget be registered.
267 - *
268 - * @since 3.18.0
269 - *
270 - * @param bool $should_register Should widget be registered. Default is `true`.
271 - * @param \Elementor\Widget_Base $widget_instance Widget instance.
272 - */
273 - $should_register = apply_filters( 'elementor/widgets/is_widget_enabled', true, $widget_instance );
194 + $this->_widget_types[ $widget->get_name() ] = $widget;
274 195
275 - if ( ! $should_register ) {
276 - return false;
277 - }
278 -
279 - $this->_widget_types[ $widget_instance->get_name() ] = $widget_instance;
280 -
281 196 return true;
282 197 }
283 198
284 - /** Register promoted widgets
285 - *
286 - * Since we cannot allow widgets to place themselves is a specific
287 - * location on our widgets panel we need to use a hard coded solution for this.
288 - *
289 - * @return void
290 - */
291 - private function register_promoted_widgets() {
292 -
293 - foreach ( $this->promoted_widgets as $experiment_name => $classes ) {
294 - $this->register_promoted_active_widgets( $experiment_name, $classes );
295 - }
296 - }
297 -
298 199 /**
299 200 * Unregister widget type.
300 201 *
301 202 * Removes widget type from the list of registered widget types.
@@ -301,37 +202,14 @@
301 202 * Removes widget type from the list of registered widget types.
302 203 *
303 204 * @since 1.0.0
304 205 * @access public
305 - * @deprecated 3.5.0 Use `unregister()` method instead.
306 206 *
307 207 * @param string $name Widget name.
308 208 *
309 209 * @return true True if the widget was unregistered, False otherwise.
310 - */
210 + */
311 211 public function unregister_widget_type( $name ) {
312 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function(
313 - __METHOD__,
314 - '3.5.0',
315 - 'unregister()'
316 - );
317 -
318 - return $this->unregister( $name );
319 - }
320 -
321 - /**
322 - * Unregister widget type.
323 - *
324 - * Removes widget type from the list of registered widget types.
325 - *
326 - * @since 3.5.0
327 - * @access public
328 - *
329 - * @param string $name Widget name.
330 - *
331 - * @return boolean Whether the widget was unregistered.
332 - */
333 - public function unregister( $name ) {
334 212 if ( ! isset( $this->_widget_types[ $name ] ) ) {
335 213 return false;
336 214 }
337 215
@@ -350,9 +228,9 @@
350 228 *
351 229 * @param string $widget_name Optional. Widget name. Default is null.
352 230 *
353 231 * @return Widget_Base|Widget_Base[]|null Registered widget types.
354 - */
232 + */
355 233 public function get_widget_types( $widget_name = null ) {
356 234 if ( is_null( $this->_widget_types ) ) {
357 235 $this->init_widgets();
358 236 }
@@ -372,9 +250,9 @@
372 250 * @since 1.0.0
373 251 * @access public
374 252 *
375 253 * @return array Registered widget types with each widget config.
376 - */
254 + */
377 255 public function get_widget_types_config() {
378 256 $config = [];
379 257
380 258 foreach ( $this->get_widget_types() as $widget_key => $widget ) {
@@ -383,16 +261,9 @@
383 261
384 262 return $config;
385 263 }
386 264
387 - /**
388 - * @throws \Exception If current user don't have permissions to edit the post.
389 - */
390 265 public function ajax_get_widget_types_controls_config( array $data ) {
391 - Plugin::$instance->documents->check_permissions( $data['editor_post_id'] );
392 -
393 - wp_raise_memory_limit( 'admin' );
394 -
395 266 $config = [];
396 267
397 268 foreach ( $this->get_widget_types() as $widget_key => $widget ) {
398 269 if ( isset( $data['exclude'][ $widget_key ] ) ) {
@@ -408,61 +279,8 @@
408 279 return $config;
409 280 }
410 281
411 282 /**
412 - * @throws \Exception If current user don't have permissions to edit the post.
413 - */
414 - public function ajax_refresh_widgets_config( array $data ) {
415 - Plugin::$instance->documents->check_permissions( $data['editor_post_id'] );
416 -
417 - wp_raise_memory_limit( 'admin' );
418 -
419 - $widgets = [];
420 -
421 - foreach ( $this->get_widget_types() as $widget_key => $widget ) {
422 - $widget_config = $widget->get_config();
423 -
424 - // get_config() omits controls when the stack isn't initialized yet (see Widget_Base::get_initial_config).
425 - // During an AJAX refresh the instances are fresh, so we force-initialize and merge them explicitly.
426 - $widget_config['controls'] = $widget->get_stack( false )['controls'];
427 - $widget_config['tabs_controls'] = $widget->get_tabs_controls();
428 -
429 - $widgets[ $widget_key ] = $widget_config;
430 - }
431 -
432 - return [
433 - 'widgets' => $widgets,
434 - 'categories' => Plugin::$instance->elements_manager->get_categories(),
435 - ];
436 - }
437 -
438 - public function ajax_get_widgets_default_value_translations( array $data = [] ) {
439 - $locale = empty( $data['locale'] )
440 - ? get_locale()
441 - : $data['locale'];
442 -
443 - $force_locale = new Force_Locale( $locale );
444 - $force_locale->force();
445 -
446 - $controls = ( new Collection( $this->get_widget_types() ) )
447 - ->map( function ( Widget_Base $widget ) {
448 - $controls = $widget->get_stack( false )['controls'];
449 -
450 - return [
451 - 'controls' => $this->pluck_default_controls( $controls ),
452 - ];
453 - } )
454 - ->filter( function ( $widget ) {
455 - return ! empty( $widget['controls'] );
456 - } )
457 - ->all();
458 -
459 - $force_locale->restore();
460 -
461 - return $controls;
462 - }
463 -
464 - /**
465 283 * Ajax render widget.
466 284 *
467 285 * Ajax handler for Elementor render_widget.
468 286 *
@@ -481,10 +299,14 @@
481 299 * @type string $render The rendered HTML.
482 300 * }
483 301 */
484 302 public function ajax_render_widget( $request ) {
485 - $document = Plugin::$instance->documents->get_with_permissions( $request['editor_post_id'] );
303 + $document = Plugin::$instance->documents->get( $request['editor_post_id'] );
486 304
305 + if ( ! $document->is_editable_by_current_user() ) {
306 + throw new \Exception( 'Access denied.', Exceptions::FORBIDDEN );
307 + }
308 +
487 309 // Override the global $post for the render.
488 310 query_posts(
489 311 [
490 312 'p' => $request['editor_post_id'],
@@ -519,13 +341,10 @@
519 341 *
520 342 * @param array $request Ajax request.
521 343 *
522 344 * @return bool|string Rendered widget form.
523 - * @throws \Exception If current user don't have permissions to edit the post.
524 345 */
525 346 public function ajax_get_wp_widget_form( $request ) {
526 - Plugin::$instance->documents->check_permissions( $request['editor_post_id'] );
527 -
528 347 if ( empty( $request['widget_type'] ) ) {
529 348 return false;
530 349 }
531 350
@@ -559,9 +378,9 @@
559 378 * template, for all the registered widget types.
560 379 *
561 380 * @since 1.0.0
562 381 * @access public
563 - */
382 + */
564 383 public function render_widgets_content() {
565 384 foreach ( $this->get_widget_types() as $widget ) {
566 385 $widget->print_template();
567 386 }
@@ -576,9 +395,9 @@
576 395 * @since 1.3.0
577 396 * @access public
578 397 *
579 398 * @return array Registered widget types with settings keys for each widget.
580 - */
399 + */
581 400 public function get_widgets_frontend_settings_keys() {
582 401 $keys = [];
583 402
584 403 foreach ( $this->get_widget_types() as $widget_type_name => $widget_type ) {
@@ -592,63 +411,8 @@
592 411 return $keys;
593 412 }
594 413
595 414 /**
596 - * Widgets with styles.
597 - *
598 - * This method returns the list of all the widgets in the `/includes/`
599 - * folder that have styles.
600 - *
601 - * @since 3.24.0
602 - * @access public
603 - *
604 - * @return array The names of the widgets that have styles.
605 - */
606 - public function widgets_with_styles(): array {
607 - return [
608 - 'counter',
609 - 'divider',
610 - 'google_maps',
611 - 'heading',
612 - 'image',
613 - 'image-carousel',
614 - 'menu-anchor',
615 - 'rating',
616 - 'social-icons',
617 - 'spacer',
618 - 'testimonial',
619 - 'text-editor',
620 - 'video',
621 - ];
622 - }
623 -
624 - /**
625 - * Widgets with responsive styles.
626 - *
627 - * This method returns the list of all the widgets in the `/includes/`
628 - * folder that have responsive styles.
629 - *
630 - * @since 3.24.0
631 - * @access public
632 - *
633 - * @return array The names of the widgets that have responsive styles.
634 - */
635 - public function widgets_with_responsive_styles(): array {
636 - return [
637 - 'accordion',
638 - 'alert',
639 - 'icon-box',
640 - 'icon-list',
641 - 'image-box',
642 - 'image-gallery',
643 - 'progress',
644 - 'star-rating',
645 - 'tabs',
646 - 'toggle',
647 - ];
648 - }
649 -
650 - /**
651 415 * Enqueue widgets scripts.
652 416 *
653 417 * Enqueue all the scripts defined as a dependency for each widget.
654 418 *
@@ -653,9 +417,9 @@
653 417 * Enqueue all the scripts defined as a dependency for each widget.
654 418 *
655 419 * @since 1.3.0
656 420 * @access public
657 - */
421 + */
658 422 public function enqueue_widgets_scripts() {
659 423 foreach ( $this->get_widget_types() as $widget ) {
660 424 $widget->enqueue_scripts();
661 425 }
@@ -660,14 +424,8 @@
660 424 $widget->enqueue_scripts();
661 425 }
662 426 }
663 427
664 - public function register_frontend_handlers() {
665 - foreach ( $this->get_widget_types() as $widget ) {
666 - $widget->register_frontend_handlers();
667 - }
668 - }
669 -
670 428 /**
671 429 * Enqueue widgets styles
672 430 *
673 431 * Enqueue all the styles defined as a dependency for each widget
@@ -742,9 +500,9 @@
742 500 * Initializing Elementor widgets manager.
743 501 *
744 502 * @since 1.0.0
745 503 * @access public
746 - */
504 + */
747 505 public function __construct() {
748 506 $this->require_files();
749 507
750 508 add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_actions' ] );
@@ -763,27 +521,6 @@
763 521 public function register_ajax_actions( Ajax $ajax_manager ) {
764 522 $ajax_manager->register_ajax_action( 'render_widget', [ $this, 'ajax_render_widget' ] );
765 523 $ajax_manager->register_ajax_action( 'editor_get_wp_widget_form', [ $this, 'ajax_get_wp_widget_form' ] );
766 524 $ajax_manager->register_ajax_action( 'get_widgets_config', [ $this, 'ajax_get_widget_types_controls_config' ] );
767 -
768 - $ajax_manager->register_ajax_action( 'refresh_widgets_config', [ $this, 'ajax_refresh_widgets_config' ] );
769 -
770 - $ajax_manager->register_ajax_action( 'get_widgets_default_value_translations', function ( array $data ) {
771 - return $this->ajax_get_widgets_default_value_translations( $data );
772 - } );
773 - }
774 -
775 - /**
776 - * @param string $experiment_name
777 - * @param array $classes
778 - * @return void
779 - */
780 - public function register_promoted_active_widgets( string $experiment_name, array $classes ): void {
781 - if ( ! Plugin::$instance->experiments->is_feature_active( $experiment_name ) || empty( $classes ) ) {
782 - return;
783 - }
784 -
785 - foreach ( $classes as $class_name ) {
786 - $this->register( new $class_name() );
787 - }
788 525 }
789 526 }