2019-08-12 17:54:04 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* WooCommerce Admin: Feature plugin main class.
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Automattic\WooCommerce\Admin;
|
|
|
|
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
|
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes;
|
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Historical_Data;
|
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Order_Milestones;
|
2019-09-11 10:11:07 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Woo_Subscriptions_Notes;
|
2019-11-07 16:29:36 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Tracking_Opt_In;
|
2020-03-31 12:59:48 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_WooCommerce_Payments;
|
2020-04-14 00:54:43 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Install_JP_And_WCS_Plugins;
|
2020-05-11 06:13:49 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Draw_Attention;
|
2020-06-16 02:30:41 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Coupon_Page_Moved;
|
2020-06-05 01:51:25 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\RemoteInboxNotifications\RemoteInboxNotificationsEngine;
|
2020-06-14 23:27:43 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Home_Screen_Feedback;
|
2020-07-15 02:09:49 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Set_Up_Additional_Payment_Types;
|
2020-07-22 18:24:03 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Test_Checkout;
|
2020-08-26 04:11:14 +00:00
|
|
|
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Selling_Online_Courses;
|
2019-08-12 17:54:04 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Feature plugin main class.
|
|
|
|
*
|
|
|
|
* @internal This file will not be bundled with woo core, only the feature plugin.
|
|
|
|
* @internal Note this is not called WC_Admin due to a class already existing in core with that name.
|
|
|
|
*/
|
2019-08-12 21:52:09 +00:00
|
|
|
class FeaturePlugin {
|
2019-08-12 17:54:04 +00:00
|
|
|
/**
|
|
|
|
* The single instance of the class.
|
|
|
|
*
|
|
|
|
* @var object
|
|
|
|
*/
|
|
|
|
protected static $instance = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
protected function __construct() {}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get class instance.
|
|
|
|
*
|
|
|
|
* @return object Instance.
|
|
|
|
*/
|
|
|
|
final public static function instance() {
|
|
|
|
if ( null === static::$instance ) {
|
|
|
|
static::$instance = new static();
|
|
|
|
}
|
|
|
|
return static::$instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Init the feature plugin, only if we can detect both Gutenberg and WooCommerce.
|
|
|
|
*/
|
|
|
|
public function init() {
|
2019-12-04 23:44:49 +00:00
|
|
|
/**
|
|
|
|
* Filter allowing WooCommerce Admin to be disabled.
|
|
|
|
*
|
|
|
|
* @param bool $disabled False.
|
|
|
|
*/
|
2019-12-06 17:13:28 +00:00
|
|
|
if ( apply_filters( 'woocommerce_admin_disabled', false ) ) {
|
2019-12-04 23:44:49 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-08-12 17:54:04 +00:00
|
|
|
$this->define_constants();
|
2019-11-19 23:23:27 +00:00
|
|
|
|
|
|
|
require_once WC_ADMIN_ABSPATH . '/includes/core-functions.php';
|
|
|
|
require_once WC_ADMIN_ABSPATH . '/includes/feature-config.php';
|
|
|
|
require_once WC_ADMIN_ABSPATH . '/includes/page-controller-functions.php';
|
|
|
|
require_once WC_ADMIN_ABSPATH . '/includes/wc-admin-update-functions.php';
|
|
|
|
|
2019-08-12 17:54:04 +00:00
|
|
|
register_activation_hook( WC_ADMIN_PLUGIN_FILE, array( $this, 'on_activation' ) );
|
|
|
|
register_deactivation_hook( WC_ADMIN_PLUGIN_FILE, array( $this, 'on_deactivation' ) );
|
2019-11-19 23:23:27 +00:00
|
|
|
if ( did_action( 'plugins_loaded' ) ) {
|
|
|
|
self::on_plugins_loaded();
|
|
|
|
} else {
|
2020-03-12 17:57:57 +00:00
|
|
|
// Make sure we hook into `plugins_loaded` before core's Automattic\WooCommerce\Package::init().
|
|
|
|
// If core is network activated but we aren't, the packaged version of WooCommerce Admin will
|
|
|
|
// attempt to use a data store that hasn't been loaded yet - because we've defined our constants here.
|
|
|
|
// See: https://github.com/woocommerce/woocommerce-admin/issues/3869.
|
2020-03-12 13:46:13 +00:00
|
|
|
add_action( 'plugins_loaded', array( $this, 'on_plugins_loaded' ), 9 );
|
2019-11-19 23:23:27 +00:00
|
|
|
}
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Install DB and create cron events when activated.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function on_activation() {
|
2019-08-12 21:52:09 +00:00
|
|
|
Install::create_tables();
|
|
|
|
Install::create_events();
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove WooCommerce Admin scheduled actions on deactivate.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function on_deactivation() {
|
2020-01-16 18:46:05 +00:00
|
|
|
// Don't clean up if the WooCommerce Admin package is in core.
|
|
|
|
// NOTE: Any future divergence from the core package will need to be accounted for here.
|
|
|
|
if ( defined( 'WC_ADMIN_PACKAGE_EXISTS' ) && WC_ADMIN_PACKAGE_EXISTS ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-08-12 17:54:04 +00:00
|
|
|
// Check if we are deactivating due to dependencies not being satisfied.
|
|
|
|
// If WooCommerce is disabled we can't include files that depend upon it.
|
2019-11-07 07:37:35 +00:00
|
|
|
if ( ! $this->has_satisfied_dependencies() ) {
|
2019-08-12 17:54:04 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->includes();
|
2019-08-12 21:52:09 +00:00
|
|
|
ReportsSync::clear_queued_actions();
|
2019-08-12 17:54:04 +00:00
|
|
|
WC_Admin_Notes::clear_queued_actions();
|
|
|
|
wp_clear_scheduled_hook( 'wc_admin_daily' );
|
2019-10-01 23:35:37 +00:00
|
|
|
wp_clear_scheduled_hook( 'generate_category_lookup_table' );
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Setup plugin once all other plugins are loaded.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function on_plugins_loaded() {
|
|
|
|
$this->load_plugin_textdomain();
|
|
|
|
|
2019-11-07 07:37:35 +00:00
|
|
|
if ( ! $this->has_satisfied_dependencies() ) {
|
2019-08-12 17:54:04 +00:00
|
|
|
add_action( 'admin_init', array( $this, 'deactivate_self' ) );
|
|
|
|
add_action( 'admin_notices', array( $this, 'render_dependencies_notice' ) );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->includes();
|
|
|
|
$this->hooks();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Define Constants.
|
|
|
|
*/
|
|
|
|
protected function define_constants() {
|
|
|
|
$this->define( 'WC_ADMIN_APP', 'wc-admin-app' );
|
|
|
|
$this->define( 'WC_ADMIN_ABSPATH', dirname( __DIR__ ) . '/' );
|
|
|
|
$this->define( 'WC_ADMIN_DIST_JS_FOLDER', 'dist/' );
|
|
|
|
$this->define( 'WC_ADMIN_DIST_CSS_FOLDER', 'dist/' );
|
|
|
|
$this->define( 'WC_ADMIN_PLUGIN_FILE', WC_ADMIN_ABSPATH . 'woocommerce-admin.php' );
|
|
|
|
// WARNING: Do not directly edit this version number constant.
|
|
|
|
// It is updated as part of the prebuild process from the package.json value.
|
2020-08-11 01:05:03 +00:00
|
|
|
$this->define( 'WC_ADMIN_VERSION_NUMBER', '1.6.0-dev' );
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load Localisation files.
|
|
|
|
*/
|
|
|
|
protected function load_plugin_textdomain() {
|
|
|
|
load_plugin_textdomain( 'woocommerce-admin', false, basename( dirname( __DIR__ ) ) . '/languages' );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Include WC Admin classes.
|
|
|
|
*/
|
|
|
|
public function includes() {
|
|
|
|
// Initialize the WC API extensions.
|
2019-08-12 21:52:09 +00:00
|
|
|
ReportsSync::init();
|
|
|
|
Install::init();
|
|
|
|
Events::instance()->init();
|
2020-07-06 20:11:45 +00:00
|
|
|
API\Init::instance();
|
2019-08-12 21:52:09 +00:00
|
|
|
ReportExporter::init();
|
2019-08-12 17:54:04 +00:00
|
|
|
|
|
|
|
// CRUD classes.
|
|
|
|
WC_Admin_Notes::init();
|
|
|
|
|
2019-10-01 23:35:37 +00:00
|
|
|
// Initialize category lookup.
|
|
|
|
CategoryLookup::instance()->init();
|
|
|
|
|
2019-08-12 17:54:04 +00:00
|
|
|
// Admin note providers.
|
|
|
|
// @todo These should be bundled in the features/ folder, but loading them from there currently has a load order issue.
|
|
|
|
new WC_Admin_Notes_Woo_Subscriptions_Notes();
|
|
|
|
new WC_Admin_Notes_Historical_Data();
|
|
|
|
new WC_Admin_Notes_Order_Milestones();
|
2019-11-07 16:29:36 +00:00
|
|
|
new WC_Admin_Notes_Tracking_Opt_In();
|
2020-03-31 12:59:48 +00:00
|
|
|
new WC_Admin_Notes_WooCommerce_Payments();
|
2020-04-14 00:54:43 +00:00
|
|
|
new WC_Admin_Notes_Install_JP_And_WCS_Plugins();
|
2020-05-11 06:13:49 +00:00
|
|
|
new WC_Admin_Notes_Draw_Attention();
|
2020-06-14 23:27:43 +00:00
|
|
|
new WC_Admin_Notes_Home_Screen_Feedback();
|
2020-07-15 02:09:49 +00:00
|
|
|
new WC_Admin_Notes_Set_Up_Additional_Payment_Types();
|
2020-07-22 18:24:03 +00:00
|
|
|
new WC_Admin_Notes_Test_Checkout();
|
2020-08-26 04:11:14 +00:00
|
|
|
new WC_Admin_Notes_Selling_Online_Courses();
|
2020-06-05 01:51:25 +00:00
|
|
|
|
|
|
|
// Initialize RemoteInboxNotificationsEngine.
|
|
|
|
RemoteInboxNotificationsEngine::init();
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-01-18 00:16:02 +00:00
|
|
|
* Set up our admin hooks and plugin loader.
|
2019-08-12 17:54:04 +00:00
|
|
|
*/
|
|
|
|
protected function hooks() {
|
2020-06-11 00:26:20 +00:00
|
|
|
add_filter( 'woocommerce_admin_features', array( $this, 'replace_supported_features' ), 0 );
|
2019-08-12 17:54:04 +00:00
|
|
|
add_action( 'admin_menu', array( $this, 'register_devdocs_page' ) );
|
|
|
|
|
2020-07-06 17:39:58 +00:00
|
|
|
Loader::get_instance();
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-11-07 07:37:35 +00:00
|
|
|
* Get an array of dependency error messages.
|
2019-08-12 17:54:04 +00:00
|
|
|
*
|
2019-11-07 07:37:35 +00:00
|
|
|
* @return array
|
2019-08-12 17:54:04 +00:00
|
|
|
*/
|
2019-11-07 07:37:35 +00:00
|
|
|
protected function get_dependency_errors() {
|
|
|
|
$errors = array();
|
|
|
|
$wordpress_version = get_bloginfo( 'version' );
|
2019-12-13 15:05:41 +00:00
|
|
|
$minimum_wordpress_version = '5.3';
|
2019-11-07 07:37:35 +00:00
|
|
|
$minimum_woocommerce_version = '3.6';
|
|
|
|
$wordpress_minimum_met = version_compare( $wordpress_version, $minimum_wordpress_version, '>=' );
|
|
|
|
$woocommerce_minimum_met = class_exists( 'WooCommerce' ) && version_compare( WC_VERSION, $minimum_woocommerce_version, '>=' );
|
|
|
|
|
2019-08-12 17:54:04 +00:00
|
|
|
if ( ! $woocommerce_minimum_met ) {
|
2019-11-07 07:37:35 +00:00
|
|
|
$errors[] = sprintf(
|
|
|
|
/* translators: 1: URL of WooCommerce plugin, 2: The minimum WooCommerce version number */
|
|
|
|
__( 'The WooCommerce Admin feature plugin requires <a href="%1$s">WooCommerce</a> %2$s or greater to be installed and active.', 'woocommerce-admin' ),
|
|
|
|
'https://wordpress.org/plugins/woocommerce/',
|
|
|
|
$minimum_woocommerce_version
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! $wordpress_minimum_met ) {
|
|
|
|
$errors[] = sprintf(
|
|
|
|
/* translators: 1: URL of WordPress.org, 2: The minimum WordPress version number */
|
|
|
|
__( 'The WooCommerce Admin feature plugin requires <a href="%1$s">WordPress</a> %2$s or greater to be installed and active.', 'woocommerce-admin' ),
|
|
|
|
'https://wordpress.org/',
|
|
|
|
$minimum_wordpress_version
|
|
|
|
);
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
2019-11-07 07:37:35 +00:00
|
|
|
return $errors;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true if all dependencies for the wc-admin plugin are loaded.
|
|
|
|
*
|
|
|
|
* @return bool
|
|
|
|
*/
|
2020-03-19 01:52:07 +00:00
|
|
|
public function has_satisfied_dependencies() {
|
2019-11-07 07:37:35 +00:00
|
|
|
$dependency_errors = $this->get_dependency_errors();
|
|
|
|
return 0 === count( $dependency_errors );
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Deactivates this plugin.
|
|
|
|
*/
|
|
|
|
public function deactivate_self() {
|
|
|
|
deactivate_plugins( plugin_basename( WC_ADMIN_PLUGIN_FILE ) );
|
2020-04-27 09:30:32 +00:00
|
|
|
unset( $_GET['activate'] ); // phpcs:ignore CSRF ok.
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notify users of the plugin requirements.
|
|
|
|
*/
|
|
|
|
public function render_dependencies_notice() {
|
2019-11-07 07:37:35 +00:00
|
|
|
$message = $this->get_dependency_errors();
|
|
|
|
printf( '<div class="error"><p>%s</p></div>', implode( ' ', $message ) ); /* phpcs:ignore xss ok. */
|
2019-08-12 17:54:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Overwrites the allowed features array using a local `feature-config.php` file.
|
|
|
|
*
|
|
|
|
* @param array $features Array of feature slugs.
|
|
|
|
*/
|
|
|
|
public function replace_supported_features( $features ) {
|
2019-12-05 23:06:11 +00:00
|
|
|
$feature_config = apply_filters( 'woocommerce_admin_get_feature_config', wc_admin_get_feature_config() );
|
2019-08-12 17:54:04 +00:00
|
|
|
$features = array_keys( array_filter( $feature_config ) );
|
|
|
|
return $features;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a menu item for the wc-admin devdocs.
|
|
|
|
*/
|
|
|
|
public function register_devdocs_page() {
|
2019-11-07 18:31:02 +00:00
|
|
|
if ( Loader::is_dev() ) {
|
2019-08-12 17:54:04 +00:00
|
|
|
wc_admin_register_page(
|
|
|
|
array(
|
|
|
|
'title' => 'DevDocs',
|
|
|
|
'parent' => 'woocommerce',
|
|
|
|
'path' => '/devdocs',
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Define constant if not already set.
|
|
|
|
*
|
|
|
|
* @param string $name Constant name.
|
|
|
|
* @param string|bool $value Constant value.
|
|
|
|
*/
|
|
|
|
protected function define( $name, $value ) {
|
|
|
|
if ( ! defined( $name ) ) {
|
|
|
|
define( $name, $value );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Prevent cloning.
|
|
|
|
*/
|
|
|
|
private function __clone() {}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Prevent unserializing.
|
|
|
|
*/
|
|
|
|
private function __wakeup() {}
|
2019-08-14 23:35:02 +00:00
|
|
|
}
|