← All changes
|
modules/editor-one/classes/menu-data-provider.php
+38
-22
4.2.0-beta1
→
4.2.4
View file →
| @@ -4,8 +4,9 @@ | ||
| 4 | 4 | |
| 5 | 5 | use Elementor\Core\Admin\EditorOneMenu\Interfaces\Menu_Item_Interface; |
| 6 | 6 | use Elementor\Core\Admin\EditorOneMenu\Interfaces\Menu_Item_Third_Level_Interface; |
| 7 | 7 | use Elementor\Core\Admin\EditorOneMenu\Interfaces\Menu_Item_With_Custom_Url_Interface; |
| 8 | +use Elementor\Core\Admin\EditorOneMenu\Interfaces\Menu_Item_With_Event_Id_Interface; | |
| 8 | 9 | use Elementor\Plugin; |
| 9 | 10 | use Elementor\Utils; |
| 10 | 11 | |
| 11 | 12 | if ( ! defined( 'ABSPATH' ) ) { |
| @@ -288,37 +289,24 @@ | ||
| 288 | 289 | } ) ); |
| 289 | 290 | } |
| 290 | 291 | |
| 291 | 292 | private function build_level3_flyout_items(): array { |
| 292 | - return $this->build_flyout_items( false ); | |
| 293 | + return $this->build_flyout_items( false, Menu_Config::get_excluded_level3_slugs() ); | |
| 293 | 294 | } |
| 294 | 295 | |
| 295 | 296 | private function build_flyout_items_with_expanded_third_party(): array { |
| 296 | - $items = $this->build_flyout_items( true ); | |
| 297 | - | |
| 298 | - if ( ! Utils::has_pro() ) { | |
| 299 | - $items[] = $this->build_theme_builder_flyout_item(); | |
| 300 | - } | |
| 301 | - | |
| 302 | - return $items; | |
| 297 | + return $this->build_flyout_items( | |
| 298 | + true, | |
| 299 | + array_merge( | |
| 300 | + Menu_Config::get_excluded_level3_slugs(), | |
| 301 | + Menu_Config::get_excluded_flyout_menu_level3_slugs() | |
| 302 | + ) | |
| 303 | + ); | |
| 303 | 304 | } |
| 304 | 305 | |
| 305 | - private function build_theme_builder_flyout_item(): array { | |
| 306 | - return [ | |
| 307 | - 'slug' => 'elementor-theme-builder', | |
| 308 | - 'label' => esc_html__( 'Theme Builder', 'elementor' ), | |
| 309 | - 'url' => $this->get_theme_builder_url(), | |
| 310 | - 'icon' => 'theme-builder', | |
| 311 | - 'group_id' => '', | |
| 312 | - 'priority' => 50, | |
| 313 | - 'has_divider_before' => false, | |
| 314 | - ]; | |
| 315 | - } | |
| 316 | - | |
| 317 | - private function build_flyout_items( bool $expand_third_party ): array { | |
| 306 | + private function build_flyout_items( bool $expand_third_party, array $excluded_slugs ): array { | |
| 318 | 307 | $items = []; |
| 319 | 308 | $existing_slugs = []; |
| 320 | - $excluded_slugs = Menu_Config::get_excluded_level3_slugs(); | |
| 321 | 309 | $excluded_level4_slugs = $expand_third_party ? Menu_Config::get_excluded_level4_slugs() : []; |
| 322 | 310 | |
| 323 | 311 | foreach ( $this->level3_items as $group_items ) { |
| 324 | 312 | foreach ( $group_items as $item_slug => $item ) { |
| @@ -382,8 +370,9 @@ | ||
| 382 | 370 | 'url' => $url, |
| 383 | 371 | 'group_id' => '', |
| 384 | 372 | 'priority' => $this->get_item_priority( $item ), |
| 385 | 373 | 'has_divider_before' => $is_first, |
| 374 | + 'event_id' => $this->resolve_event_id( $item, $item_slug ), | |
| 386 | 375 | ]; |
| 387 | 376 | } |
| 388 | 377 | |
| 389 | 378 | private function should_include_flyout_item( Menu_Item_Interface $item, string $item_slug, array $existing_slugs, array $excluded_slugs ): bool { |
| @@ -418,8 +407,9 @@ | ||
| 418 | 407 | 'icon' => $item->get_icon(), |
| 419 | 408 | 'group_id' => $group_id, |
| 420 | 409 | 'priority' => $this->get_item_priority( $item ), |
| 421 | 410 | 'has_divider_before' => $is_third_party_parent, |
| 411 | + 'event_id' => $this->resolve_event_id( $item, $item_slug ), | |
| 422 | 412 | ]; |
| 423 | 413 | } |
| 424 | 414 | |
| 425 | 415 | private function resolve_flyout_item_url( Menu_Item_Interface $item, string $item_slug ): string { |
| @@ -493,8 +483,9 @@ | ||
| 493 | 483 | 'slug' => $item_slug, |
| 494 | 484 | 'label' => $this->title_case( $item->get_label() ), |
| 495 | 485 | 'url' => $url, |
| 496 | 486 | 'priority' => $this->get_item_priority( $item ), |
| 487 | + 'event_id' => $this->resolve_event_id( $item, $item_slug ), | |
| 497 | 488 | ]; |
| 498 | 489 | |
| 499 | 490 | $existing_labels[] = $label_lower; |
| 500 | 491 | } |
| @@ -550,8 +541,33 @@ | ||
| 550 | 541 | private function sort_items_by_priority( array &$items ): void { |
| 551 | 542 | usort( $items, function ( array $a, array $b ): int { |
| 552 | 543 | return ( $a['priority'] ?? 100 ) <=> ( $b['priority'] ?? 100 ); |
| 553 | 544 | } ); |
| 545 | + } | |
| 546 | + | |
| 547 | + private function resolve_event_id( Menu_Item_Interface $item, string $item_slug ): string { | |
| 548 | + if ( $item instanceof Menu_Item_With_Event_Id_Interface ) { | |
| 549 | + return $item->get_event_id(); | |
| 550 | + } | |
| 551 | + | |
| 552 | + return $this->derive_event_id_from_slug( $item_slug ); | |
| 553 | + } | |
| 554 | + | |
| 555 | + private function derive_event_id_from_slug( string $slug ): string { | |
| 556 | + $slug_event_map = [ | |
| 557 | + 'edit.php?post_type=elementor_library' => 'saved_templates', | |
| 558 | + 'elementor-app' => 'theme_builder', | |
| 559 | + ]; | |
| 560 | + | |
| 561 | + if ( isset( $slug_event_map[ $slug ] ) ) { | |
| 562 | + return $slug_event_map[ $slug ]; | |
| 563 | + } | |
| 564 | + | |
| 565 | + $event_id = preg_replace( '/^elementor-/', '', $slug ); | |
| 566 | + $event_id = preg_replace( '/[?#].*$/', '', $event_id ); | |
| 567 | + $event_id = str_replace( [ '-', ' ' ], '_', $event_id ); | |
| 568 | + | |
| 569 | + return strtolower( $event_id ); | |
| 554 | 570 | } |
| 555 | 571 | |
| 556 | 572 | private function title_case( string $text ): string { |
| 557 | 573 | if ( function_exists( 'mb_convert_case' ) ) { |