PluginProbe
Elementor Website Builder – more than just a page builder / 3.8.1
Elementor Website Builder – more than just a page builder v3.8.1
4.3.1 4.3.0 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 All 454 releases
← All changes | core/admin/admin.php +98 -507 4.3.03.8.1 View file →
@@ -2,20 +2,17 @@
2 2 namespace Elementor\Core\Admin;
3 3
4 4 use Elementor\Api;
5 5 use Elementor\Beta_Testers;
6 +use Elementor\Core\Admin\Menu\Main as MainMenu;
6 7 use Elementor\App\Modules\Onboarding\Module as Onboarding_Module;
7 8 use Elementor\Core\Base\App;
8 9 use Elementor\Core\Upgrade\Manager as Upgrade_Manager;
9 -use Elementor\Core\Utils\Assets_Config_Provider;
10 10 use Elementor\Core\Utils\Collection;
11 -use Elementor\Modules\FloatingButtons\Module as Floating_Buttons_Module;
12 11 use Elementor\Plugin;
13 12 use Elementor\Settings;
14 13 use Elementor\User;
15 14 use Elementor\Utils;
16 -use Elementor\Core\Utils\Hints;
17 -use Elementor\Core\DocumentTypes\Page;
18 15
19 16 if ( ! defined( 'ABSPATH' ) ) {
20 17 exit; // Exit if accessed directly.
21 18 }
@@ -38,36 +35,8 @@
38 35 return 'admin';
39 36 }
40 37
41 38 /**
42 - * Check if current page is an Elementor admin page.
43 - *
44 - * @param \WP_Screen|null $current_screen Optional. Screen object to check. Defaults to current screen.
45 - *
46 - * @return bool Whether current page is an Elementor admin page.
47 - */
48 - public static function is_elementor_admin_page( $current_screen = null ) {
49 - if ( ! $current_screen ) {
50 - $current_screen = get_current_screen();
51 - }
52 -
53 - if ( ! $current_screen ) {
54 - return false;
55 - }
56 -
57 - $screen_id = $current_screen->id ?? '';
58 - $post_type = $current_screen->post_type ?? '';
59 -
60 - $is_elementor_screen = strpos( $screen_id, 'elementor' ) !== false
61 - || strpos( $screen_id, Floating_Buttons_Module::CPT_FLOATING_BUTTONS ) !== false;
62 -
63 - $is_elementor_post_type = strpos( $post_type, 'elementor' ) !== false
64 - || strpos( $post_type, Floating_Buttons_Module::CPT_FLOATING_BUTTONS ) !== false;
65 -
66 - return $is_elementor_screen || $is_elementor_post_type;
67 - }
68 -
69 - /**
70 39 * @since 2.2.0
71 40 * @access public
72 41 */
73 42 public function maybe_redirect_to_getting_started() {
@@ -105,33 +74,8 @@
105 74
106 75 exit;
107 76 }
108 77
109 - private function register_packages() {
110 - $assets_config_provider = ( new Assets_Config_Provider() )
111 - ->set_path_resolver( function ( $name ) {
112 - return ELEMENTOR_ASSETS_PATH . "js/packages/{$name}/{$name}.asset.php";
113 - } );
114 -
115 - Collection::make( [ 'ui', 'icons', 'query' ] )
116 - ->each( function( $package ) use ( $assets_config_provider ) {
117 - $suffix = Utils::is_script_debug() ? '' : '.min';
118 - $config = $assets_config_provider->load( $package )->get( $package );
119 -
120 - if ( ! $config ) {
121 - return;
122 - }
123 -
124 - wp_register_script(
125 - $config['handle'],
126 - ELEMENTOR_ASSETS_URL . "js/packages/{$package}/{$package}{$suffix}.js",
127 - $config['deps'],
128 - ELEMENTOR_VERSION,
129 - true
130 - );
131 - } );
132 - }
133 -
134 78 /**
135 79 * Enqueue admin scripts.
136 80 *
137 81 * Registers all the admin scripts and enqueues them.
@@ -149,24 +93,9 @@
149 93 ELEMENTOR_VERSION,
150 94 true
151 95 );
152 96
153 - $this->register_packages();
154 -
155 - // Temporary solution for the admin.
156 97 wp_register_script(
157 - 'elementor-ai-admin',
158 - $this->get_js_assets_url( 'ai-admin' ),
159 - [
160 - 'elementor-common',
161 - 'elementor-v2-ui',
162 - 'elementor-v2-icons',
163 - ],
164 - ELEMENTOR_VERSION,
165 - true
166 - );
167 -
168 - wp_register_script(
169 98 'elementor-admin',
170 99 $this->get_js_assets_url( 'admin' ),
171 100 [
172 101 'elementor-common',
@@ -177,12 +106,8 @@
177 106 );
178 107
179 108 wp_enqueue_script( 'elementor-admin' );
180 109
181 - wp_set_script_translations( 'elementor-admin', 'elementor' );
182 -
183 - $this->maybe_enqueue_hints();
184 -
185 110 $this->print_config();
186 111 }
187 112
188 113 /**
@@ -195,11 +120,13 @@
195 120 * @since 1.0.0
196 121 * @access public
197 122 */
198 123 public function enqueue_styles() {
124 + $direction_suffix = is_rtl() ? '-rtl' : '';
125 +
199 126 wp_register_style(
200 127 'elementor-admin',
201 - $this->get_css_assets_url( 'admin' ),
128 + $this->get_css_assets_url( 'admin' . $direction_suffix ),
202 129 [
203 130 'elementor-common',
204 131 ],
205 132 ELEMENTOR_VERSION
@@ -242,10 +169,10 @@
242 169 <div id="elementor-switch-mode">
243 170 <input id="elementor-switch-mode-input" type="hidden" name="_elementor_post_mode" value="<?php echo esc_attr( $document->is_built_with_elementor() ); ?>" />
244 171 <button id="elementor-switch-mode-button" type="button" class="button button-primary button-hero">
245 172 <span class="elementor-switch-mode-on">
246 - <i class="eicon-wordpress" aria-hidden="true"></i>
247 - <?php echo esc_html__( 'Edit with WordPress', 'elementor' ); ?>
173 + <i class="eicon-arrow-<?php echo ( is_rtl() ) ? 'right' : 'left'; ?>" aria-hidden="true"></i>
174 + <?php echo esc_html__( 'Back to WordPress Editor', 'elementor' ); ?>
248 175 </span>
249 176 <span class="elementor-switch-mode-off">
250 177 <i class="eicon-elementor-square" aria-hidden="true"></i>
251 178 <?php echo esc_html__( 'Edit with Elementor', 'elementor' ); ?>
@@ -286,9 +213,9 @@
286 213 *
287 214 * @param int $post_id Post ID.
288 215 */
289 216 public function save_post( $post_id ) {
290 - if ( ! wp_verify_nonce( Utils::get_super_global_value( $_POST, '_elementor_edit_mode_nonce' ), basename( __FILE__ ) ) ) {
217 + if ( ! isset( $_POST['_elementor_edit_mode_nonce'] ) || ! wp_verify_nonce( $_POST['_elementor_edit_mode_nonce'], basename( __FILE__ ) ) ) {
291 218 return;
292 219 }
293 220
294 221 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
@@ -371,15 +298,10 @@
371 298 $settings_link = sprintf( '<a href="%1$s">%2$s</a>', admin_url( 'admin.php?page=' . Settings::PAGE_ID ), esc_html__( 'Settings', 'elementor' ) );
372 299
373 300 array_unshift( $links, $settings_link );
374 301
375 - $go_pro_text = esc_html__( 'Get Elementor Pro', 'elementor' );
376 - if ( Utils::is_sale_time() ) {
377 - $go_pro_text = esc_html__( 'Sale! Upgrade Now', 'elementor' );
378 - }
302 + $links['go_pro'] = sprintf( '<a href="%1$s" target="_blank" class="elementor-plugins-gopro">%2$s</a>', 'https://go.elementor.com/go-pro-wp-plugins/', esc_html__( 'Go Pro', 'elementor' ) );
379 303
380 - $links['go_pro'] = sprintf( '<a href="%1$s" target="_blank" class="elementor-plugins-gopro">%2$s</a>', 'https://go.elementor.com/go-pro-wp-plugins/', $go_pro_text );
381 -
382 304 return $links;
383 305 }
384 306
385 307 /**
@@ -401,10 +323,10 @@
401 323 */
402 324 public function plugin_row_meta( $plugin_meta, $plugin_file ) {
403 325 if ( ELEMENTOR_PLUGIN_BASE === $plugin_file ) {
404 326 $row_meta = [
405 - 'docs' => '<a href="https://go.elementor.com/docs-admin-plugins/" aria-label="' . esc_attr__( 'View Elementor Documentation', 'elementor' ) . '" target="_blank">' . esc_html__( 'Docs & FAQs', 'elementor' ) . '</a>',
406 - 'ideo' => '<a href="https://go.elementor.com/yt-admin-plugins/" aria-label="' . esc_attr__( 'View Elementor Video Tutorials', 'elementor' ) . '" target="_blank">' . esc_html__( 'Video Tutorials', 'elementor' ) . '</a>',
327 + 'docs' => '<a href="https://go.elementor.com/docs-admin-plugins/" aria-label="' . esc_attr( esc_html__( 'View Elementor Documentation', 'elementor' ) ) . '" target="_blank">' . esc_html__( 'Docs & FAQs', 'elementor' ) . '</a>',
328 + 'ideo' => '<a href="https://go.elementor.com/yt-admin-plugins/" aria-label="' . esc_attr( esc_html__( 'View Elementor Video Tutorials', 'elementor' ) ) . '" target="_blank">' . esc_html__( 'Video Tutorials', 'elementor' ) . '</a>',
407 329 ];
408 330
409 331 $plugin_meta = array_merge( $plugin_meta, $row_meta );
410 332 }
@@ -427,13 +349,8 @@
427 349 * @return string The content that will be printed.
428 350 */
429 351 public function admin_footer_text( $footer_text ) {
430 352 $current_screen = get_current_screen();
431 -
432 - if ( $current_screen && str_ends_with( $current_screen->id, 'elementor-mcp' ) ) {
433 - return $footer_text;
434 - }
435 -
436 353 $is_elementor_screen = ( $current_screen && false !== strpos( $current_screen->id, 'elementor' ) );
437 354
438 355 if ( $is_elementor_screen ) {
439 356 $footer_text = sprintf(
@@ -471,8 +388,10 @@
471 388 $wp_meta_boxes['dashboard']['normal']['core'] = array_merge( $ours, $dashboard ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
472 389 }
473 390
474 391 /**
392 + * Elementor dashboard widget.
393 + *
475 394 * Displays the Elementor dashboard widget.
476 395 *
477 396 * Fired by `wp_add_dashboard_widget` function.
478 397 *
@@ -479,31 +398,11 @@
479 398 * @since 1.9.0
480 399 * @access public
481 400 */
482 401 public function elementor_dashboard_overview_widget() {
483 - ?>
484 - <div class="e-dashboard-overview e-dashboard-widget">
485 - <?php
486 - self::elementor_dashboard_overview_header();
487 - self::elementor_dashboard_overview_recently_edited();
488 - self::elementor_dashboard_overview_news_updates();
489 - self::elementor_dashboard_overview_footer();
490 - ?>
491 - </div>
492 - <?php
493 - }
402 + $elementor_feed = Api::get_feed_data();
403 + $recently_edited_query = Utils::get_recently_edited_posts_query();
494 404
495 - /**
496 - * Displays the Elementor dashboard widget - header section.
497 - * Fired by `elementor_dashboard_overview_widget` function.
498 - *
499 - * @param bool $show_versions
500 - * @param bool $is_create_post_enabled
501 - *
502 - * @return void
503 - * @since 3.12.0
504 - */
505 - public static function elementor_dashboard_overview_header( bool $show_versions = true, bool $is_create_post_enabled = true ) {
506 405 if ( User::is_current_user_can_edit_post_type( 'page' ) ) {
507 406 $create_new_label = esc_html__( 'Create New Page', 'elementor' );
508 407 $create_new_post_type = 'page';
509 408 } elseif ( User::is_current_user_can_edit_post_type( 'post' ) ) {
@@ -510,18 +409,17 @@
510 409 $create_new_label = esc_html__( 'Create New Post', 'elementor' );
511 410 $create_new_post_type = 'post';
512 411 }
513 412 ?>
514 - <div class="e-overview__header">
515 - <?php if ( $show_versions ) { ?>
516 - <div class="e-overview__logo">
517 - <div class="e-logo-wrapper"><i class="eicon-elementor-circle"></i></div>
518 - </div>
413 + <div class="e-dashboard-widget">
414 + <div class="e-overview__header">
415 + <div class="e-overview__logo"><div class="e-logo-wrapper"><i class="eicon-elementor"></i></div></div>
519 416 <div class="e-overview__versions">
520 417 <span class="e-overview__version"><?php echo esc_html__( 'Elementor', 'elementor' ); ?> v<?php echo ELEMENTOR_VERSION; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></span>
521 418 <?php
522 419 /**
523 420 * Elementor dashboard widget after the version.
421 + *
524 422 * Fires after Elementor version display in the dashboard widget.
525 423 *
526 424 * @since 1.9.0
527 425 */
@@ -527,112 +425,57 @@
527 425 */
528 426 do_action( 'elementor/admin/dashboard_overview_widget/after_version' );
529 427 ?>
530 428 </div>
531 - <?php } ?>
532 - <?php if ( ! empty( $create_new_post_type ) && $is_create_post_enabled ) { ?>
533 - <div class="e-overview__create">
534 - <a href="<?php echo esc_url( Plugin::$instance->documents->get_create_new_post_url( $create_new_post_type ) ); ?>" class="button"><span aria-hidden="true" class="dashicons dashicons-plus"></span> <?php echo esc_html( $create_new_label ); ?></a>
535 - </div>
536 - <?php } ?>
537 - </div>
538 - <?php
539 - }
540 -
541 - /**
542 - * Displays the Elementor dashboard widget - recently edited section.
543 - * Fired by `elementor_dashboard_overview_widget` function.
544 - *
545 - * @param array $args
546 - * @param bool $show_heading
547 - *
548 - * @return void
549 - * @since 3.12.0
550 - */
551 - public static function elementor_dashboard_overview_recently_edited( array $args = [], bool $show_heading = true ) {
552 - $recently_edited_query = Utils::get_recently_edited_posts_query( $args );
553 -
554 - if ( $recently_edited_query->have_posts() ) { ?>
555 - <div class="e-overview__recently-edited">
556 - <?php if ( $show_heading ) { ?>
429 + <?php if ( ! empty( $create_new_post_type ) ) : ?>
430 + <div class="e-overview__create">
431 + <a href="<?php echo esc_url( Plugin::$instance->documents->get_create_new_post_url( $create_new_post_type ) ); ?>" class="button"><span aria-hidden="true" class="dashicons dashicons-plus"></span> <?php echo esc_html( $create_new_label ); ?></a>
432 + </div>
433 + <?php endif; ?>
434 + </div>
435 + <?php if ( $recently_edited_query->have_posts() ) : ?>
436 + <div class="e-overview__recently-edited">
557 437 <h3 class="e-heading e-divider_bottom"><?php echo esc_html__( 'Recently Edited', 'elementor' ); ?></h3>
558 - <?php } ?>
559 - <ul class="e-overview__posts">
560 - <?php
561 - while ( $recently_edited_query->have_posts() ) {
562 - $recently_edited_query->the_post();
563 - $document = Plugin::$instance->documents->get( get_the_ID() );
438 + <ul class="e-overview__posts">
439 + <?php
440 + while ( $recently_edited_query->have_posts() ) :
441 + $recently_edited_query->the_post();
442 + $document = Plugin::$instance->documents->get( get_the_ID() );
564 443
565 - $date = date_i18n( _x( 'M jS', 'Dashboard Overview Widget Recently Date', 'elementor' ), get_the_modified_time( 'U' ) );
566 - ?>
567 - <li class="e-overview__post">
568 - <a href="<?php echo esc_url( $document->get_edit_url() ); ?>" class="e-overview__post-link"><?php echo esc_html( get_the_title() ); ?>
569 - <span class="dashicons dashicons-edit"></span></a>
570 - <span><?php echo $date; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>, <?php the_modified_time(); ?></span>
571 - </li>
572 - <?php } ?>
573 - </ul>
574 - </div>
575 - <?php }
576 - }
577 -
578 - /**
579 - * Displays the Elementor dashboard widget - news and updates section.
580 - * Fired by `elementor_dashboard_overview_widget` function.
581 - *
582 - * @param int $limit_feed
583 - * @param bool $show_heading
584 - *
585 - * @return void
586 - * @since 3.12.0
587 - * @access public
588 - */
589 - public static function elementor_dashboard_overview_news_updates( int $limit_feed = 0, bool $show_heading = true ) {
590 - $elementor_feed = Api::get_feed_data();
591 - if ( $limit_feed > 0 ) {
592 - $elementor_feed = array_slice( $elementor_feed, 0, $limit_feed );
593 - }
594 -
595 - if ( ! empty( $elementor_feed ) ) { ?>
596 - <div class="e-overview__feed">
597 - <?php if ( $show_heading ) { ?>
444 + $date = date_i18n( _x( 'M jS', 'Dashboard Overview Widget Recently Date', 'elementor' ), get_the_modified_time( 'U' ) );
445 + ?>
446 + <li class="e-overview__post">
447 + <a href="<?php echo esc_attr( $document->get_edit_url() ); ?>" class="e-overview__post-link"><?php echo esc_html( get_the_title() ); ?> <span class="dashicons dashicons-edit"></span></a> <span><?php echo $date; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>, <?php the_time(); ?></span>
448 + </li>
449 + <?php endwhile; ?>
450 + </ul>
451 + </div>
452 + <?php endif; ?>
453 + <?php if ( ! empty( $elementor_feed ) ) : ?>
454 + <div class="e-overview__feed">
598 455 <h3 class="e-heading e-divider_bottom"><?php echo esc_html__( 'News & Updates', 'elementor' ); ?></h3>
599 - <?php } ?>
600 - <ul class="e-overview__posts">
601 - <?php foreach ( $elementor_feed as $feed_item ) { ?>
602 - <li class="e-overview__post">
603 - <a href="<?php echo esc_url( $feed_item['url'] ); ?>" class="e-overview__post-link" target="_blank">
604 - <?php if ( ! empty( $feed_item['badge'] ) ) { ?>
605 - <span class="e-overview__badge"><?php echo esc_html( $feed_item['badge'] ); ?></span>
606 - <?php } ?>
607 - <?php echo esc_html( $feed_item['title'] ); ?>
608 - </a>
609 - <p class="e-overview__post-description"><?php echo esc_html( $feed_item['excerpt'] ); ?></p>
610 - </li>
611 - <?php } ?>
456 + <ul class="e-overview__posts">
457 + <?php foreach ( $elementor_feed as $feed_item ) : ?>
458 + <li class="e-overview__post">
459 + <a href="<?php echo esc_url( $feed_item['url'] ); ?>" class="e-overview__post-link" target="_blank">
460 + <?php if ( ! empty( $feed_item['badge'] ) ) : ?>
461 + <span class="e-overview__badge"><?php echo esc_html( $feed_item['badge'] ); ?></span>
462 + <?php endif; ?>
463 + <?php echo esc_html( $feed_item['title'] ); ?>
464 + </a>
465 + <p class="e-overview__post-description"><?php echo esc_html( $feed_item['excerpt'] ); ?></p>
466 + </li>
467 + <?php endforeach; ?>
468 + </ul>
469 + </div>
470 + <?php endif; ?>
471 + <div class="e-overview__footer e-divider_top">
472 + <ul>
473 + <?php foreach ( $this->get_dashboard_overview_widget_footer_actions() as $action_id => $action ) : ?>
474 + <li class="e-overview__<?php echo esc_attr( $action_id ); ?>"><a href="<?php echo esc_attr( $action['link'] ); ?>" target="_blank"><?php echo esc_html( $action['title'] ); ?> <span class="screen-reader-text"><?php echo esc_html__( '(opens in a new window)', 'elementor' ); ?></span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></li>
475 + <?php endforeach; ?>
612 476 </ul>
613 477 </div>
614 - <?php }
615 - }
616 -
617 - /**
618 - * Displays the Elementor dashboard widget - footer section.
619 - * Fired by `elementor_dashboard_overview_widget` function.
620 - *
621 - * @since 3.12.0
622 - */
623 - public static function elementor_dashboard_overview_footer() {
624 - ?>
625 - <div class="e-overview__footer e-divider_top">
626 - <ul>
627 - <?php foreach ( self::static_get_dashboard_overview_widget_footer_actions() as $action_id => $action ) { ?>
628 - <li class="e-overview__<?php echo esc_attr( $action_id ); ?>">
629 - <a href="<?php echo esc_url( $action['link'] ); ?>" target="_blank"><?php echo esc_html( $action['title'] ); ?>
630 - <span class="screen-reader-text"><?php echo esc_html__( '(opens in a new window)', 'elementor' ); ?></span>
631 - <span aria-hidden="true" class="dashicons dashicons-external"></span></a>
632 - </li>
633 - <?php } ?>
634 - </ul>
635 478 </div>
636 479 <?php
637 480 }
638 481
@@ -640,12 +483,12 @@
640 483 * Get elementor dashboard overview widget footer actions.
641 484 *
642 485 * Retrieves the footer action links displayed in elementor dashboard widget.
643 486 *
644 - * @since 3.12.0
645 - * @access public
487 + * @since 1.9.0
488 + * @access private
646 489 */
647 - public static function static_get_dashboard_overview_widget_footer_actions() {
490 + private function get_dashboard_overview_widget_footer_actions() {
648 491 $base_actions = [
649 492 'blog' => [
650 493 'title' => esc_html__( 'Blog', 'elementor' ),
651 494 'link' => 'https://go.elementor.com/overview-widget-blog/',
@@ -655,16 +498,19 @@
655 498 'link' => 'https://go.elementor.com/overview-widget-docs/',
656 499 ],
657 500 ];
658 501
659 - $additions_actions = [];
660 - $additions_actions['ai'] = [
661 - 'title' => esc_html__( 'Build Smart with AI', 'elementor' ),
662 - 'link' => 'https://go.elementor.com/overview-widget-ai/',
502 + $additions_actions = [
503 + 'go-pro' => [
504 + 'title' => esc_html__( 'Upgrade', 'elementor' ),
505 + 'link' => 'https://go.elementor.com/go-pro-wp-overview-widget/',
506 + ],
663 507 ];
664 - $additions_actions['go-pro'] = [
665 - 'title' => esc_html__( 'Upgrade', 'elementor' ),
666 - 'link' => 'https://go.elementor.com/go-pro-wp-overview-widget/',
508 +
509 + // Visible to all core users when Elementor Pro is not installed.
510 + $additions_actions['find_an_expert'] = [
511 + 'title' => esc_html__( 'Find an Expert', 'elementor' ),
512 + 'link' => 'https://go.elementor.com/go-pro-find-an-expert/',
667 513 ];
668 514
669 515 /**
670 516 * Dashboard widget footer actions.
@@ -685,20 +531,8 @@
685 531 return $actions;
686 532 }
687 533
688 534 /**
689 - * Get elementor dashboard overview widget footer actions.
690 - *
691 - * Retrieves the footer action links displayed in elementor dashboard widget.
692 - *
693 - * @since 1.9.0
694 - * @access private
695 - */
696 - private function get_dashboard_overview_widget_footer_actions() {
697 - return self::static_get_dashboard_overview_widget_footer_actions();
698 - }
699 -
700 - /**
701 535 * Admin action new post.
702 536 *
703 537 * When a new post action is fired the title is set to 'Elementor' and the post ID.
704 538 *
@@ -709,9 +543,13 @@
709 543 */
710 544 public function admin_action_new_post() {
711 545 check_admin_referer( 'elementor_action_new_post' );
712 546
713 - $post_type = Utils::get_super_global_value( $_GET, 'post_type' ) ?? 'post';
547 + if ( empty( $_GET['post_type'] ) ) {
548 + $post_type = 'post';
549 + } else {
550 + $post_type = $_GET['post_type'];
551 + }
714 552
715 553 if ( ! User::is_current_user_can_edit_post_type( $post_type ) ) {
716 554 return;
717 555 }
@@ -718,15 +556,13 @@
718 556
719 557 if ( empty( $_GET['template_type'] ) ) {
720 558 $type = 'post';
721 559 } else {
722 - $type = sanitize_text_field( wp_unslash( $_GET['template_type'] ) );
560 + $type = sanitize_text_field( $_GET['template_type'] );
723 561 }
724 562
725 - $post_data = Utils::get_super_global_value( $_GET, 'post_data' ) ?? [];
563 + $post_data = isset( $_GET['post_data'] ) ? $_GET['post_data'] : [];
726 564
727 - $post_data = $this->filter_post_data( $post_data );
728 -
729 565 /**
730 566 * Create new post meta data.
731 567 *
732 568 * Filters the meta data of any new post created.
@@ -737,9 +573,9 @@
737 573 */
738 574 $meta = [];
739 575
740 576 if ( isset( $_GET['meta'] ) && is_array( $_GET['meta'] ) ) {
741 - $meta = array_map( 'sanitize_text_field', wp_unslash( $_GET['meta'] ) );
577 + $meta = array_map( 'sanitize_text_field', $_GET['meta'] );
742 578 }
743 579
744 580 $meta = apply_filters( 'elementor/admin/create_new_post/meta', $meta );
745 581
@@ -750,115 +586,14 @@
750 586 if ( is_wp_error( $document ) ) {
751 587 wp_die( $document ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
752 588 }
753 589
754 - wp_safe_redirect( $document->get_edit_url() );
590 + wp_redirect( $document->get_edit_url() );
755 591
756 592 die;
757 593 }
758 594
759 - public function admin_action_site_settings_redirect() {
760 - check_admin_referer( 'elementor_action_site_settings_redirect' );
761 -
762 - if ( ! current_user_can( 'edit_theme_options' ) ) {
763 - wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'elementor' ) );
764 - }
765 -
766 - $active_tab = filter_input( INPUT_GET, 'active-tab', FILTER_SANITIZE_ENCODED );
767 -
768 - $site_settings_url_config = Page::get_site_settings_url_config( $active_tab );
769 -
770 - if ( empty( $site_settings_url_config['url'] ) ) {
771 - wp_die( esc_html__( 'Unable to create or access Site Settings page.', 'elementor' ) );
772 - }
773 -
774 - wp_safe_redirect( $site_settings_url_config['url'] );
775 -
776 - die;
777 - }
778 -
779 595 /**
780 - * Admin action edit website.
781 - *
782 - * Redirects to the homepage edit URL if it exists and is built with Elementor,
783 - * otherwise redirects to create a new page.
784 - *
785 - * Fired by `admin_action_elementor_edit_website` action.
786 - *
787 - * @since 3.x.x
788 - * @access public
789 - */
790 - public function admin_action_edit_website_redirect() {
791 - check_admin_referer( 'elementor_action_edit_website' );
792 -
793 - if ( ! User::is_current_user_can_edit_post_type( 'page' ) ) {
794 - wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'elementor' ) );
795 - }
796 -
797 - $homepage_id = $this->get_homepage_id();
798 - $edit_url = $this->get_edit_website_url( $homepage_id );
799 -
800 - wp_safe_redirect( $edit_url );
801 -
802 - die;
803 - }
804 -
805 - private function get_homepage_id(): ?int {
806 - if ( get_option( 'show_on_front' ) !== 'page' ) {
807 - return null;
808 - }
809 -
810 - $homepage_id = get_option( 'page_on_front' );
811 -
812 - return $homepage_id ? (int) $homepage_id : null;
813 - }
814 -
815 - private function get_edit_website_url( ?int $homepage_id ): string {
816 - if ( ! $homepage_id ) {
817 - return Plugin::$instance->documents->get_create_new_post_url( 'page' );
818 - }
819 -
820 - $document = Plugin::$instance->documents->get( $homepage_id );
821 -
822 - if ( ! $document || ! $document->is_built_with_elementor() ) {
823 - return Plugin::$instance->documents->get_create_new_post_url( 'page' );
824 - }
825 -
826 - return $document->get_edit_url();
827 - }
828 -
829 - private function get_allowed_fields_for_role() {
830 - $allowed_fields = [
831 - 'post_title',
832 - 'post_content',
833 - 'post_excerpt',
834 - 'post_category',
835 - 'post_type',
836 - 'tags_input',
837 - ];
838 -
839 - if ( current_user_can( 'publish_posts' ) ) {
840 - $allowed_fields[] = 'post_status';
841 - }
842 -
843 - if ( current_user_can( 'edit_others_posts' ) ) {
844 - $allowed_fields[] = 'post_author';
845 - }
846 -
847 - return $allowed_fields;
848 - }
849 -
850 - private function filter_post_data( $post_data ) {
851 - $allowed_fields = $this->get_allowed_fields_for_role();
852 - return array_filter(
853 - $post_data,
854 - function( $key ) use ( $allowed_fields ) {
855 - return in_array( $key, $allowed_fields, true );
856 - },
857 - ARRAY_FILTER_USE_KEY
858 - );
859 - }
860 - /**
861 596 * @since 2.3.0
862 597 * @access public
863 598 */
864 599 public function add_new_template_template() {
@@ -864,31 +599,13 @@
864 599 public function add_new_template_template() {
865 600 Plugin::$instance->common->add_template( ELEMENTOR_PATH . 'includes/admin-templates/new-template.php' );
866 601 }
867 602
868 - public function add_new_floating_elements_template() {
869 - Plugin::$instance->common->add_template( ELEMENTOR_PATH . 'includes/admin-templates/new-floating-elements.php' );
870 - }
871 -
872 - public function enqueue_new_floating_elements_scripts() {
873 - $suffix = Utils::is_script_debug() ? '' : '.min';
874 -
875 - wp_enqueue_script(
876 - 'elementor-floating-elements-modal',
877 - ELEMENTOR_ASSETS_URL . 'js/floating-elements-modal' . $suffix . '.js',
878 - [],
879 - ELEMENTOR_VERSION,
880 - true
881 - );
882 -
883 - wp_set_script_translations( 'elementor-floating-elements-modal', 'elementor' );
884 - }
885 -
886 603 /**
887 604 * @access public
888 605 */
889 606 public function enqueue_new_template_scripts() {
890 - $suffix = Utils::is_script_debug() ? '' : '.min';
607 + $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
891 608
892 609 wp_enqueue_script(
893 610 'elementor-new-template',
894 611 ELEMENTOR_ASSETS_URL . 'js/new-template' . $suffix . '.js',
@@ -895,10 +612,8 @@
895 612 [],
896 613 ELEMENTOR_VERSION,
897 614 true
898 615 );
899 -
900 - wp_set_script_translations( 'elementor-new-template', 'elementor' );
901 616 }
902 617
903 618 /**
904 619 * @since 2.6.0
@@ -911,9 +626,9 @@
911 626 /**
912 627 * @access public
913 628 */
914 629 public function enqueue_beta_tester_scripts() {
915 - $suffix = Utils::is_script_debug() ? '' : '.min';
630 + $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
916 631
917 632 wp_enqueue_script(
918 633 'elementor-beta-tester',
919 634 ELEMENTOR_ASSETS_URL . 'js/beta-tester' . $suffix . '.js',
@@ -920,26 +635,10 @@
920 635 [],
921 636 ELEMENTOR_VERSION,
922 637 true
923 638 );
924 -
925 - wp_set_script_translations( 'elementor-beta-tester', 'elementor' );
926 639 }
927 640
928 - public function init_floating_elements() {
929 - $screens = [
930 - 'elementor_library_page_e-floating-buttons' => true,
931 - 'edit-e-floating-buttons' => true,
932 - ];
933 -
934 - if ( ! isset( $screens[ get_current_screen()->id ] ) ) {
935 - return;
936 - }
937 -
938 - add_action( 'admin_head', [ $this, 'add_new_floating_elements_template' ] );
939 - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_new_floating_elements_scripts' ] );
940 - }
941 -
942 641 /**
943 642 * @access public
944 643 */
945 644 public function init_new_template() {
@@ -970,14 +669,14 @@
970 669 <?php echo esc_html__( 'Heads up, Please backup before upgrade!', 'elementor' ); ?>
971 670 </div>
972 671 <div class="e-major-update-warning__message">
973 672 <?php
974 - printf(
975 - /* translators: %1$s Link open tag, %2$s: Link close tag. */
976 - esc_html__( 'The latest update includes some substantial changes across different areas of the plugin. We highly recommend you %1$sbackup your site before upgrading%2$s, and make sure you first update in a staging environment', 'elementor' ),
977 - '<a href="https://go.elementor.com/wp-dash-update-backup/">',
978 - '</a>'
979 - );
673 + printf(
674 + /* translators: %1$s Link open tag, %2$s: Link close tag. */
675 + esc_html__( 'The latest update includes some substantial changes across different areas of the plugin. We highly recommend you %1$sbackup your site before upgrading%2$s, and make sure you first update in a staging environment', 'elementor' ),
676 + '<a href="https://go.elementor.com/wp-dash-update-backup/">',
677 + '</a>'
678 + );
980 679 ?>
981 680 </div>
982 681 </div>
983 682 </div>
@@ -1007,8 +706,12 @@
1007 706
1008 707 $this->add_component( 'feedback', new Feedback() );
1009 708 $this->add_component( 'admin-notices', new Admin_Notices() );
1010 709
710 + if ( Plugin::$instance->experiments->is_feature_active( 'admin_menu_rearrangement' ) ) {
711 + $this->register_menu();
712 + }
713 +
1011 714 add_action( 'admin_init', [ $this, 'maybe_redirect_to_getting_started' ] );
1012 715
1013 716 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
1014 717 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_styles' ] );
@@ -1028,20 +731,15 @@
1028 731 add_action( 'wp_dashboard_setup', [ $this, 'register_dashboard_widgets' ] );
1029 732
1030 733 // Admin Actions
1031 734 add_action( 'admin_action_elementor_new_post', [ $this, 'admin_action_new_post' ] );
1032 - add_action( 'admin_action_elementor_site_settings_redirect', [ $this, 'admin_action_site_settings_redirect' ] );
1033 - add_action( 'admin_action_elementor_edit_website_redirect', [ $this, 'admin_action_edit_website_redirect' ] );
1034 735
1035 736 add_action( 'current_screen', [ $this, 'init_new_template' ] );
1036 - add_action( 'current_screen', [ $this, 'init_floating_elements' ] );
1037 737 add_action( 'current_screen', [ $this, 'init_beta_tester' ] );
1038 738
1039 739 add_action( 'in_plugin_update_message-' . ELEMENTOR_PLUGIN_BASE, function( $plugin_data ) {
1040 740 $this->version_update_warning( ELEMENTOR_VERSION, $plugin_data['new_version'] );
1041 741 } );
1042 -
1043 - add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_hints' ] );
1044 742 }
1045 743
1046 744 /**
1047 745 * @since 2.3.0
@@ -1057,10 +755,8 @@
1057 755 'home_url' => home_url(),
1058 756 'settings_url' => Settings::get_url(),
1059 757 'user' => [
1060 758 'introduction' => User::get_introduction_meta(),
1061 - 'restrictions' => Plugin::$instance->role_manager->get_user_restrictions_array(),
1062 - 'is_administrator' => current_user_can( 'manage_options' ),
1063 759 ],
1064 760 'beta_tester' => [
1065 761 'beta_tester_signup' => Beta_Testers::BETA_TESTER_SIGNUP,
1066 762 'has_email' => $beta_tester_email,
@@ -1104,117 +800,12 @@
1104 800 'title' => $experiment_data['title'] ?? $experiment_data['name'],
1105 801 'state' => $experiment_data['state'],
1106 802 'default' => $experiment_data['default'],
1107 803 'dependencies' => $dependencies,
1108 - 'messages' => $experiment_data['messages'] ?? [],
1109 804 ];
1110 805 } )->all();
1111 806 }
1112 807
1113 - private function maybe_enqueue_hints() {
1114 - $plugin_slug = 'image-optimization';
1115 -
1116 - if ( ! Hints::should_display_hint( $plugin_slug ) ) {
1117 - return;
1118 - }
1119 -
1120 - wp_register_script(
1121 - 'media-hints',
1122 - $this->get_js_assets_url( 'media-hints' ),
1123 - [],
1124 - ELEMENTOR_VERSION,
1125 - true
1126 - );
1127 -
1128 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
1129 - $is_installed = Hints::is_plugin_installed( $plugin_slug );
1130 - $is_active = Hints::is_plugin_active( $plugin_slug );
1131 -
1132 - if ( $is_active ) {
1133 - return;
1134 - }
1135 -
1136 - if ( $one_subscription ) {
1137 - if ( ! $is_installed ) {
1138 - $description = esc_html__( 'Automatically optimize images to improve site speed and performance. Included with your ONE subscription.', 'elementor' );
1139 - $button_text = esc_html__( 'Install now', 'elementor' );
1140 - $button_url = Hints::get_plugin_install_url( $plugin_slug );
1141 - } elseif ( ! $is_active ) {
1142 - $description = esc_html__( 'Image Optimization is installed and included in your ONE subscription. Activate it to optimize images and improve site performance.', 'elementor' );
1143 - $button_text = esc_html__( 'Activate now', 'elementor' );
1144 - $button_url = Hints::get_plugin_activate_url( $plugin_slug );
1145 - }
1146 - } else {
1147 - $description = esc_html__( 'Optimize your images to enhance site performance by using Image Optimization.', 'elementor' );
1148 - if ( ! $is_installed ) {
1149 - $button_text = esc_html__( 'Install now', 'elementor' );
1150 - $button_url = Hints::get_plugin_install_url( $plugin_slug );
1151 - } elseif ( ! $is_active ) {
1152 - $button_text = esc_html__( 'Activate now', 'elementor' );
1153 - $button_url = Hints::get_plugin_activate_url( $plugin_slug );
1154 - }
1155 - }
1156 -
1157 - $dismissible = 'image_optimizer_hint';
1158 -
1159 - $title = esc_html__( 'Speed up your website with Image Optimization', 'elementor' );
1160 - $content = sprintf(
1161 - "<strong>%1\$s</strong><br>%2\$s <a class='e-btn-1' href='%3\$s' target='_blank'>%4\$s</a>!",
1162 - $title,
1163 - $description,
1164 - $button_url,
1165 - $button_text
1166 - );
1167 -
1168 - wp_localize_script( 'media-hints', 'elementorAdminHints', [
1169 - 'mediaHint' => [
1170 - 'display' => true,
1171 - 'type' => 'info',
1172 - 'content' => $content,
1173 - 'icon' => true,
1174 - 'dismissible' => $dismissible,
1175 - 'dismiss' => esc_attr__( 'Dismiss this notice.', 'elementor' ),
1176 - 'button_event' => $dismissible,
1177 - 'button_data' => base64_encode(
1178 - wp_json_encode( [
1179 - 'action_url' => $button_url,
1180 - ] ),
1181 - ),
1182 - ],
1183 - ] );
1184 -
1185 - wp_enqueue_script( 'media-hints' );
1186 - }
1187 -
1188 - public function register_ajax_hints( $ajax_manager ) {
1189 - $ajax_manager->register_ajax_action( 'elementor_image_optimization_campaign', [ $this, 'ajax_set_image_optimization_campaign' ] );
1190 - $ajax_manager->register_ajax_action( 'elementor_core_ally_campaign', [ $this, 'ajax_ally_campaign' ] );
1191 - }
1192 -
1193 - public function ajax_ally_campaign( $request ) {
1194 - if ( ! current_user_can( 'install_plugins' ) ) {
1195 - return;
1196 - }
1197 -
1198 - $campaign_data = [
1199 - 'campaign' => sanitize_key( $request['campaign'] ?? '' ),
1200 - 'source' => sanitize_key( $request['source'] ?? '' ),
1201 - 'medium' => sanitize_key( $request['medium'] ?? '' ),
1202 - ];
1203 -
1204 - set_transient( 'elementor_ea11y_campaign', $campaign_data, 30 * DAY_IN_SECONDS );
1205 - }
1206 -
1207 - public function ajax_set_image_optimization_campaign( $request ) {
1208 - if ( ! current_user_can( 'install_plugins' ) ) {
1209 - return;
1210 - }
1211 -
1212 - $campaign_data = [
1213 - 'campaign' => sanitize_key( $request['campaign'] ?? '' ),
1214 - 'source' => sanitize_key( $request['source'] ?? '' ),
1215 - 'medium' => sanitize_key( $request['medium'] ?? '' ),
1216 - ];
1217 -
1218 - set_transient( 'elementor_image_optimization_campaign', $campaign_data, 30 * DAY_IN_SECONDS );
808 + private function register_menu() {
809 + $this->menus['main'] = new MainMenu();
1219 810 }
1220 811 }