PluginProbe
Elementor Website Builder – more than just a page builder / 3.35.8
Elementor Website Builder – more than just a page builder v3.35.8
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
elementor / modules / editor-one / classes / legacy-submenu-interceptor.php

legacy-submenu-interceptor.php in Elementor Website Builder – more than just a page builder 3.35.8, at modules/editor-one/classes/legacy-submenu-interceptor.php

176 lines 4.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Modules\EditorOne\Classes;
4
5 use Elementor\Core\Admin\EditorOneMenu\Menu\Legacy_Submenu_Item;
6 use Elementor\Core\Admin\EditorOneMenu\Menu\Legacy_Submenu_Item_Not_Mapped;
7 use Elementor\Core\Admin\EditorOneMenu\Menu\Third_Party_Pages_Menu;
8
9 if ( ! defined( 'ABSPATH' ) ) {
10 exit;
11 }
12
13 class Legacy_Submenu_Interceptor {
14
15 private Menu_Data_Provider $menu_data_provider;
16
17 private Slug_Normalizer $slug_normalizer;
18
19 private bool $third_party_parent_menu_registered = false;
20
21 public function __construct( Menu_Data_Provider $menu_data_provider, Slug_Normalizer $slug_normalizer ) {
22 $this->menu_data_provider = $menu_data_provider;
23 $this->slug_normalizer = $slug_normalizer;
24 }
25
26 public function intercept_all( bool $is_pro_module_enabled ): void {
27 global $submenu;
28
29 $this->intercept_elementor_menu_items(
30 $submenu[ Menu_Config::ELEMENTOR_MENU_SLUG ] ?? [],
31 $is_pro_module_enabled
32 );
33
34 if ( $is_pro_module_enabled ) {
35 return;
36 }
37
38 $this->intercept_templates_menu_items(
39 $submenu[ Menu_Config::LEGACY_TEMPLATES_SLUG ] ?? []
40 );
41 }
42
43 public function intercept_elementor_menu_items( array $submenu_items, bool $is_pro_module_enabled ): array {
44 if ( empty( $submenu_items ) ) {
45 return $submenu_items;
46 }
47
48 $legacy_pro_mapping = Menu_Config::get_legacy_pro_mapping();
49 $items_to_remove = [];
50
51 foreach ( $submenu_items as $index => $submenu_item ) {
52 $item_slug = $submenu_item[2] ?? '';
53
54 if ( empty( $item_slug ) ) {
55 continue;
56 }
57
58 if ( $this->menu_data_provider->is_item_already_registered( $item_slug ) ) {
59 continue;
60 }
61
62 $mapping_key = $this->find_mapping_key( $item_slug, $legacy_pro_mapping );
63
64 if ( null !== $mapping_key ) {
65 if ( ! $is_pro_module_enabled ) {
66 $this->register_mapped_item( $submenu_item, $mapping_key, $legacy_pro_mapping );
67 }
68 } else {
69 $this->register_unmapped_item( $submenu_item );
70 }
71
72 $items_to_remove[] = $index;
73 }
74
75 foreach ( $items_to_remove as $index ) {
76 unset( $submenu_items[ $index ] );
77 }
78
79 return $submenu_items;
80 }
81
82 public function intercept_templates_menu_items( array $submenu_items ): array {
83 if ( empty( $submenu_items ) ) {
84 return $submenu_items;
85 }
86
87 $items_to_remove = [];
88
89 foreach ( $submenu_items as $index => $submenu_item ) {
90 $item_slug = $submenu_item[2] ?? '';
91
92 if ( empty( $item_slug ) ) {
93 continue;
94 }
95
96 if ( $this->menu_data_provider->is_item_already_registered( $item_slug ) ) {
97 $items_to_remove[] = $index;
98 continue;
99 }
100
101 $submenu_item[4] = Menu_Config::TEMPLATES_GROUP_ID;
102 $legacy_item = new Legacy_Submenu_Item( $submenu_item, Menu_Config::LEGACY_TEMPLATES_SLUG );
103
104 $this->menu_data_provider->register_menu( $legacy_item );
105
106 $items_to_remove[] = $index;
107 }
108
109 foreach ( $items_to_remove as $index ) {
110 unset( $submenu_items[ $index ] );
111 }
112
113 return $submenu_items;
114 }
115
116 public function find_mapping_key( string $item_slug, array $mapping ): ?string {
117 if ( isset( $mapping[ $item_slug ] ) ) {
118 return $item_slug;
119 }
120
121 $decoded_slug = html_entity_decode( $item_slug );
122
123 if ( isset( $mapping[ $decoded_slug ] ) ) {
124 return $decoded_slug;
125 }
126
127 $normalized_slug = $this->slug_normalizer->normalize( $item_slug );
128
129 foreach ( $mapping as $key => $value ) {
130 $normalized_key = $this->slug_normalizer->normalize( $key );
131
132 if ( $normalized_slug === $normalized_key ) {
133 return $key;
134 }
135 }
136
137 return null;
138 }
139
140 private function register_mapped_item( array $submenu_item, string $mapping_key, array $legacy_pro_mapping ): void {
141 $item_slug = $submenu_item[2];
142
143 if ( isset( $legacy_pro_mapping[ $mapping_key ]['label'] ) ) {
144 $submenu_item[0] = $legacy_pro_mapping[ $mapping_key ]['label'];
145 }
146
147 $position = Menu_Config::get_attribute_mapping()[ $item_slug ]['position'] ?? 100;
148 $group_id = $legacy_pro_mapping[ $mapping_key ]['group'];
149 $submenu_item[4] = $group_id;
150
151 $legacy_item = new Legacy_Submenu_Item( $submenu_item, Menu_Config::ELEMENTOR_MENU_SLUG, $position );
152
153 $this->menu_data_provider->register_menu( $legacy_item );
154 }
155
156 private function register_unmapped_item( array $submenu_item ): void {
157 $this->ensure_third_party_parent_registered();
158
159 $item_slug = $submenu_item[2];
160 $position = Menu_Config::get_attribute_mapping()[ $item_slug ]['position'] ?? 100;
161
162 $legacy_item = new Legacy_Submenu_Item_Not_Mapped( $submenu_item, Menu_Config::ELEMENTOR_MENU_SLUG, $position );
163
164 $this->menu_data_provider->register_menu( $legacy_item );
165 }
166
167 private function ensure_third_party_parent_registered(): void {
168 if ( $this->third_party_parent_menu_registered ) {
169 return;
170 }
171
172 $this->menu_data_provider->register_menu( new Third_Party_Pages_Menu() );
173 $this->third_party_parent_menu_registered = true;
174 }
175 }
176