PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.0-beta3
Elementor Website Builder – more than just a page builder v4.3.0-beta3
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
elementor / core / admin / editor-one-menu / elementor-one-menu-manager.php

elementor-one-menu-manager.php in Elementor Website Builder – more than just a page builder 4.3.0-beta3, at core/admin/editor-one-menu/elementor-one-menu-manager.php

365 lines 10.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Core\Admin\EditorOneMenu;
4
5 use Elementor\Core\Admin\EditorOneMenu\Menu\Editor_One_Custom_Elements_Menu;
6 use Elementor\Core\Admin\EditorOneMenu\Interfaces\Menu_Item_Interface;
7 use Elementor\Modules\EditorOne\Classes\Legacy_Submenu_Interceptor;
8 use Elementor\Modules\EditorOne\Classes\Menu_Config;
9 use Elementor\Modules\EditorOne\Classes\Menu_Data_Provider;
10 use Elementor\Modules\EditorOne\Classes\Slug_Normalizer;
11 use Elementor\Plugin;
12 use Elementor\Utils;
13
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit;
16 }
17
18 class Elementor_One_Menu_Manager {
19
20 private Menu_Data_Provider $menu_data_provider;
21
22 private bool $is_pro_module_enabled = false;
23
24 private Legacy_Submenu_Interceptor $legacy_submenu_interceptor;
25
26 public function __construct() {
27 $this->menu_data_provider = Menu_Data_Provider::instance();
28 $this->legacy_submenu_interceptor = new Legacy_Submenu_Interceptor(
29 $this->menu_data_provider,
30 new Slug_Normalizer()
31 );
32 $this->register_actions();
33 }
34
35 private function register_actions(): void {
36 add_action( 'init', [ $this, 'check_if_pro_module_is_enabled' ] );
37 add_action( 'admin_menu', [ $this, 'register_elementor_home_submenus' ], 9 );
38
39 add_action( 'admin_menu', function () {
40 do_action( 'elementor/editor-one/menu/register', $this->menu_data_provider );
41 } );
42
43 add_action( 'admin_menu', [ $this, 'register_pro_submenus' ], 100 );
44
45 add_action( 'admin_menu', [ $this, 'intercept_legacy_submenus' ], 10003 );
46 add_action( 'admin_menu', [ $this, 'register_flyout_items_as_hidden_submenus' ], 10004 );
47 add_action( 'admin_menu', [ $this, 'remove_all_submenus_for_edit_posts_users' ], 10005 );
48 add_action( 'admin_menu', [ $this, 'override_elementor_page_for_edit_posts_users' ], 1006 );
49 add_filter( 'add_menu_classes', [ $this, 'fix_theme_builder_submenu_url' ] );
50 add_action( 'admin_head', [ $this, 'hide_flyout_items_from_wp_menu' ] );
51 add_action( 'admin_head', [ $this, 'hide_legacy_templates_menu' ] );
52 add_action( 'admin_head', [ $this, 'hide_old_elementor_menu' ] );
53 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_menu_assets' ] );
54 add_action( 'admin_print_scripts-toplevel_page_elementor', [ $this, 'enqueue_home_screen_on_editor_page' ] );
55 }
56
57 public function check_if_pro_module_is_enabled(): void {
58 $this->is_pro_module_enabled = apply_filters( 'elementor/modules/editor-one/is_pro_module_enabled', false );
59
60 if ( ! $this->is_pro_module_enabled && Utils::has_pro() ) {
61 $this->menu_data_provider->register_menu( new Editor_One_Custom_Elements_Menu() );
62 }
63 }
64
65 public function register_elementor_home_submenus(): void {
66 add_submenu_page(
67 Menu_Config::ELEMENTOR_HOME_MENU_SLUG,
68 esc_html__( 'Editor', 'elementor' ),
69 esc_html__( 'Editor', 'elementor' ),
70 Menu_Config::CAPABILITY_EDIT_POSTS,
71 Menu_Config::ELEMENTOR_MENU_SLUG,
72 [ $this, 'render_editor_page' ],
73 20
74 );
75
76 do_action( 'elementor/editor-one/menu/register_submenus' );
77 }
78
79 /**
80 * TODO: This can be removed in v4.1.0 [ED-22806]
81 */
82 public function register_pro_submenus(): void {
83 if ( $this->is_pro_module_enabled ) {
84 return;
85 }
86
87 $has_active_pro = Utils::has_pro() &&
88 class_exists( '\ElementorPro\License\API' ) &&
89 \ElementorPro\License\API::is_license_active();
90
91 $is_free = ! Utils::has_pro();
92
93 if ( ! $is_free && ! $has_active_pro ) {
94 return;
95 }
96
97 add_submenu_page(
98 Menu_Config::ELEMENTOR_HOME_MENU_SLUG,
99 esc_html__( 'Theme Builder', 'elementor' ),
100 esc_html__( 'Theme Builder', 'elementor' ),
101 Menu_Config::CAPABILITY_EDIT_POSTS,
102 'elementor-theme-builder',
103 '',
104 70
105 );
106
107 if ( $has_active_pro ) {
108 add_submenu_page(
109 Menu_Config::ELEMENTOR_HOME_MENU_SLUG,
110 esc_html__( 'Submissions', 'elementor' ),
111 esc_html__( 'Submissions', 'elementor' ),
112 'edit_posts',
113 'e-form-submissions',
114 '',
115 80
116 );
117 }
118 }
119
120 public function remove_all_submenus_for_edit_posts_users(): void {
121 $user_capabilities = Menu_Data_Provider::get_current_user_capabilities();
122
123 if ( ! $user_capabilities['is_edit_posts_user'] ) {
124 return;
125 }
126
127 global $submenu;
128
129 if ( empty( $submenu[ Menu_Config::ELEMENTOR_MENU_SLUG ] ) ) {
130 return;
131 }
132
133 $submenu_items = $submenu[ Menu_Config::ELEMENTOR_MENU_SLUG ];
134
135 foreach ( $submenu_items as $index => $submenu_item ) {
136 if ( 0 === $index ) {
137 continue;
138 }
139
140 $submenu_slug = $submenu_item[2] ?? '';
141 if ( ! empty( $submenu_slug ) ) {
142 remove_submenu_page( Menu_Config::ELEMENTOR_MENU_SLUG, $submenu_slug );
143 }
144 }
145 }
146
147 public function render_editor_page(): void {
148 Plugin::instance()->settings->display_home_screen();
149 }
150
151 public function override_elementor_page_for_edit_posts_users(): void {
152 $user_capabilities = Menu_Data_Provider::get_current_user_capabilities();
153
154 if ( ! $user_capabilities['is_edit_posts_user'] ) {
155 return;
156 }
157
158 $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ?? '';
159 if ( Menu_Config::ELEMENTOR_MENU_SLUG !== $page ) {
160 return;
161 }
162
163 $templates_url = admin_url( 'edit.php?post_type=elementor_library&tabs_group=library' );
164 wp_safe_redirect( $templates_url );
165 exit;
166 }
167
168 public function enqueue_home_screen_on_editor_page(): void {
169 $home_module = Plugin::instance()->modules_manager->get_modules( 'home' );
170
171 if ( $home_module && method_exists( $home_module, 'enqueue_home_screen_scripts' ) ) {
172 $home_module->enqueue_home_screen_scripts();
173 }
174 }
175
176 public function fix_theme_builder_submenu_url( $menu ) {
177 global $submenu;
178
179 $menu_slugs = [ Menu_Config::ELEMENTOR_HOME_MENU_SLUG ];
180
181 foreach ( $menu_slugs as $menu_slug ) {
182 if ( empty( $submenu[ $menu_slug ] ) ) {
183 continue;
184 }
185
186 foreach ( $submenu[ $menu_slug ] as &$item ) {
187 if ( 'elementor-theme-builder' === $item[2] ) {
188 $item[2] = $this->get_theme_builder_url(); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
189 break;
190 }
191 }
192 }
193
194 return $menu;
195 }
196
197 private function get_theme_builder_url(): string {
198 return $this->menu_data_provider->get_theme_builder_url();
199 }
200
201 public function hide_legacy_templates_menu(): void {
202 ?>
203 <style type="text/css">
204 #menu-posts-elementor_library {
205 display: none !important;
206 }
207 </style>
208 <?php
209 }
210
211 public function hide_old_elementor_menu(): void {
212 $this->remove_elementor_separator();
213 ?>
214 <style type="text/css">
215 #toplevel_page_elementor {
216 display: none !important;
217 }
218 </style>
219 <?php
220 }
221
222 private function remove_elementor_separator(): void {
223 global $menu;
224
225 foreach ( $menu as $key => $item ) {
226 if ( isset( $item[2] ) && 'separator-elementor' === $item[2] ) {
227 unset( $menu[ $key ] );
228 break;
229 }
230 }
231 }
232
233 public function register_flyout_items_as_hidden_submenus(): void {
234 $hooks = [];
235
236 $this->iterate_all_flyout_items( function( string $item_slug, Menu_Item_Interface $item ) use ( &$hooks ) {
237 $hook = $this->register_hidden_submenu( $item_slug, $item );
238
239 if ( $hook ) {
240 $hooks[ $item_slug ] = $hook;
241 }
242 } );
243
244 do_action( 'elementor/editor-one/menu/after_register_hidden_submenus', $hooks );
245 }
246
247 private function register_hidden_submenu( string $item_slug, Menu_Item_Interface $item ) {
248 $original_parent = $this->get_original_parent_slug( $item );
249 $parent_slug = $this->resolve_hidden_submenu_parent( $original_parent );
250 $has_page = method_exists( $item, 'render' );
251 $page_title = $has_page ? $item->get_page_title() : '';
252 $callback = $has_page ? [ $item, 'render' ] : '';
253 $capability = $item->get_capability();
254 $position = $item->get_position();
255
256 return add_submenu_page(
257 $parent_slug,
258 $page_title,
259 $item->get_label(),
260 $capability,
261 $item_slug,
262 $callback,
263 $position
264 );
265 }
266
267 private function resolve_hidden_submenu_parent( ?string $parent_slug ): string {
268 $default_parent_slug = Menu_Config::ELEMENTOR_HOME_MENU_SLUG;
269 if ( empty( $parent_slug ) ) {
270 return $default_parent_slug;
271 }
272
273 $elementor_parent_slugs = [
274 Menu_Config::EDITOR_GROUP_ID => true,
275 Menu_Config::EDITOR_MENU_SLUG => true,
276 Menu_Config::TEMPLATES_GROUP_ID => true,
277 Menu_Config::LEGACY_TEMPLATES_SLUG => true,
278 Menu_Config::SETTINGS_GROUP_ID => true,
279 Menu_Config::CUSTOM_ELEMENTS_GROUP_ID => true,
280 Menu_Config::SYSTEM_GROUP_ID => true,
281 ];
282
283 if ( isset( $elementor_parent_slugs[ $parent_slug ] ) ) {
284 return $default_parent_slug;
285 }
286
287 return $parent_slug;
288 }
289
290 private function iterate_all_flyout_items( callable $callback ): void {
291 $level3_items = $this->menu_data_provider->get_level3_items();
292 $level4_items = $this->menu_data_provider->get_level4_items();
293
294 $all_items = array_merge_recursive( $level3_items, $level4_items );
295
296 foreach ( $all_items as $group_items ) {
297 foreach ( $group_items as $item_slug => $item ) {
298 $callback( $item_slug, $item );
299 }
300 }
301 }
302
303 private function get_original_parent_slug( $item ): ?string {
304 return $item->get_parent_slug();
305 }
306
307 public function hide_flyout_items_from_wp_menu(): void {
308 $protected_wp_menu_slugs = [
309 Menu_Config::EDITOR_MENU_SLUG,
310 'elementor-theme-builder',
311 'e-form-submissions',
312 'elementor-mcp',
313 'elementor-license',
314 'elementor-connect-account',
315 ];
316
317 $this->iterate_all_flyout_items( function( string $item_slug, Menu_Item_Interface $item ) use ( $protected_wp_menu_slugs ) {
318 if ( in_array( $item_slug, $protected_wp_menu_slugs, true ) ) {
319 return;
320 }
321
322 $original_parent = $this->get_original_parent_slug( $item );
323 $parent_slug = $this->resolve_hidden_submenu_parent( $original_parent );
324 remove_submenu_page( $parent_slug, $item_slug );
325 } );
326 }
327
328 public function intercept_legacy_submenus(): void {
329 $this->legacy_submenu_interceptor->intercept_all( $this->is_pro_module_enabled );
330 }
331
332 public function enqueue_admin_menu_assets(): void {
333
334 $min_suffix = Utils::is_script_debug() ? '' : '.min';
335
336 wp_enqueue_style(
337 'elementor-admin-menu',
338 ELEMENTOR_ASSETS_URL . 'css/modules/editor-one/admin-menu' . $min_suffix . '.css',
339 [],
340 ELEMENTOR_VERSION
341 );
342
343 $config = [
344 'editorFlyout' => $this->menu_data_provider->get_third_level_data(
345 Menu_Data_Provider::THIRD_LEVEL_FLYOUT_MENU
346 ),
347 ];
348
349 wp_enqueue_script(
350 'editor-one-menu',
351 ELEMENTOR_ASSETS_URL . 'js/editor-one-menu' . $min_suffix . '.js',
352 [],
353 ELEMENTOR_VERSION,
354 true
355 );
356
357 wp_localize_script(
358 'editor-one-menu',
359 'editorOneMenuConfig',
360 $config
361 );
362 }
363 }
364
365