diff --git a/includes/admin/class-wc-admin-status.php b/includes/admin/class-wc-admin-status.php index f29a85bd856..13429548423 100644 --- a/includes/admin/class-wc-admin-status.php +++ b/includes/admin/class-wc-admin-status.php @@ -93,9 +93,8 @@ class WC_Admin_Status { break; case 'reset_roles' : // Remove then re-add caps and roles - $installer = include( WC()->plugin_path() . '/includes/class-wc-install.php' ); - $installer->remove_roles(); - $installer->create_roles(); + WC_Install::remove_roles(); + WC_Install::create_roles(); echo '

' . __( 'Roles successfully reset', 'woocommerce' ) . '

'; break; diff --git a/includes/class-wc-install.php b/includes/class-wc-install.php index 44121b37eeb..8034217da2e 100644 --- a/includes/class-wc-install.php +++ b/includes/class-wc-install.php @@ -5,15 +5,13 @@ * @author WooThemes * @category Admin * @package WooCommerce/Classes - * @version 2.1.0 + * @version 2.3.0 */ if ( ! defined( 'ABSPATH' ) ) { - exit; // Exit if accessed directly + exit; } -if ( ! class_exists( 'WC_Install' ) ) : - /** * WC_Install Class */ @@ -22,31 +20,23 @@ class WC_Install { /** * Hook in tabs. */ - public function __construct() { - // Run this on activation. - register_activation_hook( WC_PLUGIN_FILE, array( $this, 'install' ) ); + public static function init() { + register_activation_hook( WC_PLUGIN_FILE, array( __CLASS__, 'install' ) ); - // Hooks - add_action( 'admin_init', array( $this, 'install_actions' ) ); - add_action( 'admin_init', array( $this, 'check_version' ), 5 ); - add_action( 'in_plugin_update_message-woocommerce/woocommerce.php', array( $this, 'in_plugin_update_message' ) ); - add_filter( 'plugin_action_links_' . WC_PLUGIN_BASENAME, array( $this, 'plugin_action_links' ) ); - add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 ); - - if ( is_multisite() ) { - add_filter( 'wpmu_drop_tables', array( $this, 'wpmu_drop_tables' ) ); - } + add_action( 'admin_init', array( __CLASS__, 'check_version' ), 5 ); + add_action( 'admin_init', array( __CLASS__, 'install_actions' ) ); + add_action( 'in_plugin_update_message-woocommerce/woocommerce.php', array( __CLASS__, 'in_plugin_update_message' ) ); + add_filter( 'plugin_action_links_' . WC_PLUGIN_BASENAME, array( __CLASS__, 'plugin_action_links' ) ); + add_filter( 'plugin_row_meta', array( __CLASS__, 'plugin_row_meta' ), 10, 2 ); + add_filter( 'wpmu_drop_tables', array( __CLASS__, 'wpmu_drop_tables' ) ); } /** * check_version function. - * - * @return void */ - public function check_version() { + public static function check_version() { if ( ! defined( 'IFRAME_REQUEST' ) && ( get_option( 'woocommerce_version' ) != WC()->version || get_option( 'woocommerce_db_version' ) != WC()->version ) ) { - $this->install(); - + self::install(); do_action( 'woocommerce_updated' ); } } @@ -54,7 +44,7 @@ class WC_Install { /** * Install actions such as installing pages when a button is clicked. */ - public function install_actions() { + public static function install_actions() { // Install - Add pages button if ( ! empty( $_GET['install_woocommerce_pages'] ) ) { @@ -82,7 +72,7 @@ class WC_Install { // Update button } elseif ( ! empty( $_GET['do_update_woocommerce'] ) ) { - $this->update(); + self::update(); // Update complete delete_option( '_wc_needs_pages' ); @@ -98,10 +88,10 @@ class WC_Install { /** * Install WC */ - public function install() { - $this->create_options(); - $this->create_tables(); - $this->create_roles(); + public static function install() { + self::create_options(); + self::create_tables(); + self::create_roles(); // Register post types include_once( 'class-wc-post-types.php' ); @@ -112,9 +102,9 @@ class WC_Install { WC()->query->init_query_vars(); WC()->query->add_endpoints(); - $this->create_terms(); - $this->create_cron_jobs(); - $this->create_files(); + self::create_terms(); + self::create_cron_jobs(); + self::create_files(); // Queue upgrades $current_db_version = get_option( 'woocommerce_db_version', null ); @@ -143,46 +133,20 @@ class WC_Install { /** * Handle updates */ - public function update() { - // Do updates + private static function update() { $current_db_version = get_option( 'woocommerce_db_version' ); + $db_updates = array( + '2.0.0' => 'updates/woocommerce-update-2.0.php', + '2.0.9' => 'updates/woocommerce-update-2.0.9.php', + '2.1.0' => 'updates/woocommerce-update-2.1.php', + '2.2.0' => 'updates/woocommerce-update-2.2.php' + ); - if ( version_compare( $current_db_version, '1.4', '<' ) ) { - include( 'updates/woocommerce-update-1.4.php' ); - update_option( 'woocommerce_db_version', '1.4' ); - } - - if ( version_compare( $current_db_version, '1.5', '<' ) ) { - include( 'updates/woocommerce-update-1.5.php' ); - update_option( 'woocommerce_db_version', '1.5' ); - } - - if ( version_compare( $current_db_version, '2.0', '<' ) ) { - include( 'updates/woocommerce-update-2.0.php' ); - update_option( 'woocommerce_db_version', '2.0' ); - } - - if ( version_compare( $current_db_version, '2.0.9', '<' ) ) { - include( 'updates/woocommerce-update-2.0.9.php' ); - update_option( 'woocommerce_db_version', '2.0.9' ); - } - - if ( version_compare( $current_db_version, '2.0.14', '<' ) ) { - if ( 'HU' == get_option( 'woocommerce_default_country' ) ) { - update_option( 'woocommerce_default_country', 'HU:BU' ); + foreach ( $db_updates as $version => $updater ) { + if ( version_compare( $current_db_version, $version, '<' ) ) { + include( $updater ); + update_option( 'woocommerce_db_version', $version ); } - - update_option( 'woocommerce_db_version', '2.0.14' ); - } - - if ( version_compare( $current_db_version, '2.1.0', '<' ) || WC_VERSION == '2.1-bleeding' ) { - include( 'updates/woocommerce-update-2.1.php' ); - update_option( 'woocommerce_db_version', '2.1.0' ); - } - - if ( version_compare( $current_db_version, '2.2.0', '<' ) || WC_VERSION == '2.2-bleeding' ) { - include( 'updates/woocommerce-update-2.2.php' ); - update_option( 'woocommerce_db_version', '2.2.0' ); } update_option( 'woocommerce_db_version', WC()->version ); @@ -191,8 +155,7 @@ class WC_Install { /** * Create cron jobs (clear them first) */ - private function create_cron_jobs() { - // Cron jobs + private static function create_cron_jobs() { wp_clear_scheduled_hook( 'woocommerce_scheduled_sales' ); wp_clear_scheduled_hook( 'woocommerce_cancel_unpaid_orders' ); wp_clear_scheduled_hook( 'woocommerce_cleanup_sessions' ); @@ -202,11 +165,7 @@ class WC_Install { wp_schedule_event( strtotime( '00:00 tomorrow ' . $ve . get_option( 'gmt_offset' ) . ' HOURS' ), 'daily', 'woocommerce_scheduled_sales' ); - $held_duration = get_option( 'woocommerce_hold_stock_minutes', null ); - - if ( is_null( $held_duration ) ) { - $held_duration = '60'; - } + $held_duration = get_option( 'woocommerce_hold_stock_minutes', '60' ); if ( $held_duration != '' ) { wp_schedule_single_event( time() + ( absint( $held_duration ) * 60 ), 'woocommerce_cancel_unpaid_orders' ); @@ -218,10 +177,10 @@ class WC_Install { /** * Create pages that the plugin relies on, storing page id's in variables. - * - * @return void */ public static function create_pages() { + include_once( 'admin/wc-admin-functions.php' ); + $pages = apply_filters( 'woocommerce_create_pages', array( 'shop' => array( 'name' => _x( 'shop', 'Page slug', 'woocommerce' ), @@ -250,39 +209,12 @@ class WC_Install { } } - /** - * Add the default terms for WC taxonomies - product types and order statuses. Modify this at your own risk. - * - * @return void - */ - private function create_terms() { - - $taxonomies = array( - 'product_type' => array( - 'simple', - 'grouped', - 'variable', - 'external' - ) - ); - - foreach ( $taxonomies as $taxonomy => $terms ) { - foreach ( $terms as $term ) { - if ( ! get_term_by( 'slug', sanitize_title( $term ), $taxonomy ) ) { - wp_insert_term( $term, $taxonomy ); - } - } - } - } - /** * Default options * * Sets up the default options used on the settings page - * - * @return void */ - public function create_options() { + private static function create_options() { // Include settings so that we can run through defaults include_once( 'admin/class-wc-admin-settings.php' ); @@ -312,6 +244,28 @@ class WC_Install { } } + /** + * Add the default terms for WC taxonomies - product types and order statuses. Modify this at your own risk. + */ + private static function create_terms() { + $taxonomies = array( + 'product_type' => array( + 'simple', + 'grouped', + 'variable', + 'external' + ) + ); + + foreach ( $taxonomies as $taxonomy => $terms ) { + foreach ( $terms as $term ) { + if ( ! get_term_by( 'slug', sanitize_title( $term ), $taxonomy ) ) { + wp_insert_term( $term, $taxonomy ); + } + } + } + } + /** * Set up the database tables which the plugin needs to function. * @@ -327,28 +281,15 @@ class WC_Install { * * @return void */ - private function create_tables() { + private static function create_tables() { global $wpdb; $wpdb->hide_errors(); - $collate = ''; - - if ( $wpdb->has_cap( 'collation' ) ) { - if ( ! empty($wpdb->charset ) ) { - $collate .= "DEFAULT CHARACTER SET $wpdb->charset"; - } - if ( ! empty($wpdb->collate ) ) { - $collate .= " COLLATE $wpdb->collate"; - } - } - require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); /** - * Update schemas before DBDELTA - * - * Before updating, remove any primary keys which could be modified due to schema updates + * Before updating with DBDELTA, remove any primary keys which could be modified due to schema updates */ if ( $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->prefix}woocommerce_downloadable_product_permissions';" ) ) { if ( ! $wpdb->get_var( "SHOW COLUMNS FROM `{$wpdb->prefix}woocommerce_downloadable_product_permissions` LIKE 'permission_id';" ) ) { @@ -356,162 +297,180 @@ class WC_Install { } } - // WooCommerce Tables - $woocommerce_tables = " - CREATE TABLE {$wpdb->prefix}woocommerce_attribute_taxonomies ( - attribute_id bigint(20) NOT NULL auto_increment, - attribute_name varchar(200) NOT NULL, - attribute_label longtext NULL, - attribute_type varchar(200) NOT NULL, - attribute_orderby varchar(200) NOT NULL, - PRIMARY KEY (attribute_id), - KEY attribute_name (attribute_name) - ) $collate; - CREATE TABLE {$wpdb->prefix}woocommerce_termmeta ( - meta_id bigint(20) NOT NULL auto_increment, - woocommerce_term_id bigint(20) NOT NULL, - meta_key varchar(255) NULL, - meta_value longtext NULL, - PRIMARY KEY (meta_id), - KEY woocommerce_term_id (woocommerce_term_id), - KEY meta_key (meta_key) - ) $collate; - CREATE TABLE {$wpdb->prefix}woocommerce_downloadable_product_permissions ( - permission_id bigint(20) NOT NULL auto_increment, - download_id varchar(32) NOT NULL, - product_id bigint(20) NOT NULL, - order_id bigint(20) NOT NULL DEFAULT 0, - order_key varchar(200) NOT NULL, - user_email varchar(200) NOT NULL, - user_id bigint(20) NULL, - downloads_remaining varchar(9) NULL, - access_granted datetime NOT NULL default '0000-00-00 00:00:00', - access_expires datetime NULL default null, - download_count bigint(20) NOT NULL DEFAULT 0, - PRIMARY KEY (permission_id), - KEY download_order_key_product (product_id,order_id,order_key,download_id), - KEY download_order_product (download_id,order_id,product_id) - ) $collate; - CREATE TABLE {$wpdb->prefix}woocommerce_order_items ( - order_item_id bigint(20) NOT NULL auto_increment, - order_item_name longtext NOT NULL, - order_item_type varchar(200) NOT NULL DEFAULT '', - order_id bigint(20) NOT NULL, - PRIMARY KEY (order_item_id), - KEY order_id (order_id) - ) $collate; - CREATE TABLE {$wpdb->prefix}woocommerce_order_itemmeta ( - meta_id bigint(20) NOT NULL auto_increment, - order_item_id bigint(20) NOT NULL, - meta_key varchar(255) NULL, - meta_value longtext NULL, - PRIMARY KEY (meta_id), - KEY order_item_id (order_item_id), - KEY meta_key (meta_key) - ) $collate; - CREATE TABLE {$wpdb->prefix}woocommerce_tax_rates ( - tax_rate_id bigint(20) NOT NULL auto_increment, - tax_rate_country varchar(200) NOT NULL DEFAULT '', - tax_rate_state varchar(200) NOT NULL DEFAULT '', - tax_rate varchar(200) NOT NULL DEFAULT '', - tax_rate_name varchar(200) NOT NULL DEFAULT '', - tax_rate_priority bigint(20) NOT NULL, - tax_rate_compound int(1) NOT NULL DEFAULT 0, - tax_rate_shipping int(1) NOT NULL DEFAULT 1, - tax_rate_order bigint(20) NOT NULL, - tax_rate_class varchar(200) NOT NULL DEFAULT '', - PRIMARY KEY (tax_rate_id), - KEY tax_rate_country (tax_rate_country), - KEY tax_rate_state (tax_rate_state), - KEY tax_rate_class (tax_rate_class), - KEY tax_rate_priority (tax_rate_priority) - ) $collate; - CREATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations ( - location_id bigint(20) NOT NULL auto_increment, - location_code varchar(255) NOT NULL, - tax_rate_id bigint(20) NOT NULL, - location_type varchar(40) NOT NULL, - PRIMARY KEY (location_id), - KEY tax_rate_id (tax_rate_id), - KEY location_type (location_type), - KEY location_type_code (location_type,location_code) - ) $collate; - "; - dbDelta( $woocommerce_tables ); + dbDelta( self::get_schema() ); + } + + /** + * Get Table schema + * @return string + */ + private static function get_schema() { + global $wpdb; + + $collate = ''; + + if ( $wpdb->has_cap( 'collation' ) ) { + if ( ! empty( $wpdb->charset ) ) { + $collate .= "DEFAULT CHARACTER SET $wpdb->charset"; + } + if ( ! empty( $wpdb->collate ) ) { + $collate .= " COLLATE $wpdb->collate"; + } + } + + return " +CREATE TABLE {$wpdb->prefix}woocommerce_attribute_taxonomies ( + attribute_id bigint(20) NOT NULL auto_increment, + attribute_name varchar(200) NOT NULL, + attribute_label longtext NULL, + attribute_type varchar(200) NOT NULL, + attribute_orderby varchar(200) NOT NULL, + PRIMARY KEY (attribute_id), + KEY attribute_name (attribute_name) +) $collate; +CREATE TABLE {$wpdb->prefix}woocommerce_termmeta ( + meta_id bigint(20) NOT NULL auto_increment, + woocommerce_term_id bigint(20) NOT NULL, + meta_key varchar(255) NULL, + meta_value longtext NULL, + PRIMARY KEY (meta_id), + KEY woocommerce_term_id (woocommerce_term_id), + KEY meta_key (meta_key) +) $collate; +CREATE TABLE {$wpdb->prefix}woocommerce_downloadable_product_permissions ( + permission_id bigint(20) NOT NULL auto_increment, + download_id varchar(32) NOT NULL, + product_id bigint(20) NOT NULL, + order_id bigint(20) NOT NULL DEFAULT 0, + order_key varchar(200) NOT NULL, + user_email varchar(200) NOT NULL, + user_id bigint(20) NULL, + downloads_remaining varchar(9) NULL, + access_granted datetime NOT NULL default '0000-00-00 00:00:00', + access_expires datetime NULL default null, + download_count bigint(20) NOT NULL DEFAULT 0, + PRIMARY KEY (permission_id), + KEY download_order_key_product (product_id,order_id,order_key,download_id), + KEY download_order_product (download_id,order_id,product_id) +) $collate; +CREATE TABLE {$wpdb->prefix}woocommerce_order_items ( + order_item_id bigint(20) NOT NULL auto_increment, + order_item_name longtext NOT NULL, + order_item_type varchar(200) NOT NULL DEFAULT '', + order_id bigint(20) NOT NULL, + PRIMARY KEY (order_item_id), + KEY order_id (order_id) +) $collate; +CREATE TABLE {$wpdb->prefix}woocommerce_order_itemmeta ( + meta_id bigint(20) NOT NULL auto_increment, + order_item_id bigint(20) NOT NULL, + meta_key varchar(255) NULL, + meta_value longtext NULL, + PRIMARY KEY (meta_id), + KEY order_item_id (order_item_id), + KEY meta_key (meta_key) +) $collate; +CREATE TABLE {$wpdb->prefix}woocommerce_tax_rates ( + tax_rate_id bigint(20) NOT NULL auto_increment, + tax_rate_country varchar(200) NOT NULL DEFAULT '', + tax_rate_state varchar(200) NOT NULL DEFAULT '', + tax_rate varchar(200) NOT NULL DEFAULT '', + tax_rate_name varchar(200) NOT NULL DEFAULT '', + tax_rate_priority bigint(20) NOT NULL, + tax_rate_compound int(1) NOT NULL DEFAULT 0, + tax_rate_shipping int(1) NOT NULL DEFAULT 1, + tax_rate_order bigint(20) NOT NULL, + tax_rate_class varchar(200) NOT NULL DEFAULT '', + PRIMARY KEY (tax_rate_id), + KEY tax_rate_country (tax_rate_country), + KEY tax_rate_state (tax_rate_state), + KEY tax_rate_class (tax_rate_class), + KEY tax_rate_priority (tax_rate_priority) +) $collate; +CREATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations ( + location_id bigint(20) NOT NULL auto_increment, + location_code varchar(255) NOT NULL, + tax_rate_id bigint(20) NOT NULL, + location_type varchar(40) NOT NULL, + PRIMARY KEY (location_id), + KEY tax_rate_id (tax_rate_id), + KEY location_type (location_type), + KEY location_type_code (location_type,location_code) +) $collate; + "; } /** * Create roles and capabilities */ - public function create_roles() { + public static function create_roles() { global $wp_roles; - if ( class_exists( 'WP_Roles' ) ) { - if ( ! isset( $wp_roles ) ) { - $wp_roles = new WP_Roles(); - } + if ( ! class_exists( 'WP_Roles' ) ) { + return; } - if ( is_object( $wp_roles ) ) { + if ( ! isset( $wp_roles ) ) { + $wp_roles = new WP_Roles(); + } - // Customer role - add_role( 'customer', __( 'Customer', 'woocommerce' ), array( - 'read' => true, - 'edit_posts' => false, - 'delete_posts' => false - ) ); + // Customer role + add_role( 'customer', __( 'Customer', 'woocommerce' ), array( + 'read' => true, + 'edit_posts' => false, + 'delete_posts' => false + ) ); - // Shop manager role - add_role( 'shop_manager', __( 'Shop Manager', 'woocommerce' ), array( - 'level_9' => true, - 'level_8' => true, - 'level_7' => true, - 'level_6' => true, - 'level_5' => true, - 'level_4' => true, - 'level_3' => true, - 'level_2' => true, - 'level_1' => true, - 'level_0' => true, - 'read' => true, - 'read_private_pages' => true, - 'read_private_posts' => true, - 'edit_users' => true, - 'edit_posts' => true, - 'edit_pages' => true, - 'edit_published_posts' => true, - 'edit_published_pages' => true, - 'edit_private_pages' => true, - 'edit_private_posts' => true, - 'edit_others_posts' => true, - 'edit_others_pages' => true, - 'publish_posts' => true, - 'publish_pages' => true, - 'delete_posts' => true, - 'delete_pages' => true, - 'delete_private_pages' => true, - 'delete_private_posts' => true, - 'delete_published_pages' => true, - 'delete_published_posts' => true, - 'delete_others_posts' => true, - 'delete_others_pages' => true, - 'manage_categories' => true, - 'manage_links' => true, - 'moderate_comments' => true, - 'unfiltered_html' => true, - 'upload_files' => true, - 'export' => true, - 'import' => true, - 'list_users' => true - ) ); + // Shop manager role + add_role( 'shop_manager', __( 'Shop Manager', 'woocommerce' ), array( + 'level_9' => true, + 'level_8' => true, + 'level_7' => true, + 'level_6' => true, + 'level_5' => true, + 'level_4' => true, + 'level_3' => true, + 'level_2' => true, + 'level_1' => true, + 'level_0' => true, + 'read' => true, + 'read_private_pages' => true, + 'read_private_posts' => true, + 'edit_users' => true, + 'edit_posts' => true, + 'edit_pages' => true, + 'edit_published_posts' => true, + 'edit_published_pages' => true, + 'edit_private_pages' => true, + 'edit_private_posts' => true, + 'edit_others_posts' => true, + 'edit_others_pages' => true, + 'publish_posts' => true, + 'publish_pages' => true, + 'delete_posts' => true, + 'delete_pages' => true, + 'delete_private_pages' => true, + 'delete_private_posts' => true, + 'delete_published_pages' => true, + 'delete_published_posts' => true, + 'delete_others_posts' => true, + 'delete_others_pages' => true, + 'manage_categories' => true, + 'manage_links' => true, + 'moderate_comments' => true, + 'unfiltered_html' => true, + 'upload_files' => true, + 'export' => true, + 'import' => true, + 'list_users' => true + ) ); - $capabilities = $this->get_core_capabilities(); + $capabilities = self::get_core_capabilities(); - foreach ( $capabilities as $cap_group ) { - foreach ( $cap_group as $cap ) { - $wp_roles->add_cap( 'shop_manager', $cap ); - $wp_roles->add_cap( 'administrator', $cap ); - } + foreach ( $capabilities as $cap_group ) { + foreach ( $cap_group as $cap ) { + $wp_roles->add_cap( 'shop_manager', $cap ); + $wp_roles->add_cap( 'administrator', $cap ); } } } @@ -521,7 +480,7 @@ class WC_Install { * * @return array */ - public function get_core_capabilities() { + private static function get_core_capabilities() { $capabilities = array(); $capabilities['core'] = array( @@ -562,38 +521,35 @@ class WC_Install { /** * woocommerce_remove_roles function. - * - * @return void */ - public function remove_roles() { + public static function remove_roles() { global $wp_roles; - if ( class_exists( 'WP_Roles' ) ) { - if ( ! isset( $wp_roles ) ) { - $wp_roles = new WP_Roles(); + if ( ! class_exists( 'WP_Roles' ) ) { + return; + } + + if ( ! isset( $wp_roles ) ) { + $wp_roles = new WP_Roles(); + } + + $capabilities = self::get_core_capabilities(); + + foreach ( $capabilities as $cap_group ) { + foreach ( $cap_group as $cap ) { + $wp_roles->remove_cap( 'shop_manager', $cap ); + $wp_roles->remove_cap( 'administrator', $cap ); } } - if ( is_object( $wp_roles ) ) { - - $capabilities = $this->get_core_capabilities(); - - foreach ( $capabilities as $cap_group ) { - foreach ( $cap_group as $cap ) { - $wp_roles->remove_cap( 'shop_manager', $cap ); - $wp_roles->remove_cap( 'administrator', $cap ); - } - } - - remove_role( 'customer' ); - remove_role( 'shop_manager' ); - } + remove_role( 'customer' ); + remove_role( 'shop_manager' ); } /** * Create files/directories */ - private function create_files() { + private static function create_files() { // Install files and folders for uploading files and prevent hotlinking $upload_dir = wp_upload_dir(); @@ -632,39 +588,15 @@ class WC_Install { /** * Show plugin changes. Code adapted from W3 Total Cache. - * - * @return void */ - public function in_plugin_update_message( $args ) { + public static function in_plugin_update_message( $args ) { $transient_name = 'wc_upgrade_notice_' . $args['Version']; if ( false === ( $upgrade_notice = get_transient( $transient_name ) ) ) { - $response = wp_remote_get( 'https://plugins.svn.wordpress.org/woocommerce/trunk/readme.txt' ); if ( ! is_wp_error( $response ) && ! empty( $response['body'] ) ) { - - // Output Upgrade Notice - $matches = null; - $regexp = '~==\s*Upgrade Notice\s*==\s*=\s*(.*)\s*=(.*)(=\s*' . preg_quote( WC_VERSION ) . '\s*=|$)~Uis'; - $upgrade_notice = ''; - - if ( preg_match( $regexp, $response['body'], $matches ) ) { - $version = trim( $matches[1] ); - $notices = (array) preg_split('~[\r\n]+~', trim( $matches[2] ) ); - - if ( version_compare( WC_VERSION, $version, '<' ) ) { - - $upgrade_notice .= '
'; - - foreach ( $notices as $index => $line ) { - $upgrade_notice .= wp_kses_post( preg_replace( '~\[([^\]]*)\]\(([^\)]*)\)~', '${1}', $line ) ); - } - - $upgrade_notice .= '
'; - } - } - + $upgrade_notice = self::parse_update_notice( $response['body'] ); set_transient( $transient_name, $upgrade_notice, DAY_IN_SECONDS ); } } @@ -672,15 +604,45 @@ class WC_Install { echo wp_kses_post( $upgrade_notice ); } + /** + * Parse update notice from readme file + * @param string $content + * @return string + */ + private static function parse_update_notice( $content ) { + // Output Upgrade Notice + $matches = null; + $regexp = '~==\s*Upgrade Notice\s*==\s*=\s*(.*)\s*=(.*)(=\s*' . preg_quote( WC_VERSION ) . '\s*=|$)~Uis'; + $upgrade_notice = ''; + + if ( preg_match( $regexp, $content, $matches ) ) { + $version = trim( $matches[1] ); + $notices = (array) preg_split('~[\r\n]+~', trim( $matches[2] ) ); + + if ( version_compare( WC_VERSION, $version, '<' ) ) { + + $upgrade_notice .= '
'; + + foreach ( $notices as $index => $line ) { + $upgrade_notice .= wp_kses_post( preg_replace( '~\[([^\]]*)\]\(([^\)]*)\)~', '${1}', $line ) ); + } + + $upgrade_notice .= '
'; + } + } + + return wp_kses_post( $upgrade_notice ); + } + /** * Show action links on the plugin screen. * * @param mixed $links Plugin Action links * @return array */ - public function plugin_action_links( $links ) { + public static function plugin_action_links( $links ) { $action_links = array( - 'settings' => '' . __( 'Settings', 'woocommerce' ) . '', + 'settings' => '' . __( 'Settings', 'woocommerce' ) . '', ); return array_merge( $action_links, $links ); @@ -693,12 +655,12 @@ class WC_Install { * @param mixed $file Plugin Base file * @return array */ - public function plugin_row_meta( $links, $file ) { + public static function plugin_row_meta( $links, $file ) { if ( $file == WC_PLUGIN_BASENAME ) { $row_meta = array( - 'docs' => '' . __( 'Docs', 'woocommerce' ) . '', - 'apidocs' => '' . __( 'API Docs', 'woocommerce' ) . '', - 'support' => '' . __( 'Premium Support', 'woocommerce' ) . '', + 'docs' => '' . __( 'Docs', 'woocommerce' ) . '', + 'apidocs' => '' . __( 'API Docs', 'woocommerce' ) . '', + 'support' => '' . __( 'Premium Support', 'woocommerce' ) . '', ); return array_merge( $links, $row_meta ); @@ -712,7 +674,7 @@ class WC_Install { * @param array $tables * @return array */ - public function wpmu_drop_tables( $tables ) { + public static function wpmu_drop_tables( $tables ) { global $wpdb; $tables[] = $wpdb->prefix . "woocommerce_attribute_taxonomies"; @@ -727,6 +689,4 @@ class WC_Install { } } -endif; - -return new WC_Install(); +WC_Install::init(); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 1dd4e4efe41..191e0164701 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -68,8 +68,7 @@ class WC_Unit_Tests_Bootstrap { define( 'WP_UNINSTALL_PLUGIN', true ); include( $this->plugin_dir . '/uninstall.php' ); - $installer = include( $this->plugin_dir . '/includes/class-wc-install.php' ); - $installer->install(); + WC_Install::install(); // reload capabilities after install, see https://core.trac.wordpress.org/ticket/28374 $GLOBALS['wp_roles']->reinit(); diff --git a/tests/unit-tests/install.php b/tests/unit-tests/install.php new file mode 100644 index 00000000000..783ddcd2224 --- /dev/null +++ b/tests/unit-tests/install.php @@ -0,0 +1,110 @@ +version - 1 ); + update_option( 'woocommerce_db_version', WC()->version ); + WC_Install::check_version(); + + $this->assertTrue( did_action( 'woocommerce_updated' ) === 1 ); + + update_option( 'woocommerce_version', WC()->version ); + update_option( 'woocommerce_db_version', WC()->version ); + WC_Install::check_version(); + + $this->assertTrue( did_action( 'woocommerce_updated' ) === 1 ); + } + + /** + * Test - install + */ + public function test_install() { + // clean existing install first + if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { + define( 'WP_UNINSTALL_PLUGIN', true ); + } + include( dirname( dirname( dirname( __FILE__ ) ) ) . '/uninstall.php' ); + + WC_Install::install(); + + $this->assertTrue( get_option( 'woocommerce_version' ) === WC()->version ); + } + + /** + * Test - create pages + */ + public function test_create_pages() { + // Clear options + delete_option( 'woocommerce_shop_page_id' ); + delete_option( 'woocommerce_cart_page_id' ); + delete_option( 'woocommerce_checkout_page_id' ); + delete_option( 'woocommerce_myaccount_page_id' ); + + WC_Install::create_pages(); + + $this->assertGreaterThan( 0, get_option( 'woocommerce_shop_page_id' ) ); + $this->assertGreaterThan( 0, get_option( 'woocommerce_cart_page_id' ) ); + $this->assertGreaterThan( 0, get_option( 'woocommerce_checkout_page_id' ) ); + $this->assertGreaterThan( 0, get_option( 'woocommerce_myaccount_page_id' ) ); + + // Delete pages + wp_delete_post( get_option( 'woocommerce_shop_page_id' ), true ); + wp_delete_post( get_option( 'woocommerce_cart_page_id' ), true ); + wp_delete_post( get_option( 'woocommerce_checkout_page_id' ), true ); + wp_delete_post( get_option( 'woocommerce_myaccount_page_id' ), true ); + + // Clear options + delete_option( 'woocommerce_shop_page_id' ); + delete_option( 'woocommerce_cart_page_id' ); + delete_option( 'woocommerce_checkout_page_id' ); + delete_option( 'woocommerce_myaccount_page_id' ); + + WC_Install::create_pages(); + + $this->assertGreaterThan( 0, get_option( 'woocommerce_shop_page_id' ) ); + $this->assertGreaterThan( 0, get_option( 'woocommerce_cart_page_id' ) ); + $this->assertGreaterThan( 0, get_option( 'woocommerce_checkout_page_id' ) ); + $this->assertGreaterThan( 0, get_option( 'woocommerce_myaccount_page_id' ) ); + } + + /** + * Test - create roles + */ + public function test_create_roles() { + // clean existing install first + if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { + define( 'WP_UNINSTALL_PLUGIN', true ); + } + include( dirname( dirname( dirname( __FILE__ ) ) ) . '/uninstall.php' ); + + WC_Install::create_roles(); + + $this->assertNotNull( get_role( 'customer' ) ); + $this->assertNotNull( get_role( 'shop_manager' ) ); + } + + /** + * Test - remove pages + */ + public function test_remove_roles() { + WC_Install::remove_roles(); + + $this->assertNull( get_role( 'customer' ) ); + $this->assertNull( get_role( 'shop_manager' ) ); + } + + /** + * Test - in_plugin_update_message + */ + public function test_in_plugin_update_message() { + ob_start(); + WC_install::in_plugin_update_message( array( 'Version' => '2.0.0' ) ); + $result = ob_get_clean(); + $this->assertTrue( is_string( $result ) ); + } + +} diff --git a/tests/unit-tests/tax.php b/tests/unit-tests/tax.php index de181aca45f..91959f33382 100644 --- a/tests/unit-tests/tax.php +++ b/tests/unit-tests/tax.php @@ -8,8 +8,8 @@ class WC_Tests_Tax extends WC_Unit_Test_Case { public function test_get_rates() { global $wpdb; - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rates" ); - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rates" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); $tax_rate = array( 'tax_rate_country' => "GB", @@ -38,8 +38,8 @@ class WC_Tests_Tax extends WC_Unit_Test_Case { public function test_get_shipping_tax_rates() { global $wpdb; - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rates" ); - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rates" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); $tax_rate = array( 'tax_rate_country' => "GB", @@ -68,8 +68,8 @@ class WC_Tests_Tax extends WC_Unit_Test_Case { public function test_get_base_tax_rates() { global $wpdb; - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rates" ); - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rates" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); $tax_rate = array( 'tax_rate_country' => "GB", @@ -98,8 +98,8 @@ class WC_Tests_Tax extends WC_Unit_Test_Case { public function test_find_rates() { global $wpdb; - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rates" ); - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rates" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); $tax_rate = array( 'tax_rate_country' => "GB", @@ -134,8 +134,8 @@ class WC_Tests_Tax extends WC_Unit_Test_Case { public function test_find_shipping_rates() { global $wpdb; - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rates" ); - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rates" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); $tax_rate = array( 'tax_rate_country' => "GB", @@ -170,8 +170,8 @@ class WC_Tests_Tax extends WC_Unit_Test_Case { public function test_calc_tax() { global $wpdb; - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rates" ); - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rates" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); $tax_rate = array( 'tax_rate_country' => "GB", @@ -212,8 +212,8 @@ class WC_Tests_Tax extends WC_Unit_Test_Case { public function test_calc_shipping_tax() { global $wpdb; - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rates" ); - $wpdb->query( "DELETE * FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rates" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_tax_rate_locations" ); $tax_rate = array( 'tax_rate_country' => "GB", diff --git a/uninstall.php b/uninstall.php index fc1df402279..db0e07aa3ed 100644 --- a/uninstall.php +++ b/uninstall.php @@ -9,16 +9,17 @@ * @package WooCommerce/Uninstaller * @version 2.1.0 */ -if( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) +if( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { exit(); +} global $wpdb, $wp_roles; $status_options = get_option( 'woocommerce_status_options', array() ); // Roles + caps -$installer = include( 'includes/class-wc-install.php' ); -$installer->remove_roles(); +include_once( 'includes/class-wc-install.php' ); +WC_Install::remove_roles(); // Pages wp_trash_post( get_option( 'woocommerce_shop_page_id' ) );