first commit
This commit is contained in:
924
wp-content/plugins/elementor/core/admin/admin-notices.php
Normal file
924
wp-content/plugins/elementor/core/admin/admin-notices.php
Normal file
@@ -0,0 +1,924 @@
|
||||
<?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;
|
||||
|
||||
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',
|
||||
'tracker_last_update',
|
||||
'rate_us_feedback',
|
||||
'role_manager_promote',
|
||||
'experiment_promotion',
|
||||
'send_app_promotion',
|
||||
'site_mailer_promotion',
|
||||
'plugin_image_optimization',
|
||||
'ally_pages_promotion',
|
||||
];
|
||||
|
||||
private $elementor_pages_count = null;
|
||||
|
||||
private $install_time = null;
|
||||
|
||||
private $current_screen_id = null;
|
||||
|
||||
private function get_notices() {
|
||||
/**
|
||||
* 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', [] );
|
||||
|
||||
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 ( ! $this->is_elementor_admin_screen_with_system_info() ) {
|
||||
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 . '§ion=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 ( ! $this->is_elementor_admin_screen_with_system_info() ) {
|
||||
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 helping us understand how you use our service to enhance your experience and improve our product.', '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__( 'Want to shape the future of web creation?', 'elementor' ),
|
||||
'description' => $message,
|
||||
'dismissible' => false,
|
||||
'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_tracker_last_update() {
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! Tracker::has_terms_changed() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$notice_id = 'tracker_last_update_' . Tracker::LAST_TERMS_UPDATED;
|
||||
|
||||
if ( User::is_user_notice_viewed( $notice_id ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
|
||||
|
||||
$message = esc_html__( 'We\'re updating our Terms and Conditions to include the collection of usage and behavioral data. This information helps us understand how you use Elementor so we can make informed improvements to the product.', 'elementor' );
|
||||
|
||||
$options = [
|
||||
'id' => $notice_id,
|
||||
'title' => esc_html__( 'Update regarding usage data collection', 'elementor' ),
|
||||
'description' => $message,
|
||||
'button' => [
|
||||
'text' => esc_html__( 'Opt in', 'elementor' ),
|
||||
'url' => $optin_url,
|
||||
'type' => 'cta',
|
||||
],
|
||||
'button_secondary' => [
|
||||
'text' => esc_html__( 'Learn more', 'elementor' ),
|
||||
'url' => 'https://go.elementor.com/wp-dash-update-usage-notice/',
|
||||
'new_tab' => true,
|
||||
'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 ),
|
||||
'_wpnonce' => wp_create_nonce( 'elementor_set_admin_notice_viewed' ),
|
||||
], 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( 'e_element_cache' ) &&
|
||||
$experiments->is_feature_active( 'e_font_icon_svg' )
|
||||
);
|
||||
|
||||
if ( $is_all_performance_features_active ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$options = [
|
||||
'title' => esc_html__( 'Improve your site’s 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 site_has_forms_plugins() {
|
||||
return defined( 'WPFORMS_VERSION' ) || defined( 'WPCF7_VERSION' ) || defined( 'FLUENTFORM_VERSION' ) || class_exists( '\GFCommon' ) || class_exists( '\Ninja_Forms' ) || function_exists( 'load_formidable_forms' ) || did_action( 'metform/after_load' ) || defined( 'FORMINATOR_PLUGIN_BASENAME' );
|
||||
}
|
||||
|
||||
private function site_has_woocommerce() {
|
||||
return class_exists( 'WooCommerce' );
|
||||
}
|
||||
|
||||
private function get_installed_form_plugin_name() {
|
||||
static $detected_form_plugin = null;
|
||||
|
||||
if ( null !== $detected_form_plugin ) {
|
||||
return $detected_form_plugin;
|
||||
}
|
||||
|
||||
$form_plugins_constants_to_name_mapper = [
|
||||
'WPFORMS_VERSION' => 'WPForms',
|
||||
'WPCF7_VERSION' => 'Contact Form 7',
|
||||
];
|
||||
|
||||
foreach ( $form_plugins_constants_to_name_mapper as $constant => $name ) {
|
||||
if ( defined( $constant ) ) {
|
||||
$detected_form_plugin = $name;
|
||||
return $detected_form_plugin;
|
||||
}
|
||||
}
|
||||
|
||||
$form_plugins_classes_to_name_mapper = [
|
||||
'\GFCommon' => 'Gravity Forms',
|
||||
'\Ninja_Forms' => 'Ninja Forms',
|
||||
];
|
||||
|
||||
foreach ( $form_plugins_classes_to_name_mapper as $class => $name ) {
|
||||
if ( class_exists( $class ) ) {
|
||||
$detected_form_plugin = $name;
|
||||
return $detected_form_plugin;
|
||||
}
|
||||
}
|
||||
|
||||
$detected_form_plugin = false;
|
||||
return $detected_form_plugin;
|
||||
}
|
||||
|
||||
private function notice_send_app_promotion() {
|
||||
$notice_id = 'send_app_promotion';
|
||||
|
||||
if ( ! $this->is_elementor_page() && ! $this->is_elementor_admin_screen() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( time() < $this->get_install_time() + ( 60 * DAY_IN_SECONDS ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! current_user_can( 'install_plugins' ) || User::is_user_notice_viewed( $notice_id ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$form_plugin_name = $this->get_installed_form_plugin_name();
|
||||
|
||||
if ( ! $form_plugin_name ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$plugin_file_path = 'send/send-app.php';
|
||||
$plugin_slug = 'send-app';
|
||||
|
||||
$cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
|
||||
if ( empty( $cta_data ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$title = sprintf(
|
||||
/* translators: %s: Form plugin name */
|
||||
esc_html__( 'Turn %s leads into loyal shoppers', 'elementor' ),
|
||||
$form_plugin_name
|
||||
);
|
||||
|
||||
$options = [
|
||||
'title' => $title,
|
||||
'description' => esc_html__( 'Collecting leads is just the beginning. With Send by Elementor, you can manage contacts, launch automations, and turn form submissions into sales.', 'elementor' ),
|
||||
'id' => $notice_id,
|
||||
'type' => 'cta',
|
||||
'button' => [
|
||||
'text' => $cta_data['text'],
|
||||
'url' => $cta_data['url'],
|
||||
'type' => 'cta',
|
||||
],
|
||||
'button_secondary' => [
|
||||
'text' => esc_html__( 'Learn more', 'elementor' ),
|
||||
'url' => 'https://go.elementor.com/Formslearnmore',
|
||||
'new_tab' => true,
|
||||
'type' => 'cta',
|
||||
],
|
||||
];
|
||||
|
||||
$this->print_admin_notice( $options );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function notice_ally_pages_promotion() {
|
||||
global $pagenow;
|
||||
$notice_id = 'ally_pages_promotion';
|
||||
|
||||
if ( 'edit.php' !== $pagenow || empty( $_GET['post_type'] ) || 'page' !== $_GET['post_type'] ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$plugin_file_path = 'pojo-accessibility/pojo-accessibility.php';
|
||||
$plugin_slug = 'pojo-accessibility';
|
||||
|
||||
$cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
|
||||
if ( empty( $cta_data ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$options = [
|
||||
'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
|
||||
'description' => esc_html__( 'Create a more inclusive site experience for all your visitors. With Ally, it\'s easy to add your statement page in just a few clicks.', 'elementor' ),
|
||||
'id' => $notice_id,
|
||||
'type' => 'cta',
|
||||
'button' => [
|
||||
'text' => $cta_data['text'],
|
||||
'url' => self::add_plg_campaign_data( $cta_data['url'], [
|
||||
'name' => 'elementor_ea11y_campaign',
|
||||
'campaign' => 'acc-statement-plg-pages',
|
||||
'source' => 'wp-pages',
|
||||
'medium' => 'wp-dash',
|
||||
] ),
|
||||
'type' => 'cta',
|
||||
],
|
||||
'button_secondary' => [
|
||||
'text' => esc_html__( 'Learn more', 'elementor' ),
|
||||
'url' => 'https://go.elementor.com/acc-plg-learn-more',
|
||||
'new_tab' => true,
|
||||
'type' => 'cta',
|
||||
],
|
||||
];
|
||||
|
||||
$this->print_admin_notice( $options );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function notice_site_mailer_promotion() {
|
||||
$notice_id = 'site_mailer_promotion';
|
||||
$has_forms = $this->site_has_forms_plugins();
|
||||
$has_woocommerce = $this->site_has_woocommerce();
|
||||
|
||||
if ( ! $has_forms && ! $has_woocommerce ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! $this->is_elementor_page() && ! $this->is_elementor_admin_screen() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ( Utils::has_pro() && ! $has_woocommerce ) || ! current_user_can( 'install_plugins' ) || User::is_user_notice_viewed( $notice_id ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$plugin_file_path = 'site-mailer/site-mailer.php';
|
||||
$plugin_slug = 'site-mailer';
|
||||
|
||||
$cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
|
||||
if ( empty( $cta_data ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$options = [
|
||||
'title' => esc_html__( 'Ensure your form emails avoid the spam folder!', 'elementor' ),
|
||||
'description' => esc_html__( 'Use Site Mailer for improved email deliverability, detailed email logs, and an easy setup.', 'elementor' ),
|
||||
'id' => $notice_id,
|
||||
'type' => 'cta',
|
||||
'button' => [
|
||||
'text' => $cta_data['text'],
|
||||
'url' => $cta_data['url'],
|
||||
'type' => 'cta',
|
||||
],
|
||||
'button_secondary' => [
|
||||
'text' => esc_html__( 'Learn more', 'elementor' ),
|
||||
'url' => 'https://go.elementor.com/sm-core-form/',
|
||||
'new_tab' => true,
|
||||
'type' => 'cta',
|
||||
],
|
||||
];
|
||||
|
||||
if ( $this->should_render_woocommerce_hint( $has_forms, $has_woocommerce ) ) {
|
||||
// We include WP's default notice class so it will be properly handled by WP's js handler
|
||||
// And add a new one to distinguish between the two types of notices
|
||||
$options['classes'] = [ 'notice', 'e-notice', 'sm-notice-wc' ];
|
||||
$options['title'] = esc_html__( 'Improve Transactional Email Deliverability', 'elementor' );
|
||||
$options['description'] = esc_html__( 'Use Elementor\'s Site Mailer to ensure your store emails like purchase confirmations, shipping updates and more are reliably delivered.', 'elementor' );
|
||||
}
|
||||
|
||||
$this->print_admin_notice( $options );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function should_render_woocommerce_hint( $has_forms, $has_woocommerce ): bool {
|
||||
if ( ! $has_forms && ! $has_woocommerce ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! $has_forms && $has_woocommerce ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( $has_forms && $has_woocommerce && Utils::has_pro() ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( ! $has_woocommerce ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (bool) wp_rand( 0, 1 );
|
||||
}
|
||||
|
||||
private function is_elementor_page(): bool {
|
||||
return 0 === strpos( $this->current_screen_id, 'elementor_page' );
|
||||
}
|
||||
|
||||
private function is_elementor_admin_screen(): bool {
|
||||
return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'dashboard' ], true );
|
||||
}
|
||||
|
||||
private function is_elementor_admin_screen_with_system_info(): bool {
|
||||
return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true );
|
||||
}
|
||||
|
||||
private function get_plugin_cta_data( $plugin_slug, $plugin_file_path ) {
|
||||
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&plugin=' . $plugin_file_path . '&plugin_status=all&paged=1&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' );
|
||||
}
|
||||
|
||||
return [
|
||||
'url' => $url,
|
||||
'text' => $cta_text,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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';
|
||||
|
||||
$cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
|
||||
|
||||
if ( empty( $cta_data ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$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_data['text'],
|
||||
'url' => $cta_data['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'];
|
||||
}
|
||||
|
||||
$wrapper_attributes = [];
|
||||
|
||||
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>';
|
||||
|
||||
$wrapper_attributes['data-nonce'] = wp_create_nonce( 'elementor_set_admin_notice_viewed' );
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public function maybe_log_campaign() {
|
||||
if ( empty( $_GET['plg_campaign'] ) || empty( $_GET['plg_campaign_name'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$allowed_plgs = [
|
||||
'elementor_image_optimization_campaign',
|
||||
'elementor_ea11y_campaign',
|
||||
'elementor_site_mailer_campaign',
|
||||
];
|
||||
|
||||
if ( ! in_array( $_GET['plg_campaign_name'], $allowed_plgs, true ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! isset( $_GET['plg_campaign_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['plg_campaign_nonce'] ), sanitize_key( $_GET['plg_campaign_name'] ) ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( empty( $_GET['plg_source'] ) || empty( $_GET['plg_medium'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$campaign_data = [
|
||||
'source' => sanitize_key( $_GET['plg_source'] ),
|
||||
'campaign' => sanitize_key( $_GET['plg_campaign'] ),
|
||||
'medium' => sanitize_key( $_GET['plg_medium'] ),
|
||||
];
|
||||
|
||||
set_transient( sanitize_key( $_GET['plg_campaign_name'] ), $campaign_data, 30 * DAY_IN_SECONDS );
|
||||
}
|
||||
|
||||
private static function add_plg_campaign_data( $url, $campaign_data ) {
|
||||
|
||||
foreach ( [ 'name', 'campaign' ] as $key ) {
|
||||
if ( empty( $campaign_data[ $key ] ) ) {
|
||||
return $url;
|
||||
}
|
||||
}
|
||||
|
||||
return add_query_arg( [
|
||||
'plg_campaign_name' => $campaign_data['name'],
|
||||
'plg_campaign' => $campaign_data['campaign'],
|
||||
'plg_source' => empty( $campaign_data['source'] ) ? '' : $campaign_data['source'],
|
||||
'plg_medium' => empty( $campaign_data['medium'] ) ? '' : $campaign_data['medium'],
|
||||
'plg_campaign_nonce' => wp_create_nonce( $campaign_data['name'] ),
|
||||
], $url );
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.9.0
|
||||
* @access public
|
||||
*/
|
||||
public function __construct() {
|
||||
add_action( 'admin_notices', [ $this, 'admin_notices' ], 20 );
|
||||
add_action( 'admin_action_install-plugin', [ $this, 'maybe_log_campaign' ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module name.
|
||||
*
|
||||
* Retrieve the module name.
|
||||
*
|
||||
* @since 2.9.0
|
||||
* @access public
|
||||
*
|
||||
* @return string Module name.
|
||||
*/
|
||||
public function get_name() {
|
||||
return 'admin-notices';
|
||||
}
|
||||
}
|
||||
1089
wp-content/plugins/elementor/core/admin/admin.php
Normal file
1089
wp-content/plugins/elementor/core/admin/admin.php
Normal file
File diff suppressed because it is too large
Load Diff
192
wp-content/plugins/elementor/core/admin/canary-deployment.php
Normal file
192
wp-content/plugins/elementor/core/admin/canary-deployment.php
Normal file
@@ -0,0 +1,192 @@
|
||||
<?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' ] );
|
||||
}
|
||||
}
|
||||
182
wp-content/plugins/elementor/core/admin/feedback.php
Normal file
182
wp-content/plugins/elementor/core/admin/feedback.php
Normal file
@@ -0,0 +1,182 @@
|
||||
<?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 = Utils::is_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' );
|
||||
}
|
||||
|
||||
/**
|
||||
* 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' ] );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
<?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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
152
wp-content/plugins/elementor/core/admin/menu/base.php
Normal file
152
wp-content/plugins/elementor/core/admin/menu/base.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
<?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();
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?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();
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?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();
|
||||
}
|
||||
79
wp-content/plugins/elementor/core/admin/menu/main.php
Normal file
79
wp-content/plugins/elementor/core/admin/menu/main.php
Normal file
@@ -0,0 +1,79 @@
|
||||
<?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 );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?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();
|
||||
}
|
||||
107
wp-content/plugins/elementor/core/admin/ui/components/button.php
Normal file
107
wp-content/plugins/elementor/core/admin/ui/components/button.php
Normal file
@@ -0,0 +1,107 @@
|
||||
<?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, true ) ) {
|
||||
return $default_options[ $option ];
|
||||
}
|
||||
|
||||
return $default_options;
|
||||
}
|
||||
|
||||
public function __construct( array $options ) {
|
||||
$this->options = $this->merge_properties( $this->get_default_options(), $options );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user