2013-07-24 16:01:36 +00:00
< ? php
/**
2015-11-03 13:53:50 +00:00
* Display notices in admin
2013-07-24 16:01:36 +00:00
*
2018-04-17 20:44:11 +00:00
* @ package WooCommerce\Admin
* @ version 3.4 . 0
2013-07-24 16:01:36 +00:00
*/
2018-04-17 20:44:11 +00:00
defined ( 'ABSPATH' ) || exit ;
2013-07-24 16:01:36 +00:00
/**
2015-11-03 12:28:01 +00:00
* WC_Admin_Notices Class .
2013-07-24 16:01:36 +00:00
*/
class WC_Admin_Notices {
2016-06-06 17:20:10 +00:00
/**
* Stores notices .
2018-03-05 18:59:17 +00:00
*
2016-06-06 17:20:10 +00:00
* @ var array
*/
private static $notices = array ();
2013-07-24 16:01:36 +00:00
/**
2015-11-03 12:28:01 +00:00
* Array of notices - name => callback .
2018-03-05 18:59:17 +00:00
*
2015-01-20 15:23:34 +00:00
* @ var array
*/
2016-05-11 13:22:06 +00:00
private static $core_notices = array (
2018-02-13 12:02:24 +00:00
'install' => 'install_notice' ,
'update' => 'update_notice' ,
'template_files' => 'template_file_check_notice' ,
'legacy_shipping' => 'legacy_shipping_notice' ,
'no_shipping_methods' => 'no_shipping_methods_notice' ,
'regenerating_thumbnails' => 'regenerating_thumbnails_notice' ,
2018-04-17 20:39:18 +00:00
'no_secure_connection' => 'secure_connection_notice' ,
2018-06-13 18:36:36 +00:00
'wootenberg' => 'wootenberg_feature_plugin_notice' ,
2015-01-20 15:23:34 +00:00
);
/**
2015-11-03 12:28:01 +00:00
* Constructor .
2013-07-24 16:01:36 +00:00
*/
2016-05-11 13:22:06 +00:00
public static function init () {
self :: $notices = get_option ( 'woocommerce_admin_notices' , array () );
add_action ( 'switch_theme' , array ( __CLASS__ , 'reset_admin_notices' ) );
add_action ( 'woocommerce_installed' , array ( __CLASS__ , 'reset_admin_notices' ) );
add_action ( 'wp_loaded' , array ( __CLASS__ , 'hide_notices' ) );
add_action ( 'shutdown' , array ( __CLASS__ , 'store_notices' ) );
2015-04-29 11:08:15 +00:00
if ( current_user_can ( 'manage_woocommerce' ) ) {
2016-05-11 13:22:06 +00:00
add_action ( 'admin_print_styles' , array ( __CLASS__ , 'add_notices' ) );
2018-06-13 18:36:36 +00:00
add_action ( 'activate_gutenberg/gutenberg.php' , array ( __CLASS__ , 'add_wootenberg_feature_plugin_notice_on_gutenberg_activate' ) );
2015-04-29 11:08:15 +00:00
}
2015-04-29 09:47:57 +00:00
}
2016-05-11 13:22:06 +00:00
/**
* Store notices to DB
*/
public static function store_notices () {
update_option ( 'woocommerce_admin_notices' , self :: get_notices () );
}
/**
* Get notices
2018-03-05 18:59:17 +00:00
*
2016-05-11 13:22:06 +00:00
* @ return array
*/
public static function get_notices () {
return self :: $notices ;
}
2015-04-29 09:47:57 +00:00
/**
2015-11-03 12:28:01 +00:00
* Remove all notices .
2015-04-29 09:47:57 +00:00
*/
public static function remove_all_notices () {
2016-05-11 13:22:06 +00:00
self :: $notices = array ();
2013-07-24 16:01:36 +00:00
}
2014-02-11 13:33:56 +00:00
/**
2015-11-03 12:28:01 +00:00
* Reset notices for themes when switched or a new version of WC is installed .
2014-02-11 13:33:56 +00:00
*/
2016-05-11 13:22:06 +00:00
public static function reset_admin_notices () {
2018-10-29 14:10:09 +00:00
if ( ! self :: is_ssl () ) {
self :: add_notice ( 'no_secure_connection' );
2018-04-17 21:26:08 +00:00
}
2018-10-29 14:10:09 +00:00
self :: add_wootenberg_feature_plugin_notice ();
2015-02-02 14:40:08 +00:00
self :: add_notice ( 'template_files' );
2014-02-11 13:33:56 +00:00
}
2013-07-24 16:01:36 +00:00
/**
2015-11-03 12:28:01 +00:00
* Show a notice .
2018-03-05 18:59:17 +00:00
*
2018-04-17 20:44:11 +00:00
* @ param string $name Notice name .
2013-07-24 16:01:36 +00:00
*/
2015-01-20 15:23:34 +00:00
public static function add_notice ( $name ) {
2016-05-11 13:22:06 +00:00
self :: $notices = array_unique ( array_merge ( self :: get_notices (), array ( $name ) ) );
2015-01-20 15:23:34 +00:00
}
2013-07-24 16:01:36 +00:00
2015-01-20 15:23:34 +00:00
/**
2015-11-03 12:28:01 +00:00
* Remove a notice from being displayed .
2018-03-05 18:59:17 +00:00
*
2018-04-17 20:44:11 +00:00
* @ param string $name Notice name .
2015-01-20 15:23:34 +00:00
*/
public static function remove_notice ( $name ) {
2016-05-11 13:22:06 +00:00
self :: $notices = array_diff ( self :: get_notices (), array ( $name ) );
2016-04-01 16:30:04 +00:00
delete_option ( 'woocommerce_admin_notice_' . $name );
2015-01-20 15:23:34 +00:00
}
2013-07-24 16:01:36 +00:00
2015-01-20 15:23:34 +00:00
/**
2015-11-03 12:28:01 +00:00
* See if a notice is being shown .
2018-03-05 18:59:17 +00:00
*
2018-11-15 13:26:19 +00:00
* @ param string $name Notice name .
*
2015-01-20 15:23:34 +00:00
* @ return boolean
*/
public static function has_notice ( $name ) {
2018-04-17 20:44:11 +00:00
return in_array ( $name , self :: get_notices (), true );
2015-01-20 15:23:34 +00:00
}
2013-07-24 16:01:36 +00:00
2015-01-20 15:23:34 +00:00
/**
* Hide a notice if the GET variable is set .
*/
2016-05-11 13:22:06 +00:00
public static function hide_notices () {
2018-04-17 20:44:11 +00:00
if ( isset ( $_GET [ 'wc-hide-notice' ] ) && isset ( $_GET [ '_wc_notice_nonce' ] ) ) { // WPCS: input var ok, CSRF ok.
if ( ! wp_verify_nonce ( sanitize_key ( wp_unslash ( $_GET [ '_wc_notice_nonce' ] ) ), 'woocommerce_hide_notices_nonce' ) ) { // WPCS: input var ok, CSRF ok.
wp_die ( esc_html__ ( 'Action failed. Please refresh the page and retry.' , 'woocommerce' ) );
2015-05-20 18:14:53 +00:00
}
if ( ! current_user_can ( 'manage_woocommerce' ) ) {
2018-04-17 20:44:11 +00:00
wp_die ( esc_html__ ( 'You don’t have permission to do this.' , 'woocommerce' ) );
2015-05-20 18:14:53 +00:00
}
2018-04-17 20:44:11 +00:00
$hide_notice = sanitize_text_field ( wp_unslash ( $_GET [ 'wc-hide-notice' ] ) ); // WPCS: input var ok, CSRF ok.
2018-01-24 17:18:28 +00:00
2015-01-20 15:23:34 +00:00
self :: remove_notice ( $hide_notice );
2018-01-24 17:18:28 +00:00
update_user_meta ( get_current_user_id (), 'dismissed_' . $hide_notice . '_notice' , true );
2015-01-20 15:23:34 +00:00
do_action ( 'woocommerce_hide_' . $hide_notice . '_notice' );
2014-02-11 13:33:56 +00:00
}
2015-01-20 15:23:34 +00:00
}
2013-07-24 16:01:36 +00:00
2015-01-20 15:23:34 +00:00
/**
* Add notices + styles if needed .
*/
2016-05-11 13:22:06 +00:00
public static function add_notices () {
$notices = self :: get_notices ();
2014-06-04 16:01:38 +00:00
2018-04-18 13:08:31 +00:00
if ( empty ( $notices ) ) {
return ;
}
2017-07-06 06:03:15 +00:00
2018-04-18 13:08:31 +00:00
$screen = get_current_screen ();
$screen_id = $screen ? $screen -> id : '' ;
$show_on_screens = array (
'dashboard' ,
'plugins' ,
);
2017-07-06 06:03:15 +00:00
2018-04-18 13:08:31 +00:00
// Notices should only show on WooCommerce screens, the main dashboard, and on the plugins screen.
if ( ! in_array ( $screen_id , wc_get_screen_ids (), true ) && ! in_array ( $screen_id , $show_on_screens , true ) ) {
return ;
}
wp_enqueue_style ( 'woocommerce-activation' , plugins_url ( '/assets/css/activation.css' , WC_PLUGIN_FILE ), array (), WC_VERSION );
// Add RTL support.
wp_style_add_data ( 'woocommerce-activation' , 'rtl' , 'replace' );
foreach ( $notices as $notice ) {
if ( ! empty ( self :: $core_notices [ $notice ] ) && apply_filters ( 'woocommerce_show_admin_notice' , true , $notice ) ) {
add_action ( 'admin_notices' , array ( __CLASS__ , self :: $core_notices [ $notice ] ) );
} else {
add_action ( 'admin_notices' , array ( __CLASS__ , 'output_custom_notices' ) );
2016-04-01 16:30:04 +00:00
}
}
}
/**
* Add a custom notice .
2018-03-05 18:59:17 +00:00
*
2018-04-17 20:44:11 +00:00
* @ param string $name Notice name .
* @ param string $notice_html Notice HTML .
2016-04-01 16:30:04 +00:00
*/
public static function add_custom_notice ( $name , $notice_html ) {
self :: add_notice ( $name );
update_option ( 'woocommerce_admin_notice_' . $name , wp_kses_post ( $notice_html ) );
}
/**
* Output any stored custom notices .
*/
2016-05-11 13:22:06 +00:00
public static function output_custom_notices () {
$notices = self :: get_notices ();
2016-06-06 16:24:31 +00:00
if ( ! empty ( $notices ) ) {
2016-04-01 16:30:04 +00:00
foreach ( $notices as $notice ) {
2016-05-11 13:22:06 +00:00
if ( empty ( self :: $core_notices [ $notice ] ) ) {
2016-04-01 16:30:04 +00:00
$notice_html = get_option ( 'woocommerce_admin_notice_' . $notice );
if ( $notice_html ) {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-custom.php' ;
2016-04-01 16:30:04 +00:00
}
2015-04-29 11:21:48 +00:00
}
2015-04-29 09:47:57 +00:00
}
2014-06-04 16:01:38 +00:00
}
2015-01-20 15:23:34 +00:00
}
2015-01-14 12:17:03 +00:00
2015-01-20 15:23:34 +00:00
/**
2015-11-03 12:28:01 +00:00
* If we need to update , include a message with the update button .
2015-01-20 15:23:34 +00:00
*/
2016-05-11 13:22:06 +00:00
public static function update_notice () {
if ( version_compare ( get_option ( 'woocommerce_db_version' ), WC_VERSION , '<' ) ) {
2016-06-13 11:44:16 +00:00
$updater = new WC_Background_Updater ();
2018-04-17 20:44:11 +00:00
if ( $updater -> is_updating () || ! empty ( $_GET [ 'do_update_woocommerce' ] ) ) { // WPCS: input var ok, CSRF ok.
include dirname ( __FILE__ ) . '/views/html-notice-updating.php' ;
2016-06-13 17:15:07 +00:00
} else {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-update.php' ;
2016-06-13 11:44:16 +00:00
}
2016-05-11 13:22:06 +00:00
} else {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-updated.php' ;
2016-05-11 13:22:06 +00:00
}
2016-05-11 11:43:35 +00:00
}
2013-07-24 16:01:36 +00:00
/**
2015-11-03 12:28:01 +00:00
* If we have just installed , show a message with the install pages button .
2013-07-24 16:01:36 +00:00
*/
2016-05-11 13:22:06 +00:00
public static function install_notice () {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-install.php' ;
2013-07-24 16:01:36 +00:00
}
2018-01-10 17:45:16 +00:00
/**
* Show the Theme Check notice .
2018-01-10 17:52:52 +00:00
*
* @ todo Remove this next major release .
2018-01-10 17:45:16 +00:00
*/
public static function theme_check_notice () {
2018-01-10 17:52:52 +00:00
wc_deprecated_function ( 'WC_Admin_Notices::theme_check_notice' , '3.3.0' );
2018-01-10 17:45:16 +00:00
if ( ! current_theme_supports ( 'woocommerce' ) ) {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-theme-support.php' ;
2018-01-10 17:45:16 +00:00
}
}
2014-02-11 13:33:56 +00:00
/**
2015-11-03 12:28:01 +00:00
* Show a notice highlighting bad template files .
2014-02-11 13:33:56 +00:00
*/
2016-05-11 13:22:06 +00:00
public static function template_file_check_notice () {
2014-06-04 10:16:19 +00:00
$core_templates = WC_Admin_Status :: scan_template_files ( WC () -> plugin_path () . '/templates' );
2014-02-11 13:33:56 +00:00
$outdated = false ;
foreach ( $core_templates as $file ) {
2015-04-01 13:33:56 +00:00
2014-02-11 13:33:56 +00:00
$theme_file = false ;
if ( file_exists ( get_stylesheet_directory () . '/' . $file ) ) {
$theme_file = get_stylesheet_directory () . '/' . $file ;
2017-10-16 11:03:12 +00:00
} elseif ( file_exists ( get_stylesheet_directory () . '/' . WC () -> template_path () . $file ) ) {
$theme_file = get_stylesheet_directory () . '/' . WC () -> template_path () . $file ;
2014-02-11 13:33:56 +00:00
} elseif ( file_exists ( get_template_directory () . '/' . $file ) ) {
$theme_file = get_template_directory () . '/' . $file ;
2017-10-16 11:03:12 +00:00
} elseif ( file_exists ( get_template_directory () . '/' . WC () -> template_path () . $file ) ) {
$theme_file = get_template_directory () . '/' . WC () -> template_path () . $file ;
2014-02-11 13:33:56 +00:00
}
2016-09-07 22:32:24 +00:00
if ( false !== $theme_file ) {
2014-06-13 15:17:23 +00:00
$core_version = WC_Admin_Status :: get_file_version ( WC () -> plugin_path () . '/templates/' . $file );
$theme_version = WC_Admin_Status :: get_file_version ( $theme_file );
2014-02-11 13:33:56 +00:00
if ( $core_version && $theme_version && version_compare ( $theme_version , $core_version , '<' ) ) {
$outdated = true ;
break ;
}
}
}
2014-02-11 15:13:47 +00:00
if ( $outdated ) {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-template-check.php' ;
2015-01-20 15:23:34 +00:00
} else {
self :: remove_notice ( 'template_files' );
2014-02-11 15:13:47 +00:00
}
2014-02-11 13:33:56 +00:00
}
2016-03-15 15:58:00 +00:00
/**
* Show a notice asking users to convert to shipping zones .
*/
2016-05-11 13:22:06 +00:00
public static function legacy_shipping_notice () {
2016-03-15 15:58:00 +00:00
$maybe_load_legacy_methods = array ( 'flat_rate' , 'free_shipping' , 'international_delivery' , 'local_delivery' , 'local_pickup' );
$enabled = false ;
foreach ( $maybe_load_legacy_methods as $method ) {
$options = get_option ( 'woocommerce_' . $method . '_settings' );
if ( $options && isset ( $options [ 'enabled' ] ) && 'yes' === $options [ 'enabled' ] ) {
$enabled = true ;
}
}
if ( $enabled ) {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-legacy-shipping.php' ;
2016-03-15 15:58:00 +00:00
} else {
self :: remove_notice ( 'template_files' );
}
}
2016-03-31 17:54:33 +00:00
/**
* No shipping methods .
*/
2016-05-11 13:22:06 +00:00
public static function no_shipping_methods_notice () {
2018-04-17 20:44:11 +00:00
if ( wc_shipping_enabled () && ( empty ( $_GET [ 'page' ] ) || empty ( $_GET [ 'tab' ] ) || 'wc-settings' !== $_GET [ 'page' ] || 'shipping' !== $_GET [ 'tab' ] ) ) { // WPCS: input var ok, CSRF ok.
2016-03-31 17:54:33 +00:00
$product_count = wp_count_posts ( 'product' );
2016-05-25 11:05:23 +00:00
$method_count = wc_get_shipping_method_count ();
2016-03-31 17:54:33 +00:00
if ( $product_count -> publish > 0 && 0 === $method_count ) {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-no-shipping-methods.php' ;
2016-03-31 17:54:33 +00:00
}
if ( $method_count > 0 ) {
self :: remove_notice ( 'no_shipping_methods' );
}
}
}
2016-04-19 12:14:13 +00:00
/**
2019-01-10 12:01:27 +00:00
* Simplify Commerce is no longer in core .
2016-04-19 12:14:13 +00:00
*/
2016-05-11 13:22:06 +00:00
public static function simplify_commerce_notice () {
2019-01-10 12:01:27 +00:00
wc_deprecated_function ( 'WC_Admin_Notices::simplify_commerce_notice' , '3.6.0' );
2016-04-19 12:14:13 +00:00
}
2018-02-13 12:02:24 +00:00
/**
* Notice shown when regenerating thumbnails background process is running .
*/
public static function regenerating_thumbnails_notice () {
2018-04-17 20:44:11 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-regenerating-thumbnails.php' ;
2018-02-13 12:02:24 +00:00
}
2018-04-17 20:39:18 +00:00
/**
* Notice about secure connection .
*/
public static function secure_connection_notice () {
2018-10-29 14:10:09 +00:00
if ( self :: is_ssl () || get_user_meta ( get_current_user_id (), 'dismissed_no_secure_connection_notice' , true ) ) {
2018-04-17 21:26:08 +00:00
return ;
}
2018-04-17 20:39:18 +00:00
include dirname ( __FILE__ ) . '/views/html-notice-secure-connection.php' ;
}
2018-06-13 18:36:36 +00:00
/**
* If Gutenberg is active , tell people about the Products block feature plugin .
*
* @ since 3.4 . 3
2018-11-15 13:26:19 +00:00
* @ todo Remove this notice and associated code once the feature plugin has been merged into core .
2018-06-13 18:36:36 +00:00
*/
public static function add_wootenberg_feature_plugin_notice () {
2018-11-15 13:27:58 +00:00
if ( ( is_plugin_active ( 'gutenberg/gutenberg.php' ) || version_compare ( get_bloginfo ( 'version' ), '5.0' , '>=' ) ) && ! is_plugin_active ( 'woo-gutenberg-products-block/woocommerce-gutenberg-products-block.php' ) ) {
2018-06-13 18:36:36 +00:00
self :: add_notice ( 'wootenberg' );
}
}
/**
* Tell people about the Products block feature plugin when they activate Gutenberg .
*
* @ since 3.4 . 3
2018-11-15 13:26:19 +00:00
* @ todo Remove this notice and associated code once the feature plugin has been merged into core .
2018-06-13 18:36:36 +00:00
*/
public static function add_wootenberg_feature_plugin_notice_on_gutenberg_activate () {
2018-11-15 13:27:58 +00:00
if ( ! is_plugin_active ( 'woo-gutenberg-products-block/woocommerce-gutenberg-products-block.php' ) && version_compare ( get_bloginfo ( 'version' ), '5.0' , '<' ) ) {
2018-06-13 18:36:36 +00:00
self :: add_notice ( 'wootenberg' );
}
}
/**
* Notice about trying the Products block .
*/
public static function wootenberg_feature_plugin_notice () {
2018-06-18 17:54:01 +00:00
if ( get_user_meta ( get_current_user_id (), 'dismissed_wootenberg_notice' , true ) || is_plugin_active ( 'woo-gutenberg-products-block/woocommerce-gutenberg-products-block.php' ) ) {
2018-06-13 18:36:36 +00:00
self :: remove_notice ( 'wootenberg' );
return ;
}
include dirname ( __FILE__ ) . '/views/html-notice-wootenberg.php' ;
}
2018-10-29 14:10:09 +00:00
/**
* Determine if the store is running SSL .
*
* @ return bool Flag SSL enabled .
2018-11-15 13:26:19 +00:00
* @ since 3.5 . 1
2018-10-29 14:10:09 +00:00
*/
protected static function is_ssl () {
2019-01-23 12:49:21 +00:00
$shop_page = wc_get_page_permalink ( 'shop' );
2018-10-29 14:10:09 +00:00
return ( is_ssl () && 'https' === substr ( $shop_page , 0 , 5 ) );
}
2013-07-24 16:01:36 +00:00
}
2016-05-11 13:22:06 +00:00
WC_Admin_Notices :: init ();