Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/includes/managers/widgets.php
Keine Baseline-Datei – Diff nur gegen leer.
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
+