From 2797883a48c9c8737c14b024c85678b607427709 Mon Sep 17 00:00:00 2001 From: Jeff Stieler Date: Fri, 8 Feb 2019 11:27:39 -0800 Subject: [PATCH] Move database table creation to new WC_Admin_Install class. Remove reliance on plugin activation hook, following pattern established in WC_Install. --- .../includes/class-wc-admin-api-init.php | 163 ----------- .../includes/class-wc-admin-install.php | 265 ++++++++++++++++++ plugins/woocommerce-admin/wc-admin.php | 24 +- 3 files changed, 267 insertions(+), 185 deletions(-) create mode 100644 plugins/woocommerce-admin/includes/class-wc-admin-install.php diff --git a/plugins/woocommerce-admin/includes/class-wc-admin-api-init.php b/plugins/woocommerce-admin/includes/class-wc-admin-api-init.php index 089f38c6f23..9df9f00f034 100644 --- a/plugins/woocommerce-admin/includes/class-wc-admin-api-init.php +++ b/plugins/woocommerce-admin/includes/class-wc-admin-api-init.php @@ -57,8 +57,6 @@ class WC_Admin_Api_Init { add_action( 'plugins_loaded', array( $this, 'init_classes' ), 19 ); // Hook in data stores. add_filter( 'woocommerce_data_stores', array( 'WC_Admin_Api_Init', 'add_data_stores' ) ); - // Add wc-admin report tables to list of WooCommerce tables. - add_filter( 'woocommerce_install_get_tables', array( 'WC_Admin_Api_Init', 'add_tables' ) ); // REST API extensions init. add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); add_filter( 'rest_endpoints', array( 'WC_Admin_Api_Init', 'filter_rest_endpoints' ), 10, 1 ); @@ -776,167 +774,6 @@ class WC_Admin_Api_Init { ); } - /** - * Adds new tables. - * - * @param array $wc_tables List of WooCommerce tables. - * @return array - */ - public static function add_tables( $wc_tables ) { - global $wpdb; - - return array_merge( - $wc_tables, - array( - // @todo Will this work on multisite? - "{$wpdb->prefix}wc_order_stats", - "{$wpdb->prefix}wc_order_product_lookup", - "{$wpdb->prefix}wc_order_tax_lookup", - "{$wpdb->prefix}wc_order_coupon_lookup", - "{$wpdb->prefix}wc_admin_notes", - "{$wpdb->prefix}wc_admin_note_actions", - "{$wpdb->prefix}wc_customer_lookup", - ) - ); - } - - /** - * Get database schema. - * - * @return string - */ - private static function get_schema() { - global $wpdb; - - if ( $wpdb->has_cap( 'collation' ) ) { - $collate = $wpdb->get_charset_collate(); - } - - $tables = " - CREATE TABLE {$wpdb->prefix}wc_order_stats ( - order_id bigint(20) unsigned NOT NULL, - date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, - num_items_sold int(11) UNSIGNED DEFAULT 0 NOT NULL, - gross_total double DEFAULT 0 NOT NULL, - coupon_total double DEFAULT 0 NOT NULL, - refund_total double DEFAULT 0 NOT NULL, - tax_total double DEFAULT 0 NOT NULL, - shipping_total double DEFAULT 0 NOT NULL, - net_total double DEFAULT 0 NOT NULL, - returning_customer boolean DEFAULT 0 NOT NULL, - status varchar(200) NOT NULL, - customer_id BIGINT UNSIGNED NOT NULL, - PRIMARY KEY (order_id), - KEY date_created (date_created), - KEY customer_id (customer_id), - KEY status (status) - ) $collate; - CREATE TABLE {$wpdb->prefix}wc_order_product_lookup ( - order_item_id BIGINT UNSIGNED NOT NULL, - order_id BIGINT UNSIGNED NOT NULL, - product_id BIGINT UNSIGNED NOT NULL, - variation_id BIGINT UNSIGNED NOT NULL, - customer_id BIGINT UNSIGNED NULL, - date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, - product_qty INT UNSIGNED NOT NULL, - product_net_revenue double DEFAULT 0 NOT NULL, - product_gross_revenue double DEFAULT 0 NOT NULL, - coupon_amount double DEFAULT 0 NOT NULL, - tax_amount double DEFAULT 0 NOT NULL, - shipping_amount double DEFAULT 0 NOT NULL, - shipping_tax_amount double DEFAULT 0 NOT NULL, - refund_amount double DEFAULT 0 NOT NULL, - PRIMARY KEY (order_item_id), - KEY order_id (order_id), - KEY product_id (product_id), - KEY customer_id (customer_id), - KEY date_created (date_created) - ) $collate; - CREATE TABLE {$wpdb->prefix}wc_order_tax_lookup ( - order_id BIGINT UNSIGNED NOT NULL, - tax_rate_id BIGINT UNSIGNED NOT NULL, - date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, - shipping_tax double DEFAULT 0 NOT NULL, - order_tax double DEFAULT 0 NOT NULL, - total_tax double DEFAULT 0 NOT NULL, - PRIMARY KEY (order_id, tax_rate_id), - KEY tax_rate_id (tax_rate_id), - KEY date_created (date_created) - ) $collate; - CREATE TABLE {$wpdb->prefix}wc_order_coupon_lookup ( - order_id BIGINT UNSIGNED NOT NULL, - coupon_id BIGINT UNSIGNED NOT NULL, - date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, - discount_amount double DEFAULT 0 NOT NULL, - PRIMARY KEY (order_id, coupon_id), - KEY coupon_id (coupon_id), - KEY date_created (date_created) - ) $collate; - CREATE TABLE {$wpdb->prefix}wc_admin_notes ( - note_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, - name varchar(255) NOT NULL, - type varchar(20) NOT NULL, - locale varchar(20) NOT NULL, - title longtext NOT NULL, - content longtext NOT NULL, - icon varchar(200) NOT NULL, - content_data longtext NULL default null, - status varchar(200) NOT NULL, - source varchar(200) NOT NULL, - date_created datetime NOT NULL default '0000-00-00 00:00:00', - date_reminder datetime NULL default null, - PRIMARY KEY (note_id) - ) $collate; - CREATE TABLE {$wpdb->prefix}wc_admin_note_actions ( - action_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, - note_id BIGINT UNSIGNED NOT NULL, - name varchar(255) NOT NULL, - label varchar(255) NOT NULL, - query longtext NOT NULL, - PRIMARY KEY (action_id), - KEY note_id (note_id) - ) $collate; - CREATE TABLE {$wpdb->prefix}wc_customer_lookup ( - customer_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, - user_id BIGINT UNSIGNED DEFAULT NULL, - username varchar(60) DEFAULT '' NOT NULL, - first_name varchar(255) NOT NULL, - last_name varchar(255) NOT NULL, - email varchar(100) NOT NULL, - date_last_active timestamp NULL default null, - date_registered timestamp NULL default null, - country char(2) DEFAULT '' NOT NULL, - postcode varchar(20) DEFAULT '' NOT NULL, - city varchar(100) DEFAULT '' NOT NULL, - PRIMARY KEY (customer_id), - UNIQUE KEY user_id (user_id), - KEY email (email) - ) $collate; - "; - - return $tables; - } - - /** - * Create database tables. - */ - public static function create_db_tables() { - require_once ABSPATH . 'wp-admin/includes/upgrade.php'; - - dbDelta( self::get_schema() ); - } - - /** - * Install plugin. - */ - public static function install() { - // Create tables. - self::create_db_tables(); - - // Initialize report tables. - add_action( 'woocommerce_after_register_post_type', array( __CLASS__, 'regenerate_report_data' ), 20 ); - } - /** * Add the currency symbol (in addition to currency code) to each Order * object in REST API responses. For use in formatCurrency(). diff --git a/plugins/woocommerce-admin/includes/class-wc-admin-install.php b/plugins/woocommerce-admin/includes/class-wc-admin-install.php new file mode 100644 index 00000000000..4eac2773cf6 --- /dev/null +++ b/plugins/woocommerce-admin/includes/class-wc-admin-install.php @@ -0,0 +1,265 @@ +has_cap( 'collation' ) ) { + $collate = $wpdb->get_charset_collate(); + } + + $tables = " + CREATE TABLE {$wpdb->prefix}wc_order_stats ( + order_id bigint(20) unsigned NOT NULL, + date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, + num_items_sold int(11) UNSIGNED DEFAULT 0 NOT NULL, + gross_total double DEFAULT 0 NOT NULL, + coupon_total double DEFAULT 0 NOT NULL, + refund_total double DEFAULT 0 NOT NULL, + tax_total double DEFAULT 0 NOT NULL, + shipping_total double DEFAULT 0 NOT NULL, + net_total double DEFAULT 0 NOT NULL, + returning_customer boolean DEFAULT 0 NOT NULL, + status varchar(200) NOT NULL, + customer_id BIGINT UNSIGNED NOT NULL, + PRIMARY KEY (order_id), + KEY date_created (date_created), + KEY customer_id (customer_id), + KEY status (status) + ) $collate; + CREATE TABLE {$wpdb->prefix}wc_order_product_lookup ( + order_item_id BIGINT UNSIGNED NOT NULL, + order_id BIGINT UNSIGNED NOT NULL, + product_id BIGINT UNSIGNED NOT NULL, + variation_id BIGINT UNSIGNED NOT NULL, + customer_id BIGINT UNSIGNED NULL, + date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, + product_qty INT UNSIGNED NOT NULL, + product_net_revenue double DEFAULT 0 NOT NULL, + product_gross_revenue double DEFAULT 0 NOT NULL, + coupon_amount double DEFAULT 0 NOT NULL, + tax_amount double DEFAULT 0 NOT NULL, + shipping_amount double DEFAULT 0 NOT NULL, + shipping_tax_amount double DEFAULT 0 NOT NULL, + refund_amount double DEFAULT 0 NOT NULL, + PRIMARY KEY (order_item_id), + KEY order_id (order_id), + KEY product_id (product_id), + KEY customer_id (customer_id), + KEY date_created (date_created) + ) $collate; + CREATE TABLE {$wpdb->prefix}wc_order_tax_lookup ( + order_id BIGINT UNSIGNED NOT NULL, + tax_rate_id BIGINT UNSIGNED NOT NULL, + date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, + shipping_tax double DEFAULT 0 NOT NULL, + order_tax double DEFAULT 0 NOT NULL, + total_tax double DEFAULT 0 NOT NULL, + PRIMARY KEY (order_id, tax_rate_id), + KEY tax_rate_id (tax_rate_id), + KEY date_created (date_created) + ) $collate; + CREATE TABLE {$wpdb->prefix}wc_order_coupon_lookup ( + order_id BIGINT UNSIGNED NOT NULL, + coupon_id BIGINT UNSIGNED NOT NULL, + date_created timestamp DEFAULT '0000-00-00 00:00:00' NOT NULL, + discount_amount double DEFAULT 0 NOT NULL, + PRIMARY KEY (order_id, coupon_id), + KEY coupon_id (coupon_id), + KEY date_created (date_created) + ) $collate; + CREATE TABLE {$wpdb->prefix}wc_admin_notes ( + note_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + name varchar(255) NOT NULL, + type varchar(20) NOT NULL, + locale varchar(20) NOT NULL, + title longtext NOT NULL, + content longtext NOT NULL, + icon varchar(200) NOT NULL, + content_data longtext NULL default null, + status varchar(200) NOT NULL, + source varchar(200) NOT NULL, + date_created datetime NOT NULL default '0000-00-00 00:00:00', + date_reminder datetime NULL default null, + PRIMARY KEY (note_id) + ) $collate; + CREATE TABLE {$wpdb->prefix}wc_admin_note_actions ( + action_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + note_id BIGINT UNSIGNED NOT NULL, + name varchar(255) NOT NULL, + label varchar(255) NOT NULL, + query longtext NOT NULL, + PRIMARY KEY (action_id), + KEY note_id (note_id) + ) $collate; + CREATE TABLE {$wpdb->prefix}wc_customer_lookup ( + customer_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + user_id BIGINT UNSIGNED DEFAULT NULL, + username varchar(60) DEFAULT '' NOT NULL, + first_name varchar(255) NOT NULL, + last_name varchar(255) NOT NULL, + email varchar(100) NOT NULL, + date_last_active timestamp NULL default null, + date_registered timestamp NULL default null, + country char(2) DEFAULT '' NOT NULL, + postcode varchar(20) DEFAULT '' NOT NULL, + city varchar(100) DEFAULT '' NOT NULL, + PRIMARY KEY (customer_id), + UNIQUE KEY user_id (user_id), + KEY email (email) + ) $collate; + "; + + return $tables; + } + + /** + * Create database tables. + */ + public static function create_tables() { + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + + dbDelta( self::get_schema() ); + } + + /** + * Return a list of tables. Used to make sure all WC Admin tables are dropped + * when uninstalling the plugin in a single site or multi site environment. + * + * @return array WC tables. + */ + public static function get_tables() { + global $wpdb; + + return array( + // @todo Will this work on multisite? + "{$wpdb->prefix}wc_order_stats", + "{$wpdb->prefix}wc_order_product_lookup", + "{$wpdb->prefix}wc_order_tax_lookup", + "{$wpdb->prefix}wc_order_coupon_lookup", + "{$wpdb->prefix}wc_admin_notes", + "{$wpdb->prefix}wc_admin_note_actions", + "{$wpdb->prefix}wc_customer_lookup", + ); + } + + /** + * Adds new tables. + * + * @param array $wc_tables List of WooCommerce tables. + * @return array + */ + public static function add_tables( $wc_tables ) { + return array_merge( + $wc_tables, + self::get_tables() + ); + } + + /** + * Uninstall tables when MU blog is deleted. + * + * @param array $tables List of tables that will be deleted by WP. + * + * @return string[] + */ + public static function wpmu_drop_tables( $tables ) { + return array_merge( $tables, self::get_tables() ); + } + + /** + * Update WC Admin version to current. + */ + private static function update_wc_admin_version() { + delete_option( self::VERSION_OPTION ); + add_option( self::VERSION_OPTION, self::VERSION_NUMBER ); + } +} + +WC_Admin_Install::init(); diff --git a/plugins/woocommerce-admin/wc-admin.php b/plugins/woocommerce-admin/wc-admin.php index b933745e927..513c9051ef3 100755 --- a/plugins/woocommerce-admin/wc-admin.php +++ b/plugins/woocommerce-admin/wc-admin.php @@ -98,16 +98,12 @@ function do_wc_admin_daily() { add_action( 'wc_admin_daily', 'do_wc_admin_daily' ); /** - * Activates wc-admin plugin when installed. + * Initializes wc-admin daily action when plugin activated. */ function activate_wc_admin_plugin() { if ( ! dependencies_satisfied() ) { return; } - // Initialize the WC API extensions. - require_once dirname( __FILE__ ) . '/includes/class-wc-admin-api-init.php'; - - WC_Admin_Api_Init::install(); if ( ! wp_next_scheduled( 'wc_admin_daily' ) ) { wp_schedule_event( time(), 'daily', 'wc_admin_daily' ); @@ -134,23 +130,6 @@ function deactivate_wc_admin_plugin() { } register_deactivation_hook( WC_ADMIN_PLUGIN_FILE, 'deactivate_wc_admin_plugin' ); -/** - * Update the database tables if needed. This hooked function does NOT need to - * be ported to WooCommerce's code base - WC_Install will do this on plugin - * update automatically. - */ -function wc_admin_init() { - if ( ! dependencies_satisfied() ) { - return; - } - - // Only create/update tables on init if WP_DEBUG is true. - if ( defined( 'WP_DEBUG' ) && WP_DEBUG && wc_admin_build_file_exists() ) { - WC_Admin_Api_Init::create_db_tables(); - } -} -add_action( 'init', 'wc_admin_init' ); - /** * Set up the plugin, only if we can detect both Gutenberg and WooCommerce */ @@ -161,6 +140,7 @@ function wc_admin_plugins_loaded() { } // Initialize the WC API extensions. + require_once dirname( __FILE__ ) . '/includes/class-wc-admin-install.php'; require_once dirname( __FILE__ ) . '/includes/class-wc-admin-api-init.php'; // Some common utilities.