get_parent_pages();
} else {
add_action( 'init', [ $this, 'get_parent_pages' ] );
}
}
( new Review() )->hooks();
( new Education() )->hooks();
( new SetupWizard() )->hooks();
( new FlyoutMenu() )->hooks();
$this->recommended_plugins = new RecommendedPlugins();
$this->recommended_plugins->hooks();
( new WooCommerceActiveLayerEducation() )->hooks();
}
/**
* Display custom notices based on the error/success codes.
*
* @since 1.0.0
*/
public function display_custom_auth_notices() {
$error = isset( $_GET['error'] ) ? sanitize_key( $_GET['error'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$success = isset( $_GET['success'] ) ? sanitize_key( $_GET['success'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( empty( $error ) && empty( $success ) ) {
return;
}
if ( ! current_user_can( wp_mail_smtp()->get_capability_manage_options() ) ) {
return;
}
switch ( $error ) {
case 'oauth_invalid_state':
WP::add_admin_notice_with_debug(
esc_html__( 'There was an error while processing the authentication request. The state key is invalid. Please try again.', 'wp-mail-smtp' ),
WP::ADMIN_NOTICE_ERROR
);
break;
case 'google_invalid_nonce':
WP::add_admin_notice_with_debug(
esc_html__( 'There was an error while processing the authentication request. The nonce is invalid. Please try again.', 'wp-mail-smtp' ),
WP::ADMIN_NOTICE_ERROR
);
break;
case 'google_access_denied':
WP::add_admin_notice_with_debug( /* translators: %s - error code, returned by Google API. */
sprintf( esc_html__( 'There was an error while processing the authentication request: %s. Please try again.', 'wp-mail-smtp' ), '' . $error . '' ),
WP::ADMIN_NOTICE_ERROR
);
break;
case 'google_no_code_scope':
WP::add_admin_notice_with_debug(
esc_html__( 'There was an error while processing the authentication request. Please try again.', 'wp-mail-smtp' ),
WP::ADMIN_NOTICE_ERROR
);
break;
case 'google_no_clients':
WP::add_admin_notice_with_debug(
esc_html__( 'There was an error while processing the authentication request. Please make sure that you have Client ID and Client Secret both valid and saved.', 'wp-mail-smtp' ),
WP::ADMIN_NOTICE_ERROR
);
break;
case 'google_unsuccessful_oauth':
WP::add_admin_notice_with_debug(
esc_html__( 'There was an error while processing the authentication request.', 'wp-mail-smtp' ),
WP::ADMIN_NOTICE_ERROR
);
break;
}
switch ( $success ) {
case 'google_site_linked':
WP::add_admin_notice_with_debug(
esc_html__( 'You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail.', 'wp-mail-smtp' ),
WP::ADMIN_NOTICE_SUCCESS
);
break;
}
}
/**
* Display notice instructing the user to complete plugin setup.
*
* @since 1.3.0
*/
public function display_setup_notice() {
// Bail if we're not on a plugin page.
if ( ! $this->is_admin_page( 'general' ) ) {
return;
}
$default_options = wp_json_encode( Options::get_defaults() );
$current_options = wp_json_encode( Options::init()->get_all() );
// Check if the current settings are the same as the default settings.
if ( $current_options !== $default_options ) {
return;
}
// Display notice informing user further action is needed.
WP::add_admin_notice(
sprintf(
wp_kses( /* translators: %s - Mailer anchor link. */
__( 'Thanks for using WP Mail SMTP! To complete the plugin setup and start sending emails, please select and configure your Mailer.', 'wp-mail-smtp' ),
[
'a' => [
'href' => [],
],
'strong' => [],
]
),
wp_mail_smtp()->get_admin()->get_admin_page_url( self::SLUG . '#wp-mail-smtp-setting-row-mailer' )
),
WP::ADMIN_NOTICE_INFO
);
}
/**
* Display notice explaining removal of "Email Test" tab.
*
* @since 3.9.0
*/
public function display_email_test_tab_removal_notice() {
// Bail if we aren't on a "Settings" page.
if ( ! $this->is_admin_page( self::SLUG ) ) {
return;
}
// Bail if the notice has been dismissed.
if ( metadata_exists( 'user', get_current_user_id(), 'wp_mail_smtp_email_test_tab_removal_notice_dismissed' ) ) {
return;
}
/*
* Don't display the notice if the user installed a plugin with a new "Email Test"
* location (starting from v3.9.0) and is not aware of the old one. Also, don't display
* the notice if the `wp_mail_smtp_initial_version` option is not set (it can happen if
* the plugin was activated network wise in the multisite installation and plugin
* activation hook was not performed on the subsite level).
*/
if ( version_compare( get_option( 'wp_mail_smtp_initial_version', '3.9.0' ), '3.9.0', '>=' ) ) {
return;
}
WP::add_admin_notice(
sprintf(
wp_kses(
/* translators: %s: Tools page URL. */
__( 'The Email Test tab was moved to WP Mail SMTP > Tools.', 'wp-mail-smtp' ),
[ 'a' => [ 'href' => [] ] ]
),
$this->get_admin_page_url( self::SLUG . '-tools' )
),
implode( ' ', [ WP::ADMIN_NOTICE_INFO, 'email_test_tab_removal_notice' ] )
);
}
/**
* Get menu item position.
*
* @since 2.8.0
*
* @return int
*/
public function get_menu_item_position() {
/**
* Filters menu item position.
*
* @since 2.8.0
*
* @param int $position Position number.
*/
return apply_filters( 'wp_mail_smtp_admin_area_get_menu_item_position', 98 );
}
/**
* Add admin area menu item.
*
* @since 1.0.0
* @since 1.5.0 Moved the menu to the top level. Added several more pages.
*/
public function add_admin_options_page() {
// Options pages access capability.
$access_capability = wp_mail_smtp()->get_capability_manage_options();
$this->hook = add_menu_page(
esc_html__( 'WP Mail SMTP', 'wp-mail-smtp' ),
esc_html__( 'WP Mail SMTP', 'wp-mail-smtp' ),
$access_capability,
self::SLUG,
[ $this, 'display' ],
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM5ZWEzYTgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmlld0JveD0iMCAwIDQzIDM0Ij48cGF0aCBkPSJNMC4wMDcsMy41ODVWMjAuNDIxcTAsMy41ODYsMy43NTEsMy41ODVMMjAsMjRWMTlIMzBWMTQuMDE0bDAuOTkxLTFMMzQsMTNWMy41ODVRMzQsMCwzMC4yNDksMEgzLjc1OFEwLjAwNywwLC4wMDcsMy41ODVoMFpNMy41MjQsNi4xNTdhMS40OSwxLjQ5LDAsMCwxLS41MDgtMC45MzUsMS41ODEsMS41ODEsMCwwLDEsLjI3NC0xLjIwOCwxLjQ0OSwxLjQ0OSwwLDAsMSwxLjA5NC0uNjYzLDEuNzU2LDEuNzU2LDAsMCwxLDEuMjUuMzEybDExLjQwOSw3LjcxNkwyOC4zNzQsMy42NjNhMS45NiwxLjk2LDAsMCwxLDEuMjg5LS4zMTIsMS41NDYsMS41NDYsMCwwLDEsMS4wOTQuNjYzLDEuNCwxLjQsMCwwLDEsLjI3MywxLjIwOCwxLjY3LDEuNjcsMCwwLDEtLjU0Ny45MzVMMTcuMDQzLDE3LjIyNVoiLz48cGF0aCBkPSJNMjIsMjhIMzJsLTAuMDA5LDQuNjI0YTEuMTI2LDEuMTI2LDAsMCwwLDEuOTIyLjhsOC4yNS04LjIzNmExLjEyNiwxLjEyNiwwLDAsMCwwLTEuNTk0bC04LjI1LTguMjQxYTEuMTI2LDEuMTI2LDAsMCwwLTEuOTIyLjh2NC44NjZMMjIsMjF2N1oiLz48L3N2Zz4=',
$this->get_menu_item_position()
);
add_submenu_page(
self::SLUG,
$this->get_current_tab_title() . ' ‹ ' . \esc_html__( 'Settings', 'wp-mail-smtp' ),
esc_html__( 'Settings', 'wp-mail-smtp' ),
$access_capability,
self::SLUG,
[ $this, 'display' ]
);
add_submenu_page(
self::SLUG,
esc_html__( 'Email Log', 'wp-mail-smtp' ),
esc_html__( 'Email Log', 'wp-mail-smtp' ),
$this->get_logs_access_capability(),
self::SLUG . '-logs',
[ $this, 'display' ]
);
foreach ( $this->get_parent_pages() as $slug => $page ) {
// Surface the rotating recommended-plugins item just before "About Us".
if ( $slug === 'about' ) {
$this->recommended_plugins->add_submenu_item( $access_capability );
}
add_submenu_page(
self::SLUG,
esc_html( $page->get_title() ),
esc_html( $page->get_label() ),
$access_capability,
self::SLUG . '-' . $page->get_slug(),
[ $this, 'display' ]
);
}
if ( ! wp_mail_smtp()->is_pro() ) {
add_submenu_page(
self::SLUG,
esc_html__( 'Upgrade to Pro', 'wp-mail-smtp' ),
esc_html__( 'Upgrade to Pro', 'wp-mail-smtp' ),
$access_capability,
// phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
esc_url( wp_mail_smtp()->get_upgrade_link( [ 'medium' => 'admin-menu', 'content' => 'Upgrade to Pro' ] ) )
);
}
}
/**
* Add network admin settings page for the WPMS product education.
*
* @since 2.5.0
*/
public function add_wpms_network_wide_setting_product_education_page() {
add_menu_page(
esc_html__( 'WP Mail SMTP', 'wp-mail-smtp' ),
esc_html__( 'WP Mail SMTP', 'wp-mail-smtp' ),
wp_mail_smtp()->get_capability_manage_global_options(),
self::SLUG,
[ $this, 'display_network_product_education_page' ],
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM5ZWEzYTgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmlld0JveD0iMCAwIDQzIDM0Ij48cGF0aCBkPSJNMC4wMDcsMy41ODVWMjAuNDIxcTAsMy41ODYsMy43NTEsMy41ODVMMjAsMjRWMTlIMzBWMTQuMDE0bDAuOTkxLTFMMzQsMTNWMy41ODVRMzQsMCwzMC4yNDksMEgzLjc1OFEwLjAwNywwLC4wMDcsMy41ODVoMFpNMy41MjQsNi4xNTdhMS40OSwxLjQ5LDAsMCwxLS41MDgtMC45MzUsMS41ODEsMS41ODEsMCwwLDEsLjI3NC0xLjIwOCwxLjQ0OSwxLjQ0OSwwLDAsMSwxLjA5NC0uNjYzLDEuNzU2LDEuNzU2LDAsMCwxLDEuMjUuMzEybDExLjQwOSw3LjcxNkwyOC4zNzQsMy42NjNhMS45NiwxLjk2LDAsMCwxLDEuMjg5LS4zMTIsMS41NDYsMS41NDYsMCwwLDEsMS4wOTQuNjYzLDEuNCwxLjQsMCwwLDEsLjI3MywxLjIwOCwxLjY3LDEuNjcsMCwwLDEtLjU0Ny45MzVMMTcuMDQzLDE3LjIyNVoiLz48cGF0aCBkPSJNMjIsMjhIMzJsLTAuMDA5LDQuNjI0YTEuMTI2LDEuMTI2LDAsMCwwLDEuOTIyLjhsOC4yNS04LjIzNmExLjEyNiwxLjEyNiwwLDAsMCwwLTEuNTk0bC04LjI1LTguMjQxYTEuMTI2LDEuMTI2LDAsMCwwLTEuOTIyLjh2NC44NjZMMjIsMjF2N1oiLz48L3N2Zz4=',
$this->get_menu_item_position()
);
}
/**
* HTML output for the network admin settings page (for the WPMS product education).
*
* @since 2.5.0
*/
public function display_network_product_education_page() {
// Skip if not on multisite and not on network admin site.
if ( ! is_multisite() || ! is_network_admin() ) {
return;
}
?>
generate_display_logs_object();
if ( $logs instanceof \WPMailSMTP\Admin\Pages\Logs ) {
wp_safe_redirect( $logs->get_link() );
exit;
}
}
/**
* Enqueue admin area scripts and styles.
*
* @since 1.0.0
* @since 1.5.0 Added new assets for new pages.
* @since 1.7.0 Added jQuery Confirm library css/js files.
*
* @param string $hook Current hook.
*/
public function enqueue_assets( $hook ) {
if ( strpos( $hook, self::SLUG ) === false ) {
return;
}
// Set general body class.
add_filter(
'admin_body_class',
function ( $classes ) {
$classes .= ' wp-mail-smtp-admin-page-body';
if ( wp_mail_smtp()->is_pro() ) {
$classes .= ' wp-mail-smtp-pro';
} else {
$classes .= ' wp-mail-smtp-lite';
}
return $classes;
}
);
wp_register_style(
'wp-mail-smtp-admin-lity',
wp_mail_smtp()->assets_url . '/css/vendor/lity.min.css',
[],
'2.4.1'
);
wp_register_script(
'wp-mail-smtp-admin-lity',
wp_mail_smtp()->assets_url . '/js/vendor/lity.min.js',
[],
'2.4.1'
);
// General styles and js.
wp_enqueue_style(
'wp-mail-smtp-admin',
wp_mail_smtp()->assets_url . '/css/smtp-admin.min.css',
false,
WPMS_PLUGIN_VER
);
wp_enqueue_script( 'underscore' );
wp_enqueue_script(
'wp-mail-smtp-admin',
wp_mail_smtp()->assets_url . '/js/smtp-admin' . WP::asset_min() . '.js',
[ 'jquery', 'underscore' ],
WPMS_PLUGIN_VER,
false
);
$script_data = [
'text_provider_remove' => esc_html__( 'Are you sure you want to reset the current provider connection? You will need to immediately create a new one to be able to send emails.', 'wp-mail-smtp' ),
'text_settings_not_saved' => esc_html__( 'Changes that you made to the settings are not saved!', 'wp-mail-smtp' ),
'default_mailer_notice' => [
'title' => esc_html__( 'Heads up!', 'wp-mail-smtp' ),
'content' => wp_kses(
__( '
The Default (PHP) mailer is currently selected, but is not recommended because in most cases it does not resolve email delivery issues.
Please consider selecting and configuring one of the other mailers.
', 'wp-mail-smtp' ),
[ 'p' => [] ]
),
'save_button' => esc_html__( 'Save Settings', 'wp-mail-smtp' ),
'cancel_button' => esc_html__( 'Cancel', 'wp-mail-smtp' ),
'icon_alt' => esc_html__( 'Warning icon', 'wp-mail-smtp' ),
],
'plugin_url' => wp_mail_smtp()->plugin_url,
'education' => [
'upgrade_icon_lock' => '',
'upgrade_title' => esc_html__( '%name% is a PRO Feature', 'wp-mail-smtp' ),
'upgrade_content' => esc_html__( 'We\'re sorry, the %name% mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features.', 'wp-mail-smtp' ),
'upgrade_button' => esc_html__( 'Upgrade to Pro', 'wp-mail-smtp' ),
'upgrade_url' => add_query_arg( 'discount', 'SMTPLITEUPGRADE', wp_mail_smtp()->get_upgrade_link( '' ) ),
'upgrade_bonus' => '
' .
sprintf(
wp_kses( /* Translators: %s - discount value $50. */
__( 'Bonus: WP Mail SMTP users get %s off regular price, applied at checkout.', 'wp-mail-smtp' ),
[
'strong' => [],
'span' => [],
'br' => [],
]
),
'$50'
)
. '
',
'upgrade_doc' => sprintf(
'%2$s',
// phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
esc_url( wp_mail_smtp()->get_utm_url( 'https://wpmailsmtp.com/docs/how-to-upgrade-wp-mail-smtp-to-pro-version/', [ 'medium' => 'plugin-settings', 'content' => 'Pro Mailer Popup - Already purchased' ] ) ),
esc_html__( 'Already purchased?', 'wp-mail-smtp' )
),
'gmail' => [
'one_click_setup_upgrade_title' => wp_kses( __( 'One-Click Setup for Google Mailer is a Pro Feature', 'wp-mail-smtp' ), [ 'br' => [] ] ),
'one_click_setup_upgrade_content' => esc_html__( 'We\'re sorry, One-Click Setup for Google Mailer is not available on your plan. Please upgrade to the Pro plan to unlock all these awesome features.', 'wp-mail-smtp' ),
],
'rate_limit' => [
'upgrade_title' => wp_kses( __( 'Email Rate Limiting is a Pro Feature', 'wp-mail-smtp' ), [ 'br' => [] ] ),
'upgrade_content' => esc_html__( 'We\'re sorry, Email Rate Limiting is not available on your plan. Please upgrade to the Pro plan to unlock all these awesome features.', 'wp-mail-smtp' ),
],
],
'all_mailers_supports' => wp_mail_smtp()->get_providers()->get_supports_all(),
'nonce' => wp_create_nonce( 'wp-mail-smtp-admin' ),
'is_network_admin' => is_network_admin(),
'ajax_url' => admin_url( 'admin-ajax.php' ),
'lang_code' => sanitize_key( WP::get_language_code() ),
'sendlayer' => [
'connect_nonce' => wp_create_nonce( 'wp-mail-smtp-sendlayer-connect' ),
'return_url' => $this->get_admin_page_url(),
'error_title' => esc_html__( 'Error', 'wp-mail-smtp' ),
'error_text' => esc_html__( 'An error occurred. Please try again.', 'wp-mail-smtp' ),
'server_error' => esc_html__( 'A server error occurred. Please try again.', 'wp-mail-smtp' ),
'connecting_text' => esc_html__( 'Connecting...', 'wp-mail-smtp' ),
],
'plugin_install' => [
'processing' => esc_html__( 'Processing...', 'wp-mail-smtp' ),
'installed' => esc_html__( 'Installed', 'wp-mail-smtp' ),
'activate' => esc_html__( 'Activate', 'wp-mail-smtp' ),
/* translators: %s - plugin name (e.g. WPConsent). */
'activate_with_name' => esc_html__( 'Activate %s', 'wp-mail-smtp' ),
'setup_now' => esc_html__( 'Setup Now', 'wp-mail-smtp' ),
'error' => esc_html__( 'Could not install a plugin. Please download from WordPress.org and install manually.', 'wp-mail-smtp' ),
'error_title' => esc_html__( 'Error', 'wp-mail-smtp' ),
'btn_ok' => esc_html__( 'OK', 'wp-mail-smtp' ),
],
'dismiss_error' => esc_html__( 'Could not dismiss the notice. Please try again.', 'wp-mail-smtp' ),
'hide_delivery_errors' => [
'title' => esc_html__( 'Are you sure?', 'wp-mail-smtp' ),
'content' => wp_kses(
__( '
Hiding email delivery errors means you will no longer be warned when emails fail to send. This is not recommended and should only be used on staging or development sites.