2019-08-12 17:54:04 +00:00
< ? php
/**
* WooCommerce Admin : Feature plugin main class .
*
* @ package WooCommerce Admin
*/
namespace Automattic\WooCommerce\Admin ;
defined ( 'ABSPATH' ) || exit ;
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes ;
2019-09-11 10:11:07 +00:00
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Facebook_Extension ;
2019-08-12 17:54:04 +00:00
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Historical_Data ;
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Order_Milestones ;
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Welcome_Message ;
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 ;
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 {
add_action ( 'plugins_loaded' , array ( $this , 'on_plugins_loaded' ) );
}
2019-08-12 17:54:04 +00:00
add_filter ( 'action_scheduler_store_class' , array ( $this , 'replace_actionscheduler_store_class' ) );
}
/**
* 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 ;
}
if ( ! $this -> check_build () ) {
add_action ( 'admin_notices' , array ( $this , 'render_build_notice' ) );
}
$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.
Merge final `version/1.0` branch with `master` (https://github.com/woocommerce/woocommerce-admin/pull/3848)
* Try: Moving Customers to main Woo Menu (https://github.com/woocommerce/woocommerce-admin/pull/3632)
* Only add onboarding settings on wc-admin pages when task list should be shown. (https://github.com/woocommerce/woocommerce-admin/pull/3722)
* Use cron for unsnoozing admin notes (https://github.com/woocommerce/woocommerce-admin/pull/3662)
* Use wp-cron for admin note snoozing.
* Remove "unsnooze" scheduled action.
* Use correct version.
* Avoid using deprecated method for unscheduling actions.
* Onboarding: Fix toggle tracking events (https://github.com/woocommerce/woocommerce-admin/pull/3645)
* Fix errant wcadmin prefix on event name
* Track the onboarding toggle on the option in case enable_onboarding isn't used
* Move toggle actions to separate function
* Move onboarding actions
* Move onboarding filters
* Move help tab updates to add_toggle_actions
* Only run onboarding actions when enabled
* Onboarding: Add tracks events when profiler steps are completed (https://github.com/woocommerce/woocommerce-admin/pull/3726)
* Add tracks for store profiler step completion
* Record event when profiler is completed
* Ensure continue setup loads the onboarding profiler (https://github.com/woocommerce/woocommerce-admin/pull/3646)
* 'All that include' option removed when input field is empty (https://github.com/woocommerce/woocommerce-admin/pull/3700)
* 'All that include' option removed when input field is empty
Added a control to check that when the input field 'Search by customer name' is empty, the 'All that include' option is not appearing.
* Const name improved
The constant name hasValues was changed to optionsHaveValues (more descriptive)
* Fix select text alignment (https://github.com/woocommerce/woocommerce-admin/pull/3723)
* Stock panel indicator - cache and use lookup tables. (https://github.com/woocommerce/woocommerce-admin/pull/3729)
* Stock panel indicator - cache and use lookup tables.
* Revise query, clear transient on product update.
* Fix error, ht Josh.
* Checklist: Remove sideloaded images to reduce build size, take 2 (https://github.com/woocommerce/woocommerce-admin/pull/3731)
* Remove homepage template images.
* Use other-small on all industries, adjust text color.
* Remove background dim and opacity set to 0
* Fix/3631 (https://github.com/woocommerce/woocommerce-admin/pull/3730)
* Added CBD as an industry type
CBD was added as an industry type in API
* Industries options modified
Modified the industries options. Now we are able to choose if we will use an input or not in the option.
* API control changed for industries.
API control changed for industries. Now it accepts the data type we need.
* Added input in Industries list for the option "Other"
Added an input for the option "Other" in the industries list
* Added suggested changes in review comments.
* Added data preparation for recordEvent
* Changed variable to snake_case
The variable "industriesWithDetail" was changed to "industries_with_detail" (snake_case)
* Onboarding: Create homepage without redirect (https://github.com/woocommerce/woocommerce-admin/pull/3727)
* Add link to edit homepage instead of redirect
* Add busy state to homepage creation button
* Publish homepage on create via API
* Update homepage notice to show on first post update
* Update homepage creation notice per design
* Record event on customize homepage
* Set homepage to frontpage on creation
* Add deactivation note for feature plugin (https://github.com/woocommerce/woocommerce-admin/pull/3687)
* Add version deactivation note
* Add the note to deactivate if the version is older than the current WC version
* Deactivate wc admin feature plugin on action click
* Add notes version hooks
* change the Package class namespace to exclude from standalone autoloader
* add use statement for FeaturePlugin
* add note explaining namespace
* use wc-admin-deactivate-plugin note name
* Rename file and class to WC_Admin_Notes_Deactivate_Plugin
Co-authored-by: Ron Rennick <ron@ronandandrea.com>
Co-authored-by: Paul Sealock <psealock@gmail.com>
* Add Travis tests on GH for release branch (https://github.com/woocommerce/woocommerce-admin/pull/3751)
* Add Travis tests on GH for release branch
* fix linter errors
* ActivityPanels.php -> use public static functions
* Remove free text Search option when no query exists (https://github.com/woocommerce/woocommerce-admin/pull/3755)
* Revert changes in woocommerce/woocommerce-admin#3700
* Don't add free text search if no query exists
* Add tests for Search without query
* Add test for showing free text search option
* Fix image sideloading for store industries. (https://github.com/woocommerce/woocommerce-admin/pull/3743)
* Fix image sideloading for store industries.
Data format changed in https://github.com/woocommerce/woocommerce-admin/pull/3730
* Fix industry image sideload in cases where the count is less than requested.
* Be backwards compatible with the old industry data format.
* Added event props to identify stores with WCS and Jetpack installed (https://github.com/woocommerce/woocommerce-admin/pull/3750)
* Added event props to identify stores with WCS and Jetpack installed
Also, added Jeckpack connected status
* Improved variable name
* Simplified method
Simplified method. "intersection" check was removed
* Tests errors repeared
The method "clear_low_out_of_stock_count_transient" now is static.
* OBW: fix sideloading image test error (https://github.com/woocommerce/woocommerce-admin/pull/3762)
* Release 0.26.0 changes (https://github.com/woocommerce/woocommerce-admin/pull/3753)
* add deactivation hook to Package.php (https://github.com/woocommerce/woocommerce-admin/pull/3770)
* Add active version functions (https://github.com/woocommerce/woocommerce-admin/pull/3772)
* add active version functions to Package.php
Co-authored-by: Joshua T Flowers <joshuatf@gmail.com>
* 0.26.1 changes (https://github.com/woocommerce/woocommerce-admin/pull/3773)
* Customers Report: fix missing report param in search (https://github.com/woocommerce/woocommerce-admin/pull/3778)
* Product titles include encoded entities (https://github.com/woocommerce/woocommerce-admin/pull/3765)
* Stripped HTML from product titles and decoded before displaying them
Stripped html from product titles and entities are decoded before displaying them
* Stripped HTML from product titles and decoded in Stock report
Stripped html from product titles and entities are decoded before displaying them. Now in Stock report
* Added support for HTML tags and encoded entities on product titles
Added support for HTML tags and encoded entities on filtered product list, dropdown menus and tag names.
Also, strip_tags() function was replaced with wp_strip_all_tags() instead.
* strip_tags() function was replaced with wp_strip_all_tags() instead.
* Added control for a variable
Added control for "item->data" before applying wp_strip_all_tags method.
* pre-commit changes
* Test text corrected
* Enable taxes on automatic tax setup (https://github.com/woocommerce/woocommerce-admin/pull/3795)
* Update Country Labeling to Match Core (https://github.com/woocommerce/woocommerce-admin/pull/3790)
* Updated country labeling
Country labeling on Customer Report was updated
* Updated country labeling in other files
* remove .jitm-card notice padding (https://github.com/woocommerce/woocommerce-admin/pull/3814)
* OBW Connect: Fix requesting state (https://github.com/woocommerce/woocommerce-admin/pull/3786)
* OBW Connect: Fix requesting state
* pass down setIsPending
* setIspending propType
* defaultProps
* test
* Revert "test"
This reverts commit e921092b19401931cc1aec8ee84fa53c53b67f36.
* better comparison for redirect
* Fixes Taxes Report search bug and adds initial documentation. (https://github.com/woocommerce/woocommerce-admin/pull/3816)
* Initial Taxes Report documentation.
* Fix taxes endpoint search parameter.
* OBW: Fix retry plugin install button disappearing (https://github.com/woocommerce/woocommerce-admin/pull/3787)
* OBW: Fix retry plugin install btn disappearing
* try suggestion
* Revert "try suggestion"
This reverts commit 5b9386957a501ac3e729e5f16b0ee71c9d792859.
* Fix special character escaping in search. (https://github.com/woocommerce/woocommerce-admin/pull/3826)
* Properly prepare/escape special characters in Product search.
* Properly prepare/escape special characters in Coupon search.
* Properly prepare/escape special characters in Tax code search.
* Fix tracking on migrated options (https://github.com/woocommerce/woocommerce-admin/pull/3828)
* Don't track onboarding toggle if migrating options
* Prevent WC_Tracks from recording event post types not yet registered
* Activity Panels: Remove W Panel (https://github.com/woocommerce/woocommerce-admin/pull/3827)
* Remove W Notif Panel.
* Add back in trapping logic, and hide on non-embed pages.
* add npm run test:zip command (https://github.com/woocommerce/woocommerce-admin/pull/3823)
* add npm run test:zip command
* 1.0.0 release changes🎉 (https://github.com/woocommerce/woocommerce-admin/pull/3831)
* 1.0.0 release changes🎉
* changelog
* 0.26.1 changelog
* Add Report Extension Example: Add default props to ReportFilters (https://github.com/woocommerce/woocommerce-admin/pull/3830)
* ReportFilters component: Add sane defaults
* styles
* add required column
* add left join to sku ordering (https://github.com/woocommerce/woocommerce-admin/pull/3845)
* Deal with lint errors, and improperly merged files
* regenerate package-lock.json
* attempting to resolve package lock conflict.
Co-authored-by: Jeff Stieler <jeff.m.stieler@gmail.com>
Co-authored-by: Joshua T Flowers <joshuatf@gmail.com>
Co-authored-by: Ron Rennick <ron@ronandandrea.com>
Co-authored-by: Fernando <ultimoround@gmail.com>
Co-authored-by: edmundcwm <edmundcwm@gmail.com>
Co-authored-by: Paul Sealock <psealock@gmail.com>
2020-03-10 02:47:39 +00:00
$this -> define ( 'WC_ADMIN_VERSION_NUMBER' , '1.0.0' );
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 ();
new API\Init ();
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 ();
new WC_Admin_Notes_Welcome_Message ();
2019-08-15 02:32:59 +00:00
new WC_Admin_Notes_Facebook_Extension ();
2019-11-07 16:29:36 +00:00
new WC_Admin_Notes_Tracking_Opt_In ();
2019-08-12 17:54:04 +00:00
}
/**
* Filter in our ActionScheduler Store class .
*
* @ param string $store_class ActionScheduler Store class name .
* @ return string ActionScheduler Store class name .
*/
public function replace_actionscheduler_store_class ( $store_class ) {
// Don't override any other overrides.
if ( 'ActionScheduler_wpPostStore' !== $store_class ) {
return $store_class ;
}
2019-08-12 13:58:25 +00:00
// Don't override if action scheduler is 3.0.0 or greater.
if ( version_compare ( \ActionScheduler_Versions :: instance () -> latest_version (), '3.0' , '>=' ) ) {
return $store_class ;
}
2019-08-12 21:52:09 +00:00
return 'Automattic\WooCommerce\Admin\Overrides\WPPostStore' ;
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 () {
add_filter ( 'woocommerce_admin_features' , array ( $this , 'replace_supported_features' ) );
add_action ( 'admin_menu' , array ( $this , 'register_devdocs_page' ) );
2020-01-18 00:16:02 +00:00
new Loader ();
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
*/
protected function has_satisfied_dependencies () {
$dependency_errors = $this -> get_dependency_errors ();
return 0 === count ( $dependency_errors );
2019-08-12 17:54:04 +00:00
}
/**
* Returns true if build file exists .
*
* @ return bool
*/
protected function check_build () {
return file_exists ( plugin_dir_path ( __DIR__ ) . '/dist/app/index.js' );
}
/**
* Deactivates this plugin .
*/
public function deactivate_self () {
deactivate_plugins ( plugin_basename ( WC_ADMIN_PLUGIN_FILE ) );
unset ( $_GET [ 'activate' ] );
}
/**
* 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
}
/**
* Notify users that the plugin needs to be built .
*/
public function render_build_notice () {
$message_one = __ ( 'You have installed a development version of WooCommerce Admin which requires files to be built. From the plugin directory, run <code>npm install</code> to install dependencies, <code>npm run build</code> to build the files.' , 'woocommerce-admin' );
$message_two = sprintf (
/* translators: 1: URL of GitHub Repository build page */
__ ( 'Or you can download a pre-built version of the plugin by visiting <a href="%1$s">the releases page in the repository</a>.' , 'woocommerce-admin' ),
'https://github.com/woocommerce/woocommerce-admin/releases'
);
2019-11-07 07:37:35 +00:00
printf ( '<div class="error"><p>%s %s</p></div>' , $message_one , $message_two ); /* 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
}