PluginProbe
Elementor Website Builder – more than just a page builder / 3.5.6
Elementor Website Builder – more than just a page builder v3.5.6
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/base/controls-stack.php +80 -268 4.1.0-dev13.5.6 View file →
@@ -2,11 +2,10 @@
2 2 namespace Elementor;
3 3
4 4 use Elementor\Core\Base\Base_Object;
5 5 use Elementor\Core\DynamicTags\Manager;
6 +use Elementor\Core\Schemes\Manager as Schemes_Manager;
6 7 use Elementor\Core\Breakpoints\Manager as Breakpoints_Manager;
7 -use Elementor\Core\Frontend\Performance;
8 -use Elementor\Utils;
9 8
10 9 if ( ! defined( 'ABSPATH' ) ) {
11 10 exit; // Exit if accessed directly.
12 11 }
@@ -226,26 +225,12 @@
226 225 public function get_id_int() {
227 226 /** We ignore possible notices, in order to support elements created prior to v1.8.0 and might include
228 227 * non-base 16 characters as part of their ID.
229 228 */
230 - return @hexdec( (string) $this->id );
229 + return @hexdec( $this->id );
231 230 }
232 231
233 232 /**
234 - * Get widget number.
235 - *
236 - * Get the first three numbers of the element converted ID.
237 - *
238 - * @since 3.16
239 - * @access public
240 - *
241 - * @return string The widget number.
242 - */
243 - public function get_widget_number(): string {
244 - return substr( $this->get_id_int(), 0, 3 );
245 - }
246 -
247 - /**
248 233 * Get the type.
249 234 *
250 235 * Retrieve the type, e.g. 'stack', 'section', 'widget' etc.
251 236 *
@@ -311,26 +296,9 @@
311 296 *
312 297 * @return mixed Controls list.
313 298 */
314 299 public function get_controls( $control_id = null ) {
315 - $stack = $this->get_stack();
316 -
317 - if ( null !== $control_id ) {
318 - $control_data = self::get_items( $stack['controls'], $control_id );
319 - if ( null === $control_data && ! empty( $stack['style_controls'] ) ) {
320 - $control_data = self::get_items( $stack['style_controls'], $control_id );
321 - }
322 -
323 - return $control_data;
324 - }
325 -
326 - $controls = $stack['controls'];
327 -
328 - if ( Performance::is_use_style_controls() && ! empty( $stack['style_controls'] ) ) {
329 - $controls += $stack['style_controls'];
330 - }
331 -
332 - return self::get_items( $controls, $control_id );
300 + return self::get_items( $this->get_stack()['controls'], $control_id );
333 301 }
334 302
335 303 /**
336 304 * Get active controls.
@@ -349,10 +317,10 @@
349 317 * @param array $settings Optional. Controls settings. Default is null.
350 318 *
351 319 * @return array Active controls.
352 320 */
353 - public function get_active_controls( ?array $controls = null, ?array $settings = null ) {
354 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.0.0' );
321 + public function get_active_controls( array $controls = null, array $settings = null ) {
322 + // _deprecated_function( __METHOD__, '3.0.0' );
355 323
356 324 if ( ! $controls ) {
357 325 $controls = $this->get_controls();
358 326 }
@@ -364,9 +332,9 @@
364 332 $active_controls = array_reduce(
365 333 array_keys( $controls ), function( $active_controls, $control_key ) use ( $controls, $settings ) {
366 334 $control = $controls[ $control_key ];
367 335
368 - if ( $this->is_control_visible( $control, $settings, $controls ) ) {
336 + if ( $this->is_control_visible( $control, $settings ) ) {
369 337 $active_controls[ $control_key ] = $control;
370 338 }
371 339
372 340 return $active_controls;
@@ -439,58 +407,14 @@
439 407 }
440 408
441 409 unset( $options['position'] );
442 410
443 - if ( $this->current_popover ) {
444 - $args['popover'] = [];
445 -
446 - if ( ! $this->current_popover['initialized'] ) {
447 - $args['popover']['start'] = true;
448 -
449 - $this->current_popover['initialized'] = true;
450 - }
451 - }
452 -
453 - if ( Performance::should_optimize_controls() ) {
454 - $ui_controls = [
455 - Controls_Manager::RAW_HTML,
456 - Controls_Manager::DIVIDER,
457 - Controls_Manager::HEADING,
458 - Controls_Manager::BUTTON,
459 - Controls_Manager::ALERT,
460 - Controls_Manager::NOTICE,
461 - Controls_Manager::DEPRECATED_NOTICE,
411 + if ( $this->current_popover && ! $this->current_popover['initialized'] ) {
412 + $args['popover'] = [
413 + 'start' => true,
462 414 ];
463 415
464 - if ( ! empty( $args['type'] ) && ! empty( $args['section'] ) && in_array( $args['type'], $ui_controls ) ) {
465 - $args = [
466 - 'type' => $args['type'],
467 - 'section' => $args['section'],
468 - ];
469 - }
470 -
471 - unset(
472 - $args['label_block'],
473 - $args['label'],
474 - $args['title'],
475 - $args['tab'],
476 - $args['options'],
477 - $args['placeholder'],
478 - $args['separator'],
479 - $args['size_units'],
480 - $args['range'],
481 - $args['toggle'],
482 - $args['ai'],
483 - $args['classes'],
484 - $args['style_transfer'],
485 - $args['show_label'],
486 - $args['description'],
487 - $args['label_on'],
488 - $args['label_off'],
489 - $args['labels'],
490 - $args['handles'],
491 - $args['editor_available'],
492 - );
416 + $this->current_popover['initialized'] = true;
493 417 }
494 418
495 419 return Plugin::$instance->controls_manager->add_control_to_stack( $this, $id, $args, $options );
496 420 }
@@ -612,10 +536,10 @@
612 536
613 537 $position = array_merge( $default_position, $position );
614 538
615 539 if (
616 - ( 'control' === $position['type'] && in_array( $position['at'], [ 'start', 'end' ], true ) ) ||
617 - ( 'section' === $position['type'] && in_array( $position['at'], [ 'before', 'after' ], true ) )
540 + 'control' === $position['type'] && in_array( $position['at'], [ 'start', 'end' ], true ) ||
541 + 'section' === $position['type'] && in_array( $position['at'], [ 'before', 'after' ], true )
618 542 ) {
619 543 _doing_it_wrong( sprintf( '%s::%s', get_called_class(), __FUNCTION__ ), 'Invalid position arguments. Use `before` / `after` for control or `start` / `end` for section.', '1.7.0' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
620 544
621 545 return false;
@@ -637,13 +561,13 @@
637 561
638 562 $controls_keys = array_keys( $registered_controls );
639 563
640 564 while ( Controls_Manager::SECTION !== $registered_controls[ $controls_keys[ $target_section_index ] ]['type'] ) {
641 - --$target_section_index;
565 + $target_section_index--;
642 566 }
643 567
644 568 if ( 'section' === $position['type'] ) {
645 - ++$target_control_index;
569 + $target_control_index++;
646 570
647 571 if ( 'end' === $position['at'] ) {
648 572 while ( Controls_Manager::SECTION !== $registered_controls[ $controls_keys[ $target_control_index ] ]['type'] ) {
649 573 if ( ++$target_control_index >= count( $registered_controls ) ) {
@@ -655,9 +579,9 @@
655 579
656 580 $target_control = $registered_controls[ $controls_keys[ $target_control_index ] ];
657 581
658 582 if ( 'after' === $position['at'] ) {
659 - ++$target_control_index;
583 + $target_control_index++;
660 584 }
661 585
662 586 $section_id = $registered_controls[ $controls_keys[ $target_section_index ] ]['name'];
663 587
@@ -737,9 +661,9 @@
737 661
738 662 $controls_keys = array_keys( $registered_controls );
739 663
740 664 while ( true ) {
741 - ++$section_index;
665 + $section_index++;
742 666
743 667 if ( ! isset( $controls_keys[ $section_index ] ) ) {
744 668 break;
745 669 }
@@ -750,9 +674,9 @@
750 674 break;
751 675 }
752 676
753 677 $section_controls[ $control_key ] = $registered_controls[ $control_key ];
754 - }
678 + };
755 679
756 680 return $section_controls;
757 681 }
758 682
@@ -781,8 +705,30 @@
781 705 $group->add_controls( $this, $args, $options );
782 706 }
783 707
784 708 /**
709 + * Get scheme controls.
710 + *
711 + * Retrieve all the controls that use schemes.
712 + *
713 + * @since 1.4.0
714 + * @access public
715 + * @deprecated 3.0.0
716 + *
717 + * @return array Scheme controls.
718 + */
719 + final public function get_scheme_controls() {
720 + // _deprecated_function( __METHOD__, '3.0.0' );
721 + $enabled_schemes = Schemes_Manager::get_enabled_schemes();
722 +
723 + return array_filter(
724 + $this->get_controls(), function( $control ) use ( $enabled_schemes ) {
725 + return ( ! empty( $control['scheme'] ) && in_array( $control['scheme']['type'], $enabled_schemes ) );
726 + }
727 + );
728 + }
729 +
730 + /**
785 731 * Get style controls.
786 732 *
787 733 * Retrieve style controls for all active controls or, when requested, from
788 734 * a specific set of controls.
@@ -796,10 +742,10 @@
796 742 * @param array $settings Optional. Controls settings. Default is null.
797 743 *
798 744 * @return array Style controls.
799 745 */
800 - final public function get_style_controls( ?array $controls = null, ?array $settings = null ) {
801 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.0.0' );
746 + final public function get_style_controls( array $controls = null, array $settings = null ) {
747 + // _deprecated_function( __METHOD__, '3.0.0' );
802 748
803 749 $controls = $this->get_active_controls( $controls, $settings );
804 750
805 751 $style_controls = [];
@@ -869,12 +815,9 @@
869 815 $args['responsive'] = [];
870 816
871 817 $active_breakpoints = Plugin::$instance->breakpoints->get_active_breakpoints();
872 818
873 - $devices = Plugin::$instance->breakpoints->get_active_devices_list( [
874 - 'reverse' => true,
875 - 'desktop_first' => true,
876 - ] );
819 + $devices = Plugin::$instance->breakpoints->get_active_devices_list( [ 'reverse' => true ] );
877 820
878 821 if ( isset( $args['devices'] ) ) {
879 822 $devices = array_intersect( $devices, $args['devices'] );
880 823
@@ -930,14 +873,9 @@
930 873 foreach ( $devices as $device_name ) {
931 874 $control_args = $args;
932 875
933 876 // Set parent using the name from previous iteration.
934 - if ( isset( $control_name ) ) {
935 - // If $control_name end with _widescreen use desktop name instead.
936 - $control_args['parent'] = '_widescreen' === substr( $control_name, -strlen( '_widescreen' ) ) ? $id : $control_name;
937 - } else {
938 - $control_args['parent'] = null;
939 - }
877 + $control_args['parent'] = isset( $control_name ) ? $control_name : null;
940 878
941 879 if ( isset( $control_args['device_args'] ) ) {
942 880 if ( ! empty( $control_args['device_args'][ $device_name ] ) ) {
943 881 $control_args = array_merge( $control_args, $control_args['device_args'][ $device_name ] );
@@ -979,11 +917,9 @@
979 917 $id_suffix = Breakpoints_Manager::BREAKPOINT_KEY_DESKTOP === $device_name ? '' : '_' . $device_name;
980 918 $control_name = $id . $id_suffix;
981 919
982 920 // Set this control as child of previous iteration control.
983 - if ( ! empty( $control_args['parent'] ) ) {
984 - $this->update_control( $control_args['parent'], [ 'inheritors' => [ $control_name ] ] );
985 - }
921 + $this->update_control( $control_args['parent'], [ 'inheritors' => [ $control_name ] ] );
986 922
987 923 if ( ! empty( $options['overwrite'] ) ) {
988 924 $this->update_control( $control_name, $control_args, [
989 925 'recursive' => ! empty( $options['recursive'] ),
@@ -1060,10 +996,10 @@
1060 996 * @return array|null The config.
1061 997 */
1062 998 final public function get_config() {
1063 999 if ( null === $this->config ) {
1064 - // TODO: This is for backwards compatibility starting from 2.9.0.
1065 - // This if statement should be removed when the method is hard-deprecated.
1000 + // TODO: This is for backwards compatibility starting from 2.9.0
1001 + // This if statement should be removed when the method is hard-deprecated
1066 1002 if ( $this->has_own_method( '_get_initial_config', self::class ) ) {
1067 1003 Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( '_get_initial_config', '2.9.0', __CLASS__ . '::get_initial_config()' );
1068 1004
1069 1005 $this->config = $this->_get_initial_config();
@@ -1087,10 +1023,8 @@
1087 1023 * Set a config property.
1088 1024 *
1089 1025 * Set a specific property of the config list for this controls-stack.
1090 1026 *
1091 - * @param string $key
1092 - * @param string $value
1093 1027 * @since 3.5.0
1094 1028 * @access public
1095 1029 */
1096 1030 public function set_config( $key, $value ) {
@@ -1166,11 +1100,8 @@
1166 1100 return self::get_items( $this->data, $item );
1167 1101 }
1168 1102
1169 1103 /**
1170 - * @param null $setting
1171 - * @param null $settings
1172 - * @return array|mixed|null
1173 1104 * @since 2.0.14
1174 1105 * @access public
1175 1106 */
1176 1107 public function get_parsed_dynamic_settings( $setting = null, $settings = null ) {
@@ -1189,16 +1120,16 @@
1189 1120 * Get active settings.
1190 1121 *
1191 1122 * Retrieve the settings from all the active controls.
1192 1123 *
1193 - * @param array|null $settings Optional. Controls settings. Default is null.
1194 - * @param array|null $controls Optional. An array of controls. Default is null.
1195 - *
1196 - * @return array Active settings.
1124 + * @since 1.4.0
1197 1125 * @since 2.1.0 Added the `controls` and the `settings` parameters.
1198 1126 * @access public
1199 1127 *
1200 - * @since 1.4.0
1128 + * @param array $controls Optional. An array of controls. Default is null.
1129 + * @param array $settings Optional. Controls settings. Default is null.
1130 + *
1131 + * @return array Active settings.
1201 1132 */
1202 1133 public function get_active_settings( $settings = null, $controls = null ) {
1203 1134 $is_first_request = ! $settings && ! $this->active_settings;
1204 1135
@@ -1213,10 +1144,8 @@
1213 1144 }
1214 1145
1215 1146 $active_settings = [];
1216 1147
1217 - $controls_objs = Plugin::$instance->controls_manager->get_controls();
1218 -
1219 1148 foreach ( $settings as $setting_key => $setting ) {
1220 1149 if ( ! isset( $controls[ $setting_key ] ) ) {
1221 1150 $active_settings[ $setting_key ] = $setting;
1222 1151
@@ -1224,10 +1153,10 @@
1224 1153 }
1225 1154
1226 1155 $control = $controls[ $setting_key ];
1227 1156
1228 - if ( $this->is_control_visible( $control, $settings, $controls ) ) {
1229 - $control_obj = $controls_objs[ $control['type'] ] ?? null;
1157 + if ( $this->is_control_visible( $control, $settings ) ) {
1158 + $control_obj = Plugin::$instance->controls_manager->get_control( $control['type'] );
1230 1159
1231 1160 if ( $control_obj instanceof Control_Repeater ) {
1232 1161 foreach ( $setting as & $item ) {
1233 1162 $item = $this->get_active_settings( $item, $control['fields'] );
@@ -1294,13 +1223,11 @@
1294 1223 if ( null === $controls ) {
1295 1224 $controls = $this->get_controls();
1296 1225 }
1297 1226
1298 - $controls_objs = Plugin::$instance->controls_manager->get_controls();
1299 -
1300 1227 foreach ( $controls as $control ) {
1301 1228 $control_name = $control['name'];
1302 - $control_obj = $controls_objs[ $control['type'] ] ?? null;
1229 + $control_obj = Plugin::$instance->controls_manager->get_control( $control['type'] );
1303 1230
1304 1231 if ( ! $control_obj instanceof Base_Data_Control ) {
1305 1232 continue;
1306 1233 }
@@ -1410,33 +1337,21 @@
1410 1337 );
1411 1338 }
1412 1339
1413 1340 /**
1414 - * Get Responsive Control Device Suffix
1415 - *
1416 - * @deprecated 3.7.6 Use `Elementor\Controls_Manager::get_responsive_control_device_suffix()` instead.
1417 - * @param array $control
1418 - * @return string $device suffix
1419 - */
1420 - protected function get_responsive_control_device_suffix( $control ) {
1421 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.7.6', 'Elementor\Controls_Manager::get_responsive_control_device_suffix()' );
1422 -
1423 - return Controls_Manager::get_responsive_control_device_suffix( $control );
1424 - }
1425 -
1426 - /**
1427 1341 * Whether the control is visible or not.
1428 1342 *
1429 1343 * Used to determine whether the control is visible or not.
1430 1344 *
1345 + * @since 1.4.0
1346 + * @access public
1347 + *
1431 1348 * @param array $control The control.
1432 - * @param null $values Optional. Condition values. Default is null.
1433 - * @param null $controls
1349 + * @param array $values Optional. Condition values. Default is null.
1350 + *
1434 1351 * @return bool Whether the control is visible.
1435 - * @since 1.4.0
1436 - * @access public
1437 1352 */
1438 - public function is_control_visible( $control, $values = null, $controls = null ) {
1353 + public function is_control_visible( $control, $values = null ) {
1439 1354 if ( null === $values ) {
1440 1355 $values = $this->get_settings();
1441 1356 }
1442 1357
@@ -1447,37 +1362,21 @@
1447 1362 if ( empty( $control['condition'] ) ) {
1448 1363 return true;
1449 1364 }
1450 1365
1451 - if ( ! $controls ) {
1452 - $controls = $this->get_controls();
1453 - }
1454 -
1455 1366 foreach ( $control['condition'] as $condition_key => $condition_value ) {
1456 1367 preg_match( '/([a-z_\-0-9]+)(?:\[([a-z_]+)])?(!?)$/i', $condition_key, $condition_key_parts );
1457 1368
1458 1369 $pure_condition_key = $condition_key_parts[1];
1459 1370 $condition_sub_key = $condition_key_parts[2];
1460 - $is_negative_condition = (bool) $condition_key_parts[3];
1371 + $is_negative_condition = ! ! $condition_key_parts[3];
1461 1372
1462 1373 if ( ! isset( $values[ $pure_condition_key ] ) || null === $values[ $pure_condition_key ] ) {
1463 1374 return false;
1464 1375 }
1465 1376
1466 - $are_control_and_condition_responsive = isset( $control['responsive'] ) && ! empty( $controls[ $pure_condition_key ]['responsive'] );
1467 - $condition_name_to_check = $pure_condition_key;
1377 + $instance_value = $values[ $pure_condition_key ];
1468 1378
1469 - if ( $are_control_and_condition_responsive ) {
1470 - $device_suffix = Controls_Manager::get_responsive_control_device_suffix( $control );
1471 -
1472 - $condition_name_to_check = $pure_condition_key . $device_suffix;
1473 -
1474 - // If the control is not desktop, and a conditioning control for the corresponding device exists, use it.
1475 - $instance_value = $values[ $pure_condition_key . $device_suffix ] ?? $values[ $pure_condition_key ];
1476 - } else {
1477 - $instance_value = $values[ $pure_condition_key ];
1478 - }
1479 -
1480 1379 if ( $condition_sub_key && is_array( $instance_value ) ) {
1481 1380 if ( ! isset( $instance_value[ $condition_sub_key ] ) ) {
1482 1381 return false;
1483 1382 }
@@ -1484,32 +1383,8 @@
1484 1383
1485 1384 $instance_value = $instance_value[ $condition_sub_key ];
1486 1385 }
1487 1386
1488 - if ( ! $instance_value ) {
1489 - $parent = isset( $controls[ $condition_name_to_check ]['parent'] ) ? $controls[ $condition_name_to_check ]['parent'] : false;
1490 -
1491 - while ( $parent ) {
1492 - $instance_value = $values[ $parent ];
1493 -
1494 - if ( $instance_value ) {
1495 - if ( ! is_array( $instance_value ) ) {
1496 - break;
1497 - }
1498 -
1499 - if ( $condition_sub_key && isset( $instance_value[ $condition_sub_key ] ) ) {
1500 - $instance_value = $instance_value[ $condition_sub_key ];
1501 -
1502 - if ( '' !== $instance_value ) {
1503 - break;
1504 - }
1505 - }
1506 - }
1507 -
1508 - $parent = isset( $controls[ $parent ]['parent'] ) ? $controls[ $parent ]['parent'] : false;
1509 - }
1510 - }
1511 -
1512 1387 /**
1513 1388 * If the $condition_value is a non empty array - check if the $condition_value contains the $instance_value,
1514 1389 * If the $instance_value is a non empty array - check if the $instance_value contains the $condition_value
1515 1390 * otherwise check if they are equal. ( and give the ability to check if the value is an empty array )
@@ -1521,12 +1396,9 @@
1521 1396 } else {
1522 1397 $is_contains = $instance_value === $condition_value;
1523 1398 }
1524 1399
1525 - if (
1526 - ( $is_negative_condition && $is_contains ) ||
1527 - ( ! $is_negative_condition && ! $is_contains )
1528 - ) {
1400 + if ( $is_negative_condition && $is_contains || ! $is_negative_condition && ! $is_contains ) {
1529 1401 return false;
1530 1402 }
1531 1403 }
1532 1404
@@ -1577,12 +1449,8 @@
1577 1449 * @param array $args Section arguments.
1578 1450 */
1579 1451 do_action( "elementor/element/{$stack_name}/{$section_id}/before_section_start", $this, $args );
1580 1452
1581 - if ( $this->should_manually_trigger_common_action( $stack_name ) ) {
1582 - do_action( "elementor/element/common/{$section_id}/before_section_start", $this, $args );
1583 - }
1584 -
1585 1453 $args['type'] = Controls_Manager::SECTION;
1586 1454
1587 1455 $this->add_control( $section_id, $args );
1588 1456
@@ -1621,12 +1489,8 @@
1621 1489 * @param Controls_Stack $this The control.
1622 1490 * @param array $args Section arguments.
1623 1491 */
1624 1492 do_action( "elementor/element/{$stack_name}/{$section_id}/after_section_start", $this, $args );
1625 -
1626 - if ( $this->should_manually_trigger_common_action( $stack_name ) ) {
1627 - do_action( "elementor/element/common/{$section_id}/after_section_start", $this, $args );
1628 - }
1629 1493 }
1630 1494
1631 1495 /**
1632 1496 * End controls section.
@@ -1675,12 +1539,8 @@
1675 1539 * @param array $args Section arguments.
1676 1540 */
1677 1541 do_action( "elementor/element/{$stack_name}/{$section_id}/before_section_end", $this, $args );
1678 1542
1679 - if ( $this->should_manually_trigger_common_action( $stack_name ) ) {
1680 - do_action( "elementor/element/common/{$section_id}/before_section_end", $this, $args );
1681 - }
1682 -
1683 1543 $this->current_section = null;
1684 1544
1685 1545 /**
1686 1546 * After section end.
@@ -1707,40 +1567,11 @@
1707 1567 * @param Controls_Stack $this The control.
1708 1568 * @param array $args Section arguments.
1709 1569 */
1710 1570 do_action( "elementor/element/{$stack_name}/{$section_id}/after_section_end", $this, $args );
1711 -
1712 - if ( $this->should_manually_trigger_common_action( $stack_name ) ) {
1713 - do_action( "elementor/element/common/{$section_id}/after_section_end", $this, $args );
1714 - }
1715 1571 }
1716 1572
1717 1573 /**
1718 - * Should manually trigger common action.
1719 - *
1720 - * With the Optimized Markup experiment, the Advanced Tab has been split to maintain backward compatibility:
1721 - * - 'common' refers to the existing Advanced Tab.
1722 - * - 'common-optimized' refers to the new Advanced Tab for optimized widgets.
1723 - *
1724 - * Third-party developers may have used hooks like 'elementor/element/common/_section_background/before_section_end'
1725 - * to add controls to the Advanced Tab. However, this hook will now only work on widgets that are not optimized.
1726 - *
1727 - * This method checks whether the 'elementor/element/common/...' hooks should be manually executed
1728 - * to prevent third parties from needing to add equivalent hooks for 'elementor/element/common-optimized/...'.
1729 - *
1730 - * @todo Remove this method and the manual execution of 'common' hooks when the feature is merged.
1731 - *
1732 - * @access private
1733 - *
1734 - * @param string $stack_name Stack name.
1735 - *
1736 - * @return bool
1737 - */
1738 - private function should_manually_trigger_common_action( $stack_name ): bool {
1739 - return 'common-optimized' === $stack_name && Plugin::$instance->experiments->is_feature_active( 'e_optimized_markup' );
1740 - }
1741 -
1742 - /**
1743 1574 * Start controls tabs.
1744 1575 *
1745 1576 * Used to add a new set of tabs inside a section. You should use this
1746 1577 * method before adding new individual tabs using `start_controls_tab()`.
@@ -2013,10 +1844,10 @@
2013 1844 *
2014 1845 * @since 2.7.0
2015 1846 * @access public
2016 1847 *
2017 - * @param string $element The HTML element.
2018 - * @param string $key Optional. Attribute key. Default is null.
1848 + * @param string $element The HTML element.
1849 + * @param string $key Optional. Attribute key. Default is null.
2019 1850 * @param array|string $values Optional. Attribute value/s. Default is null.
2020 1851 */
2021 1852 public function remove_render_attribute( $element, $key = null, $values = null ) {
2022 1853 if ( $key && ! isset( $this->render_attributes[ $element ][ $key ] ) ) {
@@ -2073,9 +1904,9 @@
2073 1904 *
2074 1905 * @param array|string $element The element.
2075 1906 */
2076 1907 public function print_render_attribute_string( $element ) {
2077 - Utils::print_unescaped_internal_string( $this->get_render_attribute_string( $element ) );
1908 + echo $this->get_render_attribute_string( $element ); // XSS ok.
2078 1909 }
2079 1910
2080 1911 /**
2081 1912 * Print element template.
@@ -2088,9 +1919,9 @@
2088 1919 public function print_template() {
2089 1920 ob_start();
2090 1921
2091 1922 // TODO: This is for backwards compatibility starting from 2.9.0
2092 - // This `if` statement should be removed when the method is removed.
1923 + // This `if` statement should be removed when the method is removed
2093 1924 if ( $this->has_own_method( '_content_template', self::class ) ) {
2094 1925 Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( '_content_template', '2.9.0', __CLASS__ . '::content_template()' );
2095 1926
2096 1927 $this->_content_template();
@@ -2126,23 +1957,8 @@
2126 1957 <?php
2127 1958 }
2128 1959
2129 1960 /**
2130 - * On import update dynamic content (e.g. post and term IDs).
2131 - *
2132 - * @since 3.8.0
2133 - *
2134 - * @param array $config The config of the passed element.
2135 - * @param array $data The data that requires updating/replacement when imported.
2136 - * @param array|null $controls The available controls.
2137 - *
2138 - * @return array Element data.
2139 - */
2140 - public static function on_import_update_dynamic_content( array $config, array $data, $controls = null ): array {
2141 - return $config;
2142 - }
2143 -
2144 - /**
2145 1961 * Start injection.
2146 1962 *
2147 1963 * Used to inject controls and sections to a specific position in the stack.
2148 1964 *
@@ -2217,12 +2033,12 @@
2217 2033 * `start_controls_tab()`.
2218 2034 *
2219 2035 * @since 1.4.0
2220 2036 * @access protected
2221 - * @deprecated 3.1.0 Use `register_controls()` method instead.
2037 + * @deprecated 3.1.0 Use `Controls_Stack::register_controls()` instead
2222 2038 */
2223 2039 protected function _register_controls() {
2224 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.1.0', 'register_controls()' );
2040 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.1.0', __CLASS__ . '::register_controls()' );
2225 2041
2226 2042 $this->register_controls();
2227 2043 }
2228 2044
@@ -2265,12 +2081,10 @@
2265 2081 */
2266 2082 protected function get_init_settings() {
2267 2083 $settings = $this->get_data( 'settings' );
2268 2084
2269 - $controls_objs = Plugin::$instance->controls_manager->get_controls();
2270 -
2271 2085 foreach ( $this->get_controls() as $control ) {
2272 - $control_obj = $controls_objs[ $control['type'] ] ?? null;
2086 + $control_obj = Plugin::$instance->controls_manager->get_control( $control['type'] );
2273 2087
2274 2088 if ( ! $control_obj instanceof Base_Data_Control ) {
2275 2089 continue;
2276 2090 }
@@ -2306,15 +2120,15 @@
2306 2120 * Retrieve the current element initial configuration - controls list and
2307 2121 * the tabs assigned to the control.
2308 2122 *
2309 2123 * @since 1.4.0
2310 - * @deprecated 2.9.0 Use `get_initial_config()` method instead.
2124 + * @deprecated 2.9.0 use `get_initial_config()` instead
2311 2125 * @access protected
2312 2126 *
2313 2127 * @return array The initial config.
2314 2128 */
2315 2129 protected function _get_initial_config() {
2316 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '2.9.0', 'get_initial_config()' );
2130 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '2.9.0', __CLASS__ . '::get_initial_config()' );
2317 2131
2318 2132 return $this->get_initial_config();
2319 2133 }
2320 2134
@@ -2385,9 +2199,9 @@
2385 2199 *
2386 2200 * @param string $template_content Template content.
2387 2201 */
2388 2202 protected function print_template_content( $template_content ) {
2389 - Utils::print_unescaped_internal_string( $template_content );
2203 + echo $template_content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2390 2204 }
2391 2205
2392 2206 /**
2393 2207 * Render element output in the editor.
@@ -2404,13 +2218,13 @@
2404 2218 *
2405 2219 * Used to generate the live preview, using a Backbone JavaScript template.
2406 2220 *
2407 2221 * @since 2.0.0
2408 - * @deprecated 2.9.0 Use `content_template()` method instead.
2222 + * @deprecated 2.9.0 use `content_template()` instead
2409 2223 * @access protected
2410 2224 */
2411 2225 protected function _content_template() {
2412 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '2.9.0', 'content_template()' );
2226 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '2.9.0', __CLASS__ . '::content_template()' );
2413 2227
2414 2228 $this->content_template();
2415 2229 }
2416 2230
@@ -2425,9 +2239,9 @@
2425 2239 protected function init_controls() {
2426 2240 Plugin::$instance->controls_manager->open_stack( $this );
2427 2241
2428 2242 // TODO: This is for backwards compatibility starting from 2.9.0
2429 - // This `if` statement should be removed when the method is removed.
2243 + // This `if` statement should be removed when the method is removed
2430 2244 if ( $this->has_own_method( '_register_controls', self::class ) ) {
2431 2245 Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( '_register_controls', '3.1.0', __CLASS__ . '::register_controls()' );
2432 2246
2433 2247 $this->_register_controls();
@@ -2463,11 +2277,9 @@
2463 2277 if ( null !== $target_tab ) {
2464 2278 $args = array_replace_recursive( $target_tab, $args );
2465 2279 }
2466 2280 } elseif ( empty( $args['section'] ) && ( ! $overwrite || is_wp_error( Plugin::$instance->controls_manager->get_control_from_stack( $this->get_unique_name(), $control_id ) ) ) ) {
2467 - if ( ! Performance::should_optimize_controls() ) {
2468 - wp_die( sprintf( '%s::%s: Cannot add a control outside of a section (use `start_controls_section`).', get_called_class(), __FUNCTION__ ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2469 - }
2281 + wp_die( sprintf( '%s::%s: Cannot add a control outside of a section (use `start_controls_section`).', get_called_class(), __FUNCTION__ ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2470 2282 }
2471 2283
2472 2284 return $args;
2473 2285 }
@@ -2493,15 +2305,15 @@
2493 2305 *
2494 2306 * Set the raw data, the ID and the parsed settings.
2495 2307 *
2496 2308 * @since 1.4.0
2497 - * @deprecated 2.9.0 Use `init()` method instead.
2309 + * @deprecated 2.9.0 use `init()` instead
2498 2310 * @access protected
2499 2311 *
2500 2312 * @param array $data Initial data.
2501 2313 */
2502 2314 protected function _init( $data ) {
2503 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '2.9.0', 'init()' );
2315 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '2.9.0', __CLASS__ . '::init()' );
2504 2316
2505 2317 $this->init( $data );
2506 2318 }
2507 2319
@@ -2572,9 +2384,9 @@
2572 2384 */
2573 2385 public function __construct( array $data = [] ) {
2574 2386 if ( $data ) {
2575 2387 // TODO: This is for backwards compatibility starting from 2.9.0
2576 - // This if statement should be removed when the method is hard-deprecated.
2388 + // This if statement should be removed when the method is hard-deprecated
2577 2389 if ( $this->has_own_method( '_init', self::class ) ) {
2578 2390 Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( '_init', '2.9.0', __CLASS__ . '::init()' );
2579 2391
2580 2392 $this->_init( $data );