Delete files

This commit is contained in:
Roman Pyrih
2024-07-29 12:59:43 +02:00
parent d47e06907b
commit f6da3b4871
9341 changed files with 3 additions and 3741550 deletions

View File

@@ -1,616 +0,0 @@
<?php
namespace Elementor\Core\Admin;
use Elementor\Api;
use Elementor\Core\Admin\UI\Components\Button;
use Elementor\Core\Base\Module;
use Elementor\Core\Utils\Promotions\Filtered_Promotions_Manager;
use Elementor\Plugin;
use Elementor\Settings;
use Elementor\Tracker;
use Elementor\User;
use Elementor\Utils;
use Elementor\Core\Admin\Notices\Base_Notice;
use Elementor\Core\Admin\Notices\Elementor_Dev_Notice;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Admin_Notices extends Module {
const DEFAULT_EXCLUDED_PAGES = [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ];
private $plain_notices = [
'api_notice',
'api_upgrade_plugin',
'tracker',
'rate_us_feedback',
'role_manager_promote',
'experiment_promotion',
'design_not_appearing',
'plugin_image_optimization',
];
private $elementor_pages_count = null;
private $install_time = null;
private $current_screen_id = null;
private function get_notices() {
$notices = [
new Elementor_Dev_Notice(),
];
/**
* Admin notices.
*
* Filters Elementor admin notices.
*
* This hook can be used by external developers to manage existing
* admin notice or to add new notices for Elementor add-ons.
*
* @param array $notices A list of notice classes.
*/
$notices = apply_filters( 'elementor/core/admin/notices', $notices );
return $notices;
}
private function get_install_time() {
if ( null === $this->install_time ) {
$this->install_time = Plugin::$instance->get_install_time();
}
return $this->install_time;
}
private function get_elementor_pages_count() {
if ( null === $this->elementor_pages_count ) {
$elementor_pages = new \WP_Query( [
'no_found_rows' => true,
'post_type' => 'any',
'post_status' => 'publish',
'fields' => 'ids',
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
'meta_key' => '_elementor_edit_mode',
'meta_value' => 'builder',
] );
$this->elementor_pages_count = $elementor_pages->post_count;
}
return $this->elementor_pages_count;
}
private function notice_api_upgrade_plugin() {
$upgrade_notice = Api::get_upgrade_notice();
if ( empty( $upgrade_notice ) ) {
return false;
}
if ( ! current_user_can( 'update_plugins' ) ) {
return false;
}
if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
return false;
}
// Check for upgrades.
$update_plugins = get_site_transient( 'update_plugins' );
$has_remote_update_package = ! ( empty( $update_plugins ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ] ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ]->package ) );
if ( ! $has_remote_update_package && empty( $upgrade_notice['update_link'] ) ) {
return false;
}
if ( $has_remote_update_package ) {
$product = $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ];
$details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $product->slug . '&section=changelog&TB_iframe=true&width=600&height=800' );
$upgrade_url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . ELEMENTOR_PLUGIN_BASE ), 'upgrade-plugin_' . ELEMENTOR_PLUGIN_BASE );
$new_version = $product->new_version;
} else {
$upgrade_url = $upgrade_notice['update_link'];
$details_url = $upgrade_url;
$new_version = $upgrade_notice['version'];
}
// Check if upgrade messages should be shown.
if ( version_compare( ELEMENTOR_VERSION, $upgrade_notice['version'], '>=' ) ) {
return false;
}
$notice_id = 'upgrade_notice_' . $upgrade_notice['version'];
if ( User::is_user_notice_viewed( $notice_id ) ) {
return false;
}
$message = sprintf(
/* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text. */
__( 'There is a new version of Elementor Page Builder available. <a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">View version %3$s details</a> or <a href="%4$s" class="update-link" aria-label="%5$s">update now</a>.', 'elementor' ),
esc_url( $details_url ),
esc_attr( sprintf(
/* translators: %s: Elementor version. */
__( 'View Elementor version %s details', 'elementor' ),
$new_version
) ),
$new_version,
esc_url( $upgrade_url ),
esc_attr( esc_html__( 'Update Now', 'elementor' ) )
);
$options = [
'title' => esc_html__( 'Update Notification', 'elementor' ),
'description' => $message,
'button' => [
'icon_classes' => 'dashicons dashicons-update',
'text' => esc_html__( 'Update Now', 'elementor' ),
'url' => $upgrade_url,
],
'id' => $notice_id,
];
$this->print_admin_notice( $options );
return true;
}
private function notice_api_notice() {
$admin_notice = Api::get_admin_notice();
if ( empty( $admin_notice ) ) {
return false;
}
if ( ! current_user_can( 'manage_options' ) ) {
return false;
}
if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
return false;
}
$notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
if ( User::is_user_notice_viewed( $notice_id ) ) {
return false;
}
$options = [
'title' => esc_html__( 'Update Notification', 'elementor' ),
'description' => $admin_notice['notice_text'],
'id' => $notice_id,
];
$this->print_admin_notice( $options );
return true;
}
private function notice_tracker() {
if ( ! current_user_can( 'manage_options' ) ) {
return false;
}
// Show tracker notice after 24 hours from installed time.
if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
return false;
}
if ( '1' === get_option( 'elementor_tracker_notice' ) ) {
return false;
}
if ( Tracker::is_allow_track() ) {
return false;
}
if ( 2 > $this->get_elementor_pages_count() ) {
return false;
}
// TODO: Skip for development env.
$optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
$optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
$tracker_description_text = esc_html__( 'Become a super contributor by opting in to share non-sensitive plugin data and to receive periodic email updates from us.', 'elementor' );
/**
* Tracker admin description text.
*
* Filters the admin notice text for non-sensitive data collection.
*
* @since 1.0.0
*
* @param string $tracker_description_text Description text displayed in admin notice.
*/
$tracker_description_text = apply_filters( 'elementor/tracker/admin_description_text', $tracker_description_text );
$message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
$options = [
'title' => esc_html__( 'Love using Elementor?', 'elementor' ),
'description' => $message,
'button' => [
'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
'url' => $optin_url,
'type' => 'cta',
],
'button_secondary' => [
'text' => esc_html__( 'No thanks', 'elementor' ),
'url' => $optout_url,
'variant' => 'outline',
'type' => 'cta',
],
];
$this->print_admin_notice( $options );
return true;
}
private function notice_rate_us_feedback() {
$notice_id = 'rate_us_feedback';
if ( ! current_user_can( 'manage_options' ) ) {
return false;
}
if ( 'dashboard' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
return false;
}
if ( 10 >= $this->get_elementor_pages_count() ) {
return false;
}
$dismiss_url = add_query_arg( [
'action' => 'elementor_set_admin_notice_viewed',
'notice_id' => esc_attr( $notice_id ),
], admin_url( 'admin-post.php' ) );
$options = [
'title' => esc_html__( 'Congrats!', 'elementor' ),
'description' => esc_html__( 'You created over 10 pages with Elementor. Great job! If you can spare a minute, please help us by leaving a five star review on WordPress.org.', 'elementor' ),
'id' => $notice_id,
'button' => [
'text' => esc_html__( 'Happy To Help', 'elementor' ),
'url' => 'https://go.elementor.com/admin-review/',
'new_tab' => true,
'type' => 'cta',
],
'button_secondary' => [
'text' => esc_html__( 'Hide Notification', 'elementor' ),
'classes' => [ 'e-notice-dismiss' ],
'url' => esc_url_raw( $dismiss_url ),
'new_tab' => true,
'type' => 'cta',
],
];
$this->print_admin_notice( $options );
return true;
}
private function notice_role_manager_promote() {
$notice_id = 'role_manager_promote';
if ( Utils::has_pro() ) {
return false;
}
if ( ! current_user_can( 'manage_options' ) ) {
return false;
}
if ( 'elementor_page_elementor-role-manager' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
return false;
}
$users = new \WP_User_Query( [
'fields' => 'ID',
'number' => 10,
] );
if ( 5 > $users->get_total() ) {
return false;
}
$options = [
'title' => esc_html__( 'Managing a multi-user site?', 'elementor' ),
'description' => esc_html__( 'With Elementor Pro, you can control user access and make sure no one messes up your design.', 'elementor' ),
'id' => $notice_id,
'button' => [
'text' => esc_html__( 'Learn More', 'elementor' ),
'url' => 'https://go.elementor.com/plugin-promotion-role-manager/',
'new_tab' => true,
'type' => 'cta',
],
];
$options = Filtered_Promotions_Manager::get_filtered_promotion_data( $options, 'core/admin/notice_role_manager_promote', 'button', 'url' );
$this->print_admin_notice( $options );
return true;
}
private function notice_experiment_promotion() {
$notice_id = 'experiment_promotion';
if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
return false;
}
$experiments = Plugin::$instance->experiments;
$is_all_performance_features_active = (
$experiments->is_feature_active( 'additional_custom_breakpoints' ) &&
$experiments->is_feature_active( 'e_optimized_css_loading' )
);
if ( $is_all_performance_features_active ) {
return false;
}
$options = [
'title' => esc_html__( 'Improve your sites performance score.', 'elementor' ),
'description' => esc_html__( 'With our experimental speed boosting features you can go faster than ever before. Look for the Performance label on our Experiments page and activate those experiments to improve your site loading speed.', 'elementor' ),
'id' => $notice_id,
'button' => [
'text' => esc_html__( 'Try it out', 'elementor' ),
'url' => Settings::get_settings_tab_url( 'experiments' ),
'type' => 'cta',
],
'button_secondary' => [
'text' => esc_html__( 'Learn more', 'elementor' ),
'url' => 'https://go.elementor.com/wp-dash-experiment-promotion/',
'new_tab' => true,
'type' => 'cta',
],
];
$this->print_admin_notice( $options );
return true;
}
private function notice_design_not_appearing() {
$installs_history = get_option( 'elementor_install_history', [] );
$is_first_install = 1 === count( $installs_history );
if ( $is_first_install || ! current_user_can( 'update_plugins' ) ) {
return false;
}
$notice_id = 'design_not_appearing';
$notice = User::get_user_notices()[ $notice_id ] ?? [];
$notice_version = $notice['meta']['version'] ?? null;
$is_version_changed = $this->get_elementor_version() !== $notice_version;
if ( $is_version_changed ) {
User::set_user_notice( $notice_id, false, [ 'version' => $this->get_elementor_version() ] );
}
if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard', 'update-core', 'plugins' ], true ) ) {
return false;
}
if ( User::is_user_notice_viewed( $notice_id ) ) {
return false;
}
$options = [
'title' => esc_html__( 'The version was updated successfully!', 'elementor' ),
'description' => sprintf(
esc_html__( 'Encountering issues after updating the version? Dont worry - weve collected all the fixes for troubleshooting common issues. %1$sFind a solution%2$s', 'elementor' ),
'<a href="https://go.elementor.com/wp-dash-changes-do-not-appear-online/" target="_blank">',
'</a>'
),
'id' => $notice_id,
];
$excluded_pages = [];
$this->print_admin_notice( $options, $excluded_pages );
return true;
}
// For testing purposes
public function get_elementor_version() {
return ELEMENTOR_VERSION;
}
private function notice_plugin_image_optimization() {
$notice_id = 'plugin_image_optimization';
if ( 'upload' !== $this->current_screen_id ) {
return false;
}
if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
return false;
}
$attachments = new \WP_Query( [
'post_type' => 'attachment',
'post_status' => 'any',
'fields' => 'ids',
] );
if ( 1 > $attachments->found_posts ) {
return false;
}
$plugin_file_path = 'image-optimization/image-optimization.php';
$plugin_slug = 'image-optimization';
if ( is_plugin_active( $plugin_file_path ) ) {
return false;
}
if ( $this->is_plugin_installed( $plugin_file_path ) ) {
$url = wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file_path . '&amp;plugin_status=all&amp;paged=1&amp;s', 'activate-plugin_' . $plugin_file_path );
$cta_text = esc_html__( 'Activate Plugin', 'elementor' );
} else {
$url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $plugin_slug ), 'install-plugin_' . $plugin_slug );
$cta_text = esc_html__( 'Install Plugin', 'elementor' );
}
$options = [
'title' => esc_html__( 'Speed up your website with Image Optimizer by Elementor', 'elementor' ),
'description' => esc_html__( 'Automatically compress and optimize images, resize larger files, or convert to WebP. Optimize images individually, in bulk, or on upload.', 'elementor' ),
'id' => $notice_id,
'type' => 'cta',
'button_secondary' => [
'text' => $cta_text,
'url' => $url,
'type' => 'cta',
],
];
$this->print_admin_notice( $options );
return true;
}
private function is_plugin_installed( $file_path ): bool {
$installed_plugins = get_plugins();
return isset( $installed_plugins[ $file_path ] );
}
public function print_admin_notice( array $options, $exclude_pages = self::DEFAULT_EXCLUDED_PAGES ) {
global $pagenow;
if ( in_array( $pagenow, $exclude_pages, true ) ) {
return;
}
$default_options = [
'id' => null,
'title' => '',
'description' => '',
'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
'type' => '',
'dismissible' => true,
'icon' => 'eicon-elementor',
'button' => [],
'button_secondary' => [],
];
$options = array_replace_recursive( $default_options, $options );
$notice_classes = $options['classes'];
$dismiss_button = '';
$icon = '';
if ( $options['type'] ) {
$notice_classes[] = 'e-notice--' . $options['type'];
}
if ( $options['dismissible'] ) {
$label = esc_html__( 'Dismiss this notice.', 'elementor' );
$notice_classes[] = 'e-notice--dismissible';
$dismiss_button = '<i class="e-notice__dismiss" role="button" aria-label="' . $label . '" tabindex="0"></i>';
}
if ( $options['icon'] ) {
$notice_classes[] = 'e-notice--extended';
$icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
}
$wrapper_attributes = [
'class' => $notice_classes,
];
if ( $options['id'] ) {
$wrapper_attributes['data-notice_id'] = $options['id'];
}
?>
<div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
<?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="e-notice__aside">
<?php echo $icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<div class="e-notice__content">
<?php if ( $options['title'] ) { ?>
<h3><?php echo wp_kses_post( $options['title'] ); ?></h3>
<?php } ?>
<?php if ( $options['description'] ) { ?>
<p><?php echo wp_kses_post( $options['description'] ); ?></p>
<?php } ?>
<?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
<div class="e-notice__actions">
<?php
foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
if ( empty( $button_settings['variant'] ) && $index ) {
$button_settings['variant'] = 'outline';
}
if ( empty( $button_settings['text'] ) ) {
continue;
}
$button = new Button( $button_settings );
$button->print_button();
} ?>
</div>
<?php } ?>
</div>
</div>
<?php }
public function admin_notices() {
$this->install_time = Plugin::$instance->get_install_time();
$this->current_screen_id = get_current_screen()->id;
foreach ( $this->plain_notices as $notice ) {
$method_callback = "notice_{$notice}";
if ( $this->$method_callback() ) {
return;
}
}
/** @var Base_Notice $notice_instance */
foreach ( $this->get_notices() as $notice_instance ) {
if ( ! $notice_instance->should_print() ) {
continue;
}
$this->print_admin_notice( $notice_instance->get_config() );
// It exits the method to make sure it prints only one notice.
return;
}
}
/**
* @since 2.9.0
* @access public
*/
public function __construct() {
add_action( 'admin_notices', [ $this, 'admin_notices' ], 20 );
}
/**
* Get module name.
*
* Retrieve the module name.
*
* @since 2.9.0
* @access public
*
* @return string Module name.
*/
public function get_name() {
return 'admin-notices';
}
}

View File

@@ -1,990 +0,0 @@
<?php
namespace Elementor\Core\Admin;
use Elementor\Api;
use Elementor\Beta_Testers;
use Elementor\Core\Admin\Menu\Main as MainMenu;
use Elementor\App\Modules\Onboarding\Module as Onboarding_Module;
use Elementor\Core\Base\App;
use Elementor\Core\Upgrade\Manager as Upgrade_Manager;
use Elementor\Core\Utils\Assets_Config_Provider;
use Elementor\Core\Utils\Collection;
use Elementor\Plugin;
use Elementor\Settings;
use Elementor\User;
use Elementor\Utils;
use Elementor\Core\Utils\Hints;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Admin extends App {
private $menus = [];
/**
* Get module name.
*
* Retrieve the module name.
*
* @since 2.3.0
* @access public
*
* @return string Module name.
*/
public function get_name() {
return 'admin';
}
/**
* @since 2.2.0
* @access public
*/
public function maybe_redirect_to_getting_started() {
if ( ! get_transient( 'elementor_activation_redirect' ) ) {
return;
}
if ( wp_doing_ajax() ) {
return;
}
delete_transient( 'elementor_activation_redirect' );
if ( is_network_admin() || isset( $_GET['activate-multi'] ) ) {
return;
}
$already_had_onboarding = get_option( Onboarding_Module::ONBOARDING_OPTION );
// Get the latest installation from Elementor's Install log in the DB.
$latest_install = key( Upgrade_Manager::get_installs_history() );
if ( ! empty( $latest_install ) ) {
$is_new_install = version_compare( $latest_install, '3.6.0-beta', '>=' );
} else {
// If `$latest_install` is not set, Elementor was never installed on this site.
$is_new_install = true;
}
if ( $already_had_onboarding || ! $is_new_install ) {
return;
}
wp_safe_redirect( admin_url( 'admin.php?page=elementor-app#onboarding' ) );
exit;
}
private function register_packages() {
$assets_config_provider = ( new Assets_Config_Provider() )
->set_path_resolver( function ( $name ) {
return ELEMENTOR_ASSETS_PATH . "js/packages/{$name}/{$name}.asset.php";
} );
Collection::make( [ 'ui', 'icons', 'query' ] )
->each( function( $package ) use ( $assets_config_provider ) {
$suffix = Utils::is_script_debug() ? '' : '.min';
$config = $assets_config_provider->load( $package )->get( $package );
if ( ! $config ) {
return;
}
wp_register_script(
$config['handle'],
ELEMENTOR_ASSETS_URL . "js/packages/{$package}/{$package}{$suffix}.js",
$config['deps'],
ELEMENTOR_VERSION,
true
);
} );
}
/**
* Enqueue admin scripts.
*
* Registers all the admin scripts and enqueues them.
*
* Fired by `admin_enqueue_scripts` action.
*
* @since 1.0.0
* @access public
*/
public function enqueue_scripts() {
wp_register_script(
'elementor-admin-modules',
$this->get_js_assets_url( 'admin-modules' ),
[],
ELEMENTOR_VERSION,
true
);
$this->register_packages();
// Temporary solution for the admin.
wp_register_script(
'elementor-ai-admin',
$this->get_js_assets_url( 'ai-admin' ),
[
'elementor-common',
'elementor-v2-ui',
'elementor-v2-icons',
],
ELEMENTOR_VERSION,
true
);
wp_register_script(
'elementor-admin',
$this->get_js_assets_url( 'admin' ),
[
'elementor-common',
'elementor-admin-modules',
],
ELEMENTOR_VERSION,
true
);
wp_enqueue_script( 'elementor-admin' );
wp_set_script_translations( 'elementor-admin', 'elementor' );
$this->maybe_enqueue_hints();
$this->print_config();
}
/**
* Enqueue admin styles.
*
* Registers all the admin styles and enqueues them.
*
* Fired by `admin_enqueue_scripts` action.
*
* @since 1.0.0
* @access public
*/
public function enqueue_styles() {
$direction_suffix = is_rtl() ? '-rtl' : '';
wp_register_style(
'elementor-admin',
$this->get_css_assets_url( 'admin' . $direction_suffix ),
[
'elementor-common',
],
ELEMENTOR_VERSION
);
wp_enqueue_style( 'elementor-admin' );
// It's for upgrade notice.
// TODO: enqueue this just if needed.
add_thickbox();
}
/**
* Print switch mode button.
*
* Adds a switch button in post edit screen (which has cpt support). To allow
* the user to switch from the native WordPress editor to Elementor builder.
*
* Fired by `edit_form_after_title` action.
*
* @since 1.0.0
* @access public
*
* @param \WP_Post $post The current post object.
*/
public function print_switch_mode_button( $post ) {
// Exit if Gutenberg are active.
if ( did_action( 'enqueue_block_editor_assets' ) ) {
return;
}
$document = Plugin::$instance->documents->get( $post->ID );
if ( ! $document || ! $document->is_editable_by_current_user() ) {
return;
}
wp_nonce_field( basename( __FILE__ ), '_elementor_edit_mode_nonce' );
?>
<div id="elementor-switch-mode">
<input id="elementor-switch-mode-input" type="hidden" name="_elementor_post_mode" value="<?php echo esc_attr( $document->is_built_with_elementor() ); ?>" />
<button id="elementor-switch-mode-button" type="button" class="button button-primary button-hero">
<span class="elementor-switch-mode-on">
<i class="eicon-arrow-<?php echo ( is_rtl() ) ? 'right' : 'left'; ?>" aria-hidden="true"></i>
<?php echo esc_html__( 'Back to WordPress Editor', 'elementor' ); ?>
</span>
<span class="elementor-switch-mode-off">
<i class="eicon-elementor-square" aria-hidden="true"></i>
<?php echo esc_html__( 'Edit with Elementor', 'elementor' ); ?>
</span>
</button>
</div>
<div id="elementor-editor">
<a id="elementor-go-to-edit-page-link" href="<?php echo esc_url( $document->get_edit_url() ); ?>">
<div id="elementor-editor-button" class="button button-primary button-hero">
<i class="eicon-elementor-square" aria-hidden="true"></i>
<?php echo esc_html__( 'Edit with Elementor', 'elementor' ); ?>
</div>
<div class="elementor-loader-wrapper">
<div class="elementor-loader">
<div class="elementor-loader-boxes">
<div class="elementor-loader-box"></div>
<div class="elementor-loader-box"></div>
<div class="elementor-loader-box"></div>
<div class="elementor-loader-box"></div>
</div>
</div>
<div class="elementor-loading-title"><?php echo esc_html__( 'Loading', 'elementor' ); ?></div>
</div>
</a>
</div>
<?php
}
/**
* Save post.
*
* Flag the post mode when the post is saved.
*
* Fired by `save_post` action.
*
* @since 1.0.0
* @access public
*
* @param int $post_id Post ID.
*/
public function save_post( $post_id ) {
if ( ! wp_verify_nonce( Utils::get_super_global_value( $_POST, '_elementor_edit_mode_nonce' ), basename( __FILE__ ) ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
Plugin::$instance->documents->get( $post_id )->set_is_built_with_elementor( ! empty( $_POST['_elementor_post_mode'] ) );
}
/**
* Add Elementor post state.
*
* Adds a new "Elementor" post state to the post table.
*
* Fired by `display_post_states` filter.
*
* @since 1.8.0
* @access public
*
* @param array $post_states An array of post display states.
* @param \WP_Post $post The current post object.
*
* @return array A filtered array of post display states.
*/
public function add_elementor_post_state( $post_states, $post ) {
$document = Plugin::$instance->documents->get( $post->ID );
if ( $document && $document->is_built_with_elementor() && $document->is_editable_by_current_user() ) {
$post_states['elementor'] = esc_html__( 'Elementor', 'elementor' );
}
return $post_states;
}
/**
* Body status classes.
*
* Adds CSS classes to the admin body tag.
*
* Fired by `admin_body_class` filter.
*
* @since 1.0.0
* @access public
*
* @param string $classes Space-separated list of CSS classes.
*
* @return string Space-separated list of CSS classes.
*/
public function body_status_classes( $classes ) {
global $pagenow;
if ( in_array( $pagenow, [ 'post.php', 'post-new.php' ], true ) && Utils::is_post_support() ) {
$post = get_post();
$document = Plugin::$instance->documents->get( $post->ID );
$mode_class = $document && $document->is_built_with_elementor() ? 'elementor-editor-active' : 'elementor-editor-inactive';
$classes .= ' ' . $mode_class;
}
return $classes;
}
/**
* Plugin action links.
*
* Adds action links to the plugin list table
*
* Fired by `plugin_action_links` filter.
*
* @since 1.0.0
* @access public
*
* @param array $links An array of plugin action links.
*
* @return array An array of plugin action links.
*/
public function plugin_action_links( $links ) {
$settings_link = sprintf( '<a href="%1$s">%2$s</a>', admin_url( 'admin.php?page=' . Settings::PAGE_ID ), esc_html__( 'Settings', 'elementor' ) );
array_unshift( $links, $settings_link );
$go_pro_text = esc_html__( 'Get Elementor Pro', 'elementor' );
if ( Utils::is_sale_time() ) {
$go_pro_text = esc_html__( 'Discounted Upgrades Now!', 'elementor' );
}
$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 );
return $links;
}
/**
* Plugin row meta.
*
* Adds row meta links to the plugin list table
*
* Fired by `plugin_row_meta` filter.
*
* @since 1.1.4
* @access public
*
* @param array $plugin_meta An array of the plugin's metadata, including
* the version, author, author URI, and plugin URI.
* @param string $plugin_file Path to the plugin file, relative to the plugins
* directory.
*
* @return array An array of plugin row meta links.
*/
public function plugin_row_meta( $plugin_meta, $plugin_file ) {
if ( ELEMENTOR_PLUGIN_BASE === $plugin_file ) {
$row_meta = [
'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>',
'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>',
];
$plugin_meta = array_merge( $plugin_meta, $row_meta );
}
return $plugin_meta;
}
/**
* Admin footer text.
*
* Modifies the "Thank you" text displayed in the admin footer.
*
* Fired by `admin_footer_text` filter.
*
* @since 1.0.0
* @access public
*
* @param string $footer_text The content that will be printed.
*
* @return string The content that will be printed.
*/
public function admin_footer_text( $footer_text ) {
$current_screen = get_current_screen();
$is_elementor_screen = ( $current_screen && false !== strpos( $current_screen->id, 'elementor' ) );
if ( $is_elementor_screen ) {
$footer_text = sprintf(
/* translators: 1: Elementor, 2: Link to plugin review */
__( 'Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!', 'elementor' ),
'<strong>' . esc_html__( 'Elementor', 'elementor' ) . '</strong>',
'<a href="https://go.elementor.com/admin-review/" target="_blank">&#9733;&#9733;&#9733;&#9733;&#9733;</a>'
);
}
return $footer_text;
}
/**
* Register dashboard widgets.
*
* Adds a new Elementor widgets to WordPress dashboard.
*
* Fired by `wp_dashboard_setup` action.
*
* @since 1.9.0
* @access public
*/
public function register_dashboard_widgets() {
wp_add_dashboard_widget( 'e-dashboard-overview', esc_html__( 'Elementor Overview', 'elementor' ), [ $this, 'elementor_dashboard_overview_widget' ] );
// Move our widget to top.
global $wp_meta_boxes;
$dashboard = $wp_meta_boxes['dashboard']['normal']['core'];
$ours = [
'e-dashboard-overview' => $dashboard['e-dashboard-overview'],
];
$wp_meta_boxes['dashboard']['normal']['core'] = array_merge( $ours, $dashboard ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
}
/**
* Displays the Elementor dashboard widget.
*
* Fired by `wp_add_dashboard_widget` function.
*
* @since 1.9.0
* @access public
*/
public function elementor_dashboard_overview_widget() {
?>
<div class="e-dashboard-overview e-dashboard-widget">
<?php
self::elementor_dashboard_overview_header();
self::elementor_dashboard_overview_recently_edited();
self::elementor_dashboard_overview_news_updates();
self::elementor_dashboard_overview_footer();
?>
</div>
<?php
}
/**
* Displays the Elementor dashboard widget - header section.
* Fired by `elementor_dashboard_overview_widget` function.
*
* @param bool $show_versions
* @param bool $is_create_post_enabled
*
* @return void
* @since 3.12.0
*/
public static function elementor_dashboard_overview_header( bool $show_versions = true, bool $is_create_post_enabled = true ) {
if ( User::is_current_user_can_edit_post_type( 'page' ) ) {
$create_new_label = esc_html__( 'Create New Page', 'elementor' );
$create_new_post_type = 'page';
} elseif ( User::is_current_user_can_edit_post_type( 'post' ) ) {
$create_new_label = esc_html__( 'Create New Post', 'elementor' );
$create_new_post_type = 'post';
}
?>
<div class="e-overview__header">
<?php if ( $show_versions ) { ?>
<div class="e-overview__logo">
<div class="e-logo-wrapper"><i class="eicon-elementor"></i></div>
</div>
<div class="e-overview__versions">
<span class="e-overview__version"><?php echo esc_html__( 'Elementor', 'elementor' ); ?> v<?php echo ELEMENTOR_VERSION; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></span>
<?php
/**
* Elementor dashboard widget after the version.
* Fires after Elementor version display in the dashboard widget.
*
* @since 1.9.0
*/
do_action( 'elementor/admin/dashboard_overview_widget/after_version' );
?>
</div>
<?php } ?>
<?php if ( ! empty( $create_new_post_type ) && $is_create_post_enabled ) { ?>
<div class="e-overview__create">
<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>
</div>
<?php } ?>
</div>
<?php
}
/**
* Displays the Elementor dashboard widget - recently edited section.
* Fired by `elementor_dashboard_overview_widget` function.
*
* @param array $args
* @param bool $show_heading
*
* @return void
* @since 3.12.0
*/
public static function elementor_dashboard_overview_recently_edited( array $args = [], bool $show_heading = true ) {
$recently_edited_query = Utils::get_recently_edited_posts_query( $args );
if ( $recently_edited_query->have_posts() ) { ?>
<div class="e-overview__recently-edited">
<?php if ( $show_heading ) { ?>
<h3 class="e-heading e-divider_bottom"><?php echo esc_html__( 'Recently Edited', 'elementor' ); ?></h3>
<?php } ?>
<ul class="e-overview__posts">
<?php
while ( $recently_edited_query->have_posts() ) {
$recently_edited_query->the_post();
$document = Plugin::$instance->documents->get( get_the_ID() );
$date = date_i18n( _x( 'M jS', 'Dashboard Overview Widget Recently Date', 'elementor' ), get_the_modified_time( 'U' ) );
?>
<li class="e-overview__post">
<a href="<?php echo esc_url( $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_modified_time(); ?></span>
</li>
<?php } ?>
</ul>
</div>
<?php }
}
/**
* Displays the Elementor dashboard widget - news and updates section.
* Fired by `elementor_dashboard_overview_widget` function.
*
* @param int $limit_feed
* @param bool $show_heading
*
* @return void
* @since 3.12.0
* @access public
*/
public static function elementor_dashboard_overview_news_updates( int $limit_feed = 0, bool $show_heading = true ) {
$elementor_feed = Api::get_feed_data();
if ( $limit_feed > 0 ) {
$elementor_feed = array_slice( $elementor_feed, 0, $limit_feed );
}
if ( ! empty( $elementor_feed ) ) { ?>
<div class="e-overview__feed">
<?php if ( $show_heading ) { ?>
<h3 class="e-heading e-divider_bottom"><?php echo esc_html__( 'News & Updates', 'elementor' ); ?></h3>
<?php } ?>
<ul class="e-overview__posts">
<?php foreach ( $elementor_feed as $feed_item ) { ?>
<li class="e-overview__post">
<a href="<?php echo esc_url( $feed_item['url'] ); ?>" class="e-overview__post-link" target="_blank">
<?php if ( ! empty( $feed_item['badge'] ) ) { ?>
<span class="e-overview__badge"><?php echo esc_html( $feed_item['badge'] ); ?></span>
<?php } ?>
<?php echo esc_html( $feed_item['title'] ); ?>
</a>
<p class="e-overview__post-description"><?php echo esc_html( $feed_item['excerpt'] ); ?></p>
</li>
<?php } ?>
</ul>
</div>
<?php }
}
/**
* Displays the Elementor dashboard widget - footer section.
* Fired by `elementor_dashboard_overview_widget` function.
*
* @since 3.12.0
*/
public static function elementor_dashboard_overview_footer() {
?>
<div class="e-overview__footer e-divider_top">
<ul>
<?php foreach ( self::static_get_dashboard_overview_widget_footer_actions() as $action_id => $action ) { ?>
<li class="e-overview__<?php echo esc_attr( $action_id ); ?>">
<a href="<?php echo esc_url( $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>
<?php } ?>
</ul>
</div>
<?php
}
/**
* Get elementor dashboard overview widget footer actions.
*
* Retrieves the footer action links displayed in elementor dashboard widget.
*
* @since 3.12.0
* @access public
*/
public static function static_get_dashboard_overview_widget_footer_actions() {
$base_actions = [
'blog' => [
'title' => esc_html__( 'Blog', 'elementor' ),
'link' => 'https://go.elementor.com/overview-widget-blog/',
],
'help' => [
'title' => esc_html__( 'Help', 'elementor' ),
'link' => 'https://go.elementor.com/overview-widget-docs/',
],
];
$additions_actions = [];
if ( User::get_introduction_meta( 'ai_get_started' ) ) {
$additions_actions['ai-library'] = [
'title' => esc_html__( 'AI Prompts Library', 'elementor' ),
'link' => 'https://go.elementor.com/overview-ai-prompts-library/',
];
} else {
$additions_actions['ai'] = [
'title' => esc_html__( 'Build Smart with AI', 'elementor' ),
'link' => 'https://go.elementor.com/overview-widget-ai/',
];
}
$additions_actions['go-pro'] = [
'title' => esc_html__( 'Upgrade', 'elementor' ),
'link' => 'https://go.elementor.com/go-pro-wp-overview-widget/',
];
/**
* Dashboard widget footer actions.
*
* Filters the additions actions displayed in Elementor dashboard widget.
*
* Developers can add new action links to Elementor dashboard widget
* footer using this filter.
*
* @since 1.9.0
*
* @param array $additions_actions Elementor dashboard widget footer actions.
*/
$additions_actions = apply_filters( 'elementor/admin/dashboard_overview_widget/footer_actions', $additions_actions );
$actions = $base_actions + $additions_actions;
return $actions;
}
/**
* Get elementor dashboard overview widget footer actions.
*
* Retrieves the footer action links displayed in elementor dashboard widget.
*
* @since 1.9.0
* @access private
*/
private function get_dashboard_overview_widget_footer_actions() {
return self::static_get_dashboard_overview_widget_footer_actions();
}
/**
* Admin action new post.
*
* When a new post action is fired the title is set to 'Elementor' and the post ID.
*
* Fired by `admin_action_elementor_new_post` action.
*
* @since 1.9.0
* @access public
*/
public function admin_action_new_post() {
check_admin_referer( 'elementor_action_new_post' );
$post_type = Utils::get_super_global_value( $_GET, 'post_type' ) ?? 'post';
if ( ! User::is_current_user_can_edit_post_type( $post_type ) ) {
return;
}
if ( empty( $_GET['template_type'] ) ) {
$type = 'post';
} else {
$type = sanitize_text_field( wp_unslash( $_GET['template_type'] ) );
}
$post_data = Utils::get_super_global_value( $_GET, 'post_data' ) ?? [];
/**
* Create new post meta data.
*
* Filters the meta data of any new post created.
*
* @since 2.0.0
*
* @param array $meta Post meta data.
*/
$meta = [];
if ( isset( $_GET['meta'] ) && is_array( $_GET['meta'] ) ) {
$meta = array_map( 'sanitize_text_field', wp_unslash( $_GET['meta'] ) );
}
$meta = apply_filters( 'elementor/admin/create_new_post/meta', $meta );
$post_data['post_type'] = $post_type;
$document = Plugin::$instance->documents->create( $type, $post_data, $meta );
if ( is_wp_error( $document ) ) {
wp_die( $document ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
wp_redirect( $document->get_edit_url() );
die;
}
/**
* @since 2.3.0
* @access public
*/
public function add_new_template_template() {
Plugin::$instance->common->add_template( ELEMENTOR_PATH . 'includes/admin-templates/new-template.php' );
}
/**
* @access public
*/
public function enqueue_new_template_scripts() {
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
wp_enqueue_script(
'elementor-new-template',
ELEMENTOR_ASSETS_URL . 'js/new-template' . $suffix . '.js',
[],
ELEMENTOR_VERSION,
true
);
wp_set_script_translations( 'elementor-new-template', 'elementor' );
}
/**
* @since 2.6.0
* @access public
*/
public function add_beta_tester_template() {
Plugin::$instance->common->add_template( ELEMENTOR_PATH . 'includes/admin-templates/beta-tester.php' );
}
/**
* @access public
*/
public function enqueue_beta_tester_scripts() {
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
wp_enqueue_script(
'elementor-beta-tester',
ELEMENTOR_ASSETS_URL . 'js/beta-tester' . $suffix . '.js',
[],
ELEMENTOR_VERSION,
true
);
wp_set_script_translations( 'elementor-beta-tester', 'elementor' );
}
/**
* @access public
*/
public function init_new_template() {
if ( 'edit-elementor_library' !== get_current_screen()->id ) {
return;
}
// Allow plugins to add their templates on admin_head.
add_action( 'admin_head', [ $this, 'add_new_template_template' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_new_template_scripts' ] );
}
public function version_update_warning( $current_version, $new_version ) {
$current_version_minor_part = explode( '.', $current_version )[1];
$new_version_minor_part = explode( '.', $new_version )[1];
if ( $current_version_minor_part === $new_version_minor_part ) {
return;
}
?>
<hr class="e-major-update-warning__separator" />
<div class="e-major-update-warning">
<div class="e-major-update-warning__icon">
<i class="eicon-info-circle"></i>
</div>
<div>
<div class="e-major-update-warning__title">
<?php echo esc_html__( 'Heads up, Please backup before upgrade!', 'elementor' ); ?>
</div>
<div class="e-major-update-warning__message">
<?php
printf(
/* translators: %1$s Link open tag, %2$s: Link close tag. */
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' ),
'<a href="https://go.elementor.com/wp-dash-update-backup/">',
'</a>'
);
?>
</div>
</div>
</div>
<?php
}
/**
* @access public
*/
public function init_beta_tester( $current_screen ) {
if ( ( 'toplevel_page_elementor' === $current_screen->base ) || 'elementor_page_elementor-tools' === $current_screen->id ) {
add_action( 'admin_head', [ $this, 'add_beta_tester_template' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_beta_tester_scripts' ] );
}
}
/**
* Admin constructor.
*
* Initializing Elementor in WordPress admin.
*
* @since 1.0.0
* @access public
*/
public function __construct() {
Plugin::$instance->init_common();
$this->add_component( 'feedback', new Feedback() );
$this->add_component( 'admin-notices', new Admin_Notices() );
add_action( 'admin_init', [ $this, 'maybe_redirect_to_getting_started' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_styles' ] );
add_action( 'edit_form_after_title', [ $this, 'print_switch_mode_button' ] );
add_action( 'save_post', [ $this, 'save_post' ] );
add_filter( 'display_post_states', [ $this, 'add_elementor_post_state' ], 10, 2 );
add_filter( 'plugin_action_links_' . ELEMENTOR_PLUGIN_BASE, [ $this, 'plugin_action_links' ] );
add_filter( 'plugin_row_meta', [ $this, 'plugin_row_meta' ], 10, 2 );
add_filter( 'admin_body_class', [ $this, 'body_status_classes' ] );
add_filter( 'admin_footer_text', [ $this, 'admin_footer_text' ] );
// Register Dashboard Widgets.
add_action( 'wp_dashboard_setup', [ $this, 'register_dashboard_widgets' ] );
// Admin Actions
add_action( 'admin_action_elementor_new_post', [ $this, 'admin_action_new_post' ] );
add_action( 'current_screen', [ $this, 'init_new_template' ] );
add_action( 'current_screen', [ $this, 'init_beta_tester' ] );
add_action( 'in_plugin_update_message-' . ELEMENTOR_PLUGIN_BASE, function( $plugin_data ) {
$this->version_update_warning( ELEMENTOR_VERSION, $plugin_data['new_version'] );
} );
}
/**
* @since 2.3.0
* @access protected
*/
protected function get_init_settings() {
$beta_tester_email = get_user_meta( get_current_user_id(), User::BETA_TESTER_META_KEY, true );
$elementor_beta = get_option( 'elementor_beta', 'no' );
$all_introductions = User::get_introduction_meta();
$beta_tester_signup_dismissed = array_key_exists( Beta_Testers::BETA_TESTER_SIGNUP, $all_introductions );
$settings = [
'home_url' => home_url(),
'settings_url' => Settings::get_url(),
'user' => [
'introduction' => User::get_introduction_meta(),
'restrictions' => Plugin::$instance->role_manager->get_user_restrictions_array(),
'is_administrator' => current_user_can( 'manage_options' ),
],
'beta_tester' => [
'beta_tester_signup' => Beta_Testers::BETA_TESTER_SIGNUP,
'has_email' => $beta_tester_email,
'option_enabled' => 'no' !== $elementor_beta,
'signup_dismissed' => $beta_tester_signup_dismissed,
],
'experiments' => $this->get_experiments(),
];
/**
* Localize settings.
*
* Filters the initial localize settings in the admin.
*
* WordPress has it's own way to pass localized data from PHP (backend) to
* JS (frontend). Elementor uses this method to pass localize data in the
* admin. This hook can be used to add more localized settings in addition
* to the initial Elementor settings.
*
* @since 2.3.0
*
* @param array $settings Initial localize settings.
*/
$settings = apply_filters( 'elementor/admin/localize_settings', $settings );
return $settings;
}
private function get_experiments() {
return ( new Collection( Plugin::$instance->experiments->get_features() ) )
->map( function ( $experiment_data ) {
$dependencies = $experiment_data['dependencies'] ?? [];
$dependencies = ( new Collection( $dependencies ) )
->map( function ( $dependency ) {
return $dependency->get_name();
} )->all();
return [
'name' => $experiment_data['name'],
'title' => $experiment_data['title'] ?? $experiment_data['name'],
'state' => $experiment_data['state'],
'default' => $experiment_data['default'],
'dependencies' => $dependencies,
'messages' => $experiment_data['messages'] ?? [],
];
} )->all();
}
private function maybe_enqueue_hints() {
if ( ! Hints::should_display_hint( 'image-optimization' ) ) {
return;
}
wp_register_script(
'media-hints',
$this->get_js_assets_url( 'media-hints' ),
[],
ELEMENTOR_VERSION,
true
);
$content = sprintf("%1\$s <a class='e-btn-1' href='%2\$s' target='_blank'>%3\$s</a>!",
__( 'Optimize your images to enhance site performance by using Image Optimizer.', 'elementor' ),
Hints::get_plugin_action_url( 'image-optimization' ),
( Hints::is_plugin_installed( 'image-optimization' ) ? __( 'Activate', 'elementor' ) : __( 'Install', 'elementor' ) ) . ' ' . __( 'Image Optimizer', 'elementor' )
);
$dismissible = 'image_optimizer_hint';
wp_localize_script( 'media-hints', 'elementorAdminHints', [
'mediaHint' => [
'display' => true,
'type' => 'info',
'content' => $content,
'icon' => true,
'dismissible' => $dismissible,
'dismiss' => __( 'Dismiss this notice.', 'elementor' ),
'button_event' => $dismissible,
'button_data' => base64_encode(
json_encode( [
'action_url' => Hints::get_plugin_action_url( 'image-optimization' ),
] ),
),
],
] );
wp_enqueue_script( 'media-hints' );
}
}

View File

@@ -1,190 +0,0 @@
<?php
namespace Elementor\Core\Admin;
use Elementor\Api;
use Elementor\Core\Base\Module;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
// TODO: Move this class to pro version for better architecture.
class Canary_Deployment extends Module {
const CURRENT_VERSION = ELEMENTOR_VERSION;
const PLUGIN_BASE = ELEMENTOR_PLUGIN_BASE;
private $canary_deployment_info = null;
/**
* Get module name.
*
* Retrieve the module name.
*
* @since 2.6.0
* @access public
*
* @return string Module name.
*/
public function get_name() {
return 'canary-deployment';
}
/**
* Check version.
*
* @since 2.6.0
* @access public
*
* @param object $transient Plugin updates data.
*
* @return object Plugin updates data.
*/
public function check_version( $transient ) {
// First transient before the real check.
if ( ! isset( $transient->response ) ) {
return $transient;
}
// Placeholder
$stable_version = '0.0.0';
if ( ! empty( $transient->response[ static::PLUGIN_BASE ]->new_version ) ) {
$stable_version = $transient->response[ static::PLUGIN_BASE ]->new_version;
}
if ( null === $this->canary_deployment_info ) {
$this->canary_deployment_info = $this->get_canary_deployment_info();
}
// Can be false - if canary version is not available.
if ( empty( $this->canary_deployment_info ) ) {
return $transient;
}
if ( ! version_compare( $this->canary_deployment_info['new_version'], $stable_version, '>' ) ) {
return $transient;
}
$canary_deployment_info = $this->canary_deployment_info;
// Most of plugin info comes from the $transient but on first check - the response is empty.
if ( ! empty( $transient->response[ static::PLUGIN_BASE ] ) ) {
$canary_deployment_info = array_merge( (array) $transient->response[ static::PLUGIN_BASE ], $canary_deployment_info );
}
$transient->response[ static::PLUGIN_BASE ] = (object) $canary_deployment_info;
return $transient;
}
protected function get_canary_deployment_remote_info( $force ) {
return Api::get_canary_deployment_info( $force );
}
private function get_canary_deployment_info() {
global $pagenow;
$force = 'update-core.php' === $pagenow && isset( $_GET['force-check'] );
$canary_deployment = $this->get_canary_deployment_remote_info( $force );
if ( empty( $canary_deployment['plugin_info']['new_version'] ) ) {
return false;
}
$canary_version = $canary_deployment['plugin_info']['new_version'];
if ( version_compare( $canary_version, static::CURRENT_VERSION, '<=' ) ) {
return false;
}
if ( ! empty( $canary_deployment['conditions'] ) && ! $this->check_conditions( $canary_deployment['conditions'] ) ) {
return false;
}
return $canary_deployment['plugin_info'];
}
private function check_conditions( $groups ) {
foreach ( $groups as $group ) {
if ( $this->check_group( $group ) ) {
return true;
}
}
return false;
}
private function check_group( $group ) {
$is_or_relation = ! empty( $group['relation'] ) && 'OR' === $group['relation'];
unset( $group['relation'] );
$result = false;
foreach ( $group as $condition ) {
// Reset results for each condition.
$result = false;
switch ( $condition['type'] ) {
case 'wordpress': // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
// include an unmodified $wp_version
include ABSPATH . WPINC . '/version.php';
$result = version_compare( $wp_version, $condition['version'], $condition['operator'] );
break;
case 'multisite':
$result = is_multisite() === $condition['multisite'];
break;
case 'language':
$in_array = in_array( get_locale(), $condition['languages'], true );
$result = 'in' === $condition['operator'] ? $in_array : ! $in_array;
break;
case 'plugin':
if ( ! empty( $condition['plugin_file'] ) ) {
$plugin_file = $condition['plugin_file']; // For PHP Unit tests.
} else {
$plugin_file = WP_PLUGIN_DIR . '/' . $condition['plugin']; // Default.
}
$version = '';
if ( is_plugin_active( $condition['plugin'] ) && file_exists( $plugin_file ) ) {
$plugin_data = get_plugin_data( $plugin_file );
if ( isset( $plugin_data['Version'] ) ) {
$version = $plugin_data['Version'];
}
}
$result = version_compare( $version, $condition['version'], $condition['operator'] );
break;
case 'theme':
$theme = wp_get_theme();
if ( wp_get_theme()->parent() ) {
$theme = wp_get_theme()->parent();
}
if ( $theme->get_template() === $condition['theme'] ) {
$version = $theme->version;
} else {
$version = '';
}
$result = version_compare( $version, $condition['version'], $condition['operator'] );
break;
}
if ( ( $is_or_relation && $result ) || ( ! $is_or_relation && ! $result ) ) {
return $result;
}
}
return $result;
}
/**
* @since 2.6.0
* @access public
*/
public function __construct() {
add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_version' ] );
}
}

View File

@@ -1,192 +0,0 @@
<?php
namespace Elementor\Core\Admin;
use Elementor\Api;
use Elementor\Core\Base\Module;
use Elementor\Plugin;
use Elementor\Tracker;
use Elementor\Utils;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Feedback extends Module {
/**
* @since 2.2.0
* @access public
*/
public function __construct() {
add_action( 'current_screen', function () {
if ( ! $this->is_plugins_screen() ) {
return;
}
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_feedback_dialog_scripts' ] );
} );
// Ajax.
add_action( 'wp_ajax_elementor_deactivate_feedback', [ $this, 'ajax_elementor_deactivate_feedback' ] );
}
/**
* Get module name.
*
* Retrieve the module name.
*
* @since 1.7.0
* @access public
*
* @return string Module name.
*/
public function get_name() {
return 'feedback';
}
/**
* Enqueue feedback dialog scripts.
*
* Registers the feedback dialog scripts and enqueues them.
*
* @since 1.0.0
* @access public
*/
public function enqueue_feedback_dialog_scripts() {
add_action( 'admin_footer', [ $this, 'print_deactivate_feedback_dialog' ] );
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
wp_register_script(
'elementor-admin-feedback',
ELEMENTOR_ASSETS_URL . 'js/admin-feedback' . $suffix . '.js',
[
'elementor-common',
'wp-i18n',
],
ELEMENTOR_VERSION,
true
);
wp_enqueue_script( 'elementor-admin-feedback' );
wp_set_script_translations( 'elementor-admin-feedback', 'elementor' );
}
/**
* @since 2.3.0
* @deprecated 3.1.0
*/
public function localize_feedback_dialog_settings() {
Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.1.0' );
return [];
}
/**
* Print deactivate feedback dialog.
*
* Display a dialog box to ask the user why he deactivated Elementor.
*
* Fired by `admin_footer` filter.
*
* @since 1.0.0
* @access public
*/
public function print_deactivate_feedback_dialog() {
$deactivate_reasons = [
'no_longer_needed' => [
'title' => esc_html__( 'I no longer need the plugin', 'elementor' ),
'input_placeholder' => '',
],
'found_a_better_plugin' => [
'title' => esc_html__( 'I found a better plugin', 'elementor' ),
'input_placeholder' => esc_html__( 'Please share which plugin', 'elementor' ),
],
'couldnt_get_the_plugin_to_work' => [
'title' => esc_html__( 'I couldn\'t get the plugin to work', 'elementor' ),
'input_placeholder' => '',
],
'temporary_deactivation' => [
'title' => esc_html__( 'It\'s a temporary deactivation', 'elementor' ),
'input_placeholder' => '',
],
'elementor_pro' => [
'title' => esc_html__( 'I have Elementor Pro', 'elementor' ),
'input_placeholder' => '',
'alert' => esc_html__( 'Wait! Don\'t deactivate Elementor. You have to activate both Elementor and Elementor Pro in order for the plugin to work.', 'elementor' ),
],
'other' => [
'title' => esc_html__( 'Other', 'elementor' ),
'input_placeholder' => esc_html__( 'Please share the reason', 'elementor' ),
],
];
?>
<div id="elementor-deactivate-feedback-dialog-wrapper">
<div id="elementor-deactivate-feedback-dialog-header">
<i class="eicon-elementor-square" aria-hidden="true"></i>
<span id="elementor-deactivate-feedback-dialog-header-title"><?php echo esc_html__( 'Quick Feedback', 'elementor' ); ?></span>
</div>
<form id="elementor-deactivate-feedback-dialog-form" method="post">
<?php
wp_nonce_field( '_elementor_deactivate_feedback_nonce' );
?>
<input type="hidden" name="action" value="elementor_deactivate_feedback" />
<div id="elementor-deactivate-feedback-dialog-form-caption"><?php echo esc_html__( 'If you have a moment, please share why you are deactivating Elementor:', 'elementor' ); ?></div>
<div id="elementor-deactivate-feedback-dialog-form-body">
<?php foreach ( $deactivate_reasons as $reason_key => $reason ) : ?>
<div class="elementor-deactivate-feedback-dialog-input-wrapper">
<input id="elementor-deactivate-feedback-<?php echo esc_attr( $reason_key ); ?>" class="elementor-deactivate-feedback-dialog-input" type="radio" name="reason_key" value="<?php echo esc_attr( $reason_key ); ?>" />
<label for="elementor-deactivate-feedback-<?php echo esc_attr( $reason_key ); ?>" class="elementor-deactivate-feedback-dialog-label"><?php echo esc_html( $reason['title'] ); ?></label>
<?php if ( ! empty( $reason['input_placeholder'] ) ) : ?>
<input class="elementor-feedback-text" type="text" name="reason_<?php echo esc_attr( $reason_key ); ?>" placeholder="<?php echo esc_attr( $reason['input_placeholder'] ); ?>" />
<?php endif; ?>
<?php if ( ! empty( $reason['alert'] ) ) : ?>
<div class="elementor-feedback-text"><?php echo esc_html( $reason['alert'] ); ?></div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
</form>
</div>
<?php
}
/**
* Ajax elementor deactivate feedback.
*
* Send the user feedback when Elementor is deactivated.
*
* Fired by `wp_ajax_elementor_deactivate_feedback` action.
*
* @since 1.0.0
* @access public
*/
public function ajax_elementor_deactivate_feedback() {
$wpnonce = Utils::get_super_global_value( $_POST, '_wpnonce' ); // phpcs:ignore -- Nonce verification is made in `wp_verify_nonce()`.
if ( ! wp_verify_nonce( $wpnonce, '_elementor_deactivate_feedback_nonce' ) ) {
wp_send_json_error();
}
if ( ! current_user_can( 'activate_plugins' ) ) {
wp_send_json_error( 'Permission denied' );
}
$reason_key = Utils::get_super_global_value( $_POST, 'reason_key' ) ?? '';
$reason_text = Utils::get_super_global_value( $_POST, "reason_{$reason_key}" ) ?? '';
Api::send_feedback( $reason_key, $reason_text );
wp_send_json_success();
}
/**
* @since 2.3.0
* @access private
*/
private function is_plugins_screen() {
return in_array( get_current_screen()->id, [ 'plugins', 'plugins-network' ] );
}
}

View File

@@ -1,118 +0,0 @@
<?php
namespace Elementor\Core\Admin\Menu;
use Elementor\Core\Admin\Menu\Interfaces\Admin_Menu_Item;
use Elementor\Core\Admin\Menu\Interfaces\Admin_Menu_Item_Has_Position;
use Elementor\Core\Admin\Menu\Interfaces\Admin_Menu_Item_With_Page;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
class Admin_Menu_Manager {
/**
* @var Admin_Menu_Item[]
*/
private $items = [];
public function register( $item_slug, Admin_Menu_Item $item ) {
$this->items[ $item_slug ] = $item;
}
public function unregister( $item_slug ) {
unset( $this->items[ $item_slug ] );
}
public function get( $item_slug ) {
if ( empty( $this->items[ $item_slug ] ) ) {
return null;
}
return $this->items[ $item_slug ];
}
public function get_all() {
return $this->items;
}
public function register_actions() {
add_action( 'admin_menu', function () {
$this->register_wp_menus();
}, 20 );
add_action( 'admin_head', function () {
$this->hide_invisible_menus();
} );
}
private function register_wp_menus() {
do_action( 'elementor/admin/menu/register', $this );
$hooks = [];
foreach ( $this->get_all() as $item_slug => $item ) {
$is_top_level = empty( $item->get_parent_slug() );
if ( $is_top_level ) {
$hooks[ $item_slug ] = $this->register_top_level_menu( $item_slug, $item );
} else {
$hooks[ $item_slug ] = $this->register_sub_menu( $item_slug, $item );
}
}
do_action( 'elementor/admin/menu/after_register', $this, $hooks );
}
private function register_top_level_menu( $item_slug, Admin_Menu_Item $item ) {
$has_page = ( $item instanceof Admin_Menu_Item_With_Page );
$has_position = ( $item instanceof Admin_Menu_Item_Has_Position );
$page_title = $has_page ? $item->get_page_title() : '';
$callback = $has_page ? [ $item, 'render' ] : '';
$position = $has_position ? $item->get_position() : null;
return add_menu_page(
$page_title,
$item->get_label(),
$item->get_capability(),
$item_slug,
$callback,
'',
$position
);
}
private function register_sub_menu( $item_slug, Admin_Menu_Item $item ) {
$has_page = ( $item instanceof Admin_Menu_Item_With_Page );
$page_title = $has_page ? $item->get_page_title() : '';
$callback = $has_page ? [ $item, 'render' ] : '';
return add_submenu_page(
$item->get_parent_slug(),
$page_title,
$item->get_label(),
$item->get_capability(),
$item_slug,
$callback
);
}
private function hide_invisible_menus() {
foreach ( $this->get_all() as $item_slug => $item ) {
if ( $item->is_visible() ) {
continue;
}
$is_top_level = empty( $item->get_parent_slug() );
if ( $is_top_level ) {
remove_menu_page( $item_slug );
} else {
remove_submenu_page( $item->get_parent_slug(), $item_slug );
}
}
}
}

View File

@@ -1,152 +0,0 @@
<?php
namespace Elementor\Core\Admin\Menu;
use Elementor\Core\Base\Base_Object;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
abstract class Base extends Base_Object {
private $args;
private $options;
private $submenus = [];
abstract protected function get_init_args();
public function __construct() {
$this->init_args();
$this->init_options();
add_action( 'admin_menu', function() {
$this->register();
} );
if ( $this->options['separator'] ) {
add_action( 'admin_menu', function() {
$this->add_menu_separator();
} );
add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', function( $menu_order ) {
return $this->rearrange_menu_separator( $menu_order );
} );
}
}
public function get_args( $arg = null ) {
return self::get_items( $this->args, $arg );
}
public function add_submenu( $submenu_args ) {
$default_submenu_args = [
'page_title' => '',
'capability' => $this->args['capability'],
'function' => null,
'index' => null,
];
$this->submenus[] = array_merge( $default_submenu_args, $submenu_args );
}
protected function get_init_options() {
return [];
}
protected function register_default_submenus() {}
protected function register() {
$args = $this->args;
add_menu_page( $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['function'], $args['icon_url'], $args['position'] );
$this->register_default_submenus();
do_action( 'elementor/admin/menu_registered/' . $args['menu_slug'], $this );
usort( $this->submenus, function( $a, $b ) {
return $a['index'] - $b['index'];
} );
foreach ( $this->submenus as $index => $submenu_item ) {
$submenu_args = [
$args['menu_slug'],
$submenu_item['page_title'],
$submenu_item['menu_title'],
$submenu_item['capability'],
$submenu_item['menu_slug'],
$submenu_item['function'],
];
if ( 0 === $submenu_item['index'] ) {
$submenu_args[] = 0;
}
add_submenu_page( ...$submenu_args );
if ( ! empty( $submenu_item['class'] ) ) {
global $submenu;
$submenu[ $args['menu_slug'] ][ $index + 1 ][4] = $submenu_item['class']; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
}
}
}
private function init_args() {
$default_args = [
'function' => null,
'icon_url' => null,
'position' => null,
];
$this->args = array_merge( $default_args, $this->get_init_args() );
}
private function init_options() {
$default_options = [
'separator' => false,
];
$this->options = array_merge( $default_options, $this->get_init_options() );
}
private function add_menu_separator() {
global $menu;
$slug = $this->args['menu_slug'];
$menu[] = [ '', 'read', 'separator-' . $slug, '', 'wp-menu-separator ' . $slug ]; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
}
private function rearrange_menu_separator( $menu_order ) {
// Initialize our custom order array.
$custom_menu_order = [];
$slug = $this->args['menu_slug'];
$separator_name = 'separator-' . $slug;
// Get the index of our custom separator.
$custom_separator = array_search( $separator_name, $menu_order, true );
// Loop through menu order and do some rearranging.
foreach ( $menu_order as $item ) {
if ( $slug === $item ) {
$custom_menu_order[] = $separator_name;
$custom_menu_order[] = $item;
unset( $menu_order[ $custom_separator ] );
} elseif ( $separator_name !== $item ) {
$custom_menu_order[] = $item;
}
}
// Return order.
return $custom_menu_order;
}
}

View File

@@ -1,11 +0,0 @@
<?php
namespace Elementor\Core\Admin\Menu\Interfaces;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
interface Admin_Menu_Item_Has_Position {
public function get_position();
}

View File

@@ -1,13 +0,0 @@
<?php
namespace Elementor\Core\Admin\Menu\Interfaces;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
interface Admin_Menu_Item_With_Page extends Admin_Menu_Item {
public function get_page_title();
public function render();
}

View File

@@ -1,17 +0,0 @@
<?php
namespace Elementor\Core\Admin\Menu\Interfaces;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
interface Admin_Menu_Item {
public function get_capability();
public function get_label();
public function get_parent_slug();
public function is_visible();
}

View File

@@ -1,79 +0,0 @@
<?php
namespace Elementor\Core\Admin\Menu;
use Elementor\Plugin;
use Elementor\TemplateLibrary\Source_Local;
use Elementor\Tools;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
class Main extends Base {
protected function get_init_args() {
return [
'page_title' => esc_html__( 'Elementor', 'elementor' ),
'menu_title' => esc_html__( 'Elementor', 'elementor' ),
'capability' => 'manage_options',
'menu_slug' => 'elementor',
'function' => [ Plugin::$instance->settings, 'display_settings_page' ],
'position' => 58.5,
];
}
protected function get_init_options() {
return [
'separator' => true,
];
}
protected function register_default_submenus() {
$this->add_submenu( [
'page_title' => esc_html_x( 'Templates', 'Template Library', 'elementor' ),
'menu_title' => esc_html_x( 'Templates', 'Template Library', 'elementor' ),
'menu_slug' => Source_Local::ADMIN_MENU_SLUG,
'index' => 0,
] );
$this->add_submenu( [
'menu_title' => esc_html__( 'Help', 'elementor' ),
'menu_slug' => 'go_knowledge_base_site',
'function' => [ Plugin::$instance->settings, 'handle_external_redirects' ],
'index' => 150,
] );
}
protected function register() {
parent::register();
$this->rearrange_elementor_submenu();
}
private function rearrange_elementor_submenu() {
global $submenu;
$elementor_menu_slug = $this->get_args( 'menu_slug' );
$elementor_submenu_old_index = null;
$tools_submenu_index = null;
foreach ( $submenu[ $elementor_menu_slug ] as $index => $submenu_item ) {
if ( $elementor_menu_slug === $submenu_item[2] ) {
$elementor_submenu_old_index = $index;
} elseif ( Tools::PAGE_ID === $submenu_item[2] ) {
$tools_submenu_index = $index;
break;
}
}
$elementor_submenu = array_splice( $submenu[ $elementor_menu_slug ], $elementor_submenu_old_index, 1 );
$elementor_submenu[0][0] = esc_html__( 'Settings', 'elementor' );
array_splice( $submenu[ $elementor_menu_slug ], $tools_submenu_index, 0, $elementor_submenu );
}
}

View File

@@ -1,25 +0,0 @@
<?php
namespace Elementor\Core\Admin\Notices;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
abstract class Base_Notice {
/**
* Determine if the notice should be printed or not.
*
* @return boolean
*/
abstract public function should_print();
/**
* Returns the config of the notice itself.
* based on that config the notice will be printed.
*
* @see \Elementor\Core\Admin\Admin_Notices::admin_notices
*
* @return array
*/
abstract public function get_config();
}

View File

@@ -1,170 +0,0 @@
<?php
namespace Elementor\Core\Admin\Notices;
use Elementor\User;
use Elementor\Settings;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Elementor_Dev_Notice extends Base_Notice {
/**
* Notice ID.
*/
const ID = 'elementor_dev_promote';
/**
* Plugin slug to install.
*/
const PLUGIN_SLUG = 'elementor-beta';
/**
* Plugin name.
*/
const PLUGIN_NAME = 'elementor-beta/elementor-beta.php';
/**
* Holds the plugins names.
*
* @var array
*/
private $plugins = [];
/**
* If one of those plugin is installed it will show the notice.
*
* @var string[]
*/
private $promotion_plugins = [
'woocommerce-beta-tester/woocommerce-beta-tester.php',
'wp-jquery-update-test/wp-jquery-update-test.php',
'wordpress-beta-tester/wp-beta-tester.php',
'gutenberg/gutenberg.php',
];
/**
* If one of those options is enabled it will show the notice.
*
* @var string[]
*/
private $promotion_options = [
'elementor_beta',
];
/**
* @inheritDoc
*/
public function should_print() {
return current_user_can( 'install_plugins' ) &&
! User::is_user_notice_viewed( static::ID ) &&
! $this->is_elementor_dev_installed() &&
! $this->is_install_screen() &&
(
$this->is_promotion_plugins_installed() ||
$this->is_promotion_options_enabled()
);
}
/**
* @inheritDoc
*/
public function get_config() {
return [
'id' => static::ID,
'title' => esc_html__( 'Elementor Developer Edition', 'elementor' ),
'description' => __(
'Get a sneak peek at our in progress development versions, and help us improve Elementor to perfection. Developer Edition releases contain experimental functionality for testing purposes.',
'elementor'
),
'button' => [
'text' => esc_html__( 'Install & Activate', 'elementor' ),
'url' => wp_nonce_url(
self_admin_url( 'update.php?action=install-plugin&plugin=' . static::PLUGIN_SLUG ),
'install-plugin_' . static::PLUGIN_SLUG
),
'type' => 'cta',
],
];
}
/**
* Return all the plugins names.
*
* This method is protected so it can be mocked in tests.
*
* @return array
*/
protected function get_plugins() {
if ( ! $this->plugins ) {
$this->plugins = array_keys( get_plugins() );
}
return $this->plugins;
}
/**
* Checks if elementor dev is installed
*
* @return bool
*/
private function is_elementor_dev_installed() {
return in_array( static::PLUGIN_NAME, $this->get_plugins(), true );
}
/**
* Checks if the admin screen is install screen.
*
* @return bool
*/
private function is_install_screen() {
$screen = get_current_screen();
if ( ! $screen ) {
return false;
}
return 'update' === $screen->id;
}
/**
* Checks if is one of the promotion plugins is installed
*
* @return bool
*/
private function is_promotion_plugins_installed() {
return array_reduce( $this->promotion_plugins, function ( $should_show_notice, $plugin_name ) {
if ( $should_show_notice ) {
return true;
}
return in_array( $plugin_name, $this->get_plugins(), true );
}, false );
}
/**
* Checks if is one of the promotion options is enabled.
*
* @return bool
*/
private function is_promotion_options_enabled() {
return array_reduce( $this->promotion_options, function ( $should_show_notice, $option ) {
if ( $should_show_notice ) {
return true;
}
return 'yes' === get_option( $option, 'no' );
}, false );
}
/**
* Checks if the current page is elementor settings page
*
* @return bool
*/
private function is_elementor_setting_page() {
$current_screen = get_current_screen();
return $current_screen && 'toplevel_page_' . Settings::PAGE_ID === $current_screen->id;
}
}

View File

@@ -1,106 +0,0 @@
<?php
namespace Elementor\Core\Admin\UI\Components;
use Elementor\Core\Base\Base_Object;
use Elementor\Utils;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Button extends Base_Object {
private $options;
/**
* @inheritDoc
*/
public function get_name() {
return 'admin-button';
}
public function print_button() {
$options = $this->get_options();
if ( empty( $options['text'] ) ) {
return;
}
$html_tag = ! empty( $options['url'] ) ? 'a' : 'button';
$before = '';
$icon = '';
$attributes = [];
if ( ! empty( $options['icon'] ) ) {
$icon = '<i class="' . esc_attr( $options['icon'] ) . '"></i>';
}
$classes = $options['classes'];
$default_classes = $this->get_default_options( 'classes' );
$classes = array_merge( $classes, $default_classes );
if ( ! empty( $options['type'] ) ) {
$classes[] = 'e-button--' . $options['type'];
}
if ( ! empty( $options['variant'] ) ) {
$classes[] = 'e-button--' . $options['variant'];
}
if ( ! empty( $options['before'] ) ) {
$before = '<span>' . wp_kses_post( $options['before'] ) . '</span>';
}
if ( ! empty( $options['url'] ) ) {
$attributes['href'] = $options['url'];
if ( $options['new_tab'] ) {
$attributes['target'] = '_blank';
}
}
$attributes['class'] = $classes;
$html = $before . '<' . $html_tag . ' ' . Utils::render_html_attributes( $attributes ) . '>';
$html .= $icon;
$html .= '<span>' . sanitize_text_field( $options['text'] ) . '</span>';
$html .= '</' . $html_tag . '>';
echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* @param string $option Optional default is null
* @return array|mixed
*/
private function get_options( $option = null ) {
return $this->get_items( $this->options, $option );
}
/**
* @param null $option
* @return array
*/
private function get_default_options( $option = null ) {
$default_options = [
'classes' => [ 'e-button' ],
'icon' => '',
'new_tab' => false,
'text' => '',
'type' => '',
'url' => '',
'variant' => '',
'before' => '',
];
if ( null !== $option && -1 !== in_array( $option, $default_options ) ) {
return $default_options[ $option ];
}
return $default_options;
}
public function __construct( array $options ) {
$this->options = $this->merge_properties( $this->get_default_options(), $options );
}
}