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() ); } /** * Get list of DB update callbacks. * * @return array */ public static function get_db_update_callbacks() { return self::$db_updates; } /** * Is a DB update needed? * * @return boolean */ public static function needs_db_update() { $current_db_version = get_option( self::VERSION_OPTION, null ); $updates = self::get_db_update_callbacks(); $update_versions = array_keys( $updates ); usort( $update_versions, 'version_compare' ); return ! is_null( $current_db_version ) && version_compare( $current_db_version, end( $update_versions ), '<' ); } /** * See if we need to show or run database updates during install. */ private static function maybe_update_db_version() { if ( self::needs_db_update() ) { self::update(); } else { self::update_db_version(); } } /** * Push all needed DB updates to the queue for processing. */ private static function update() { $current_db_version = get_option( self::VERSION_OPTION ); $loop = 0; foreach ( self::get_db_update_callbacks() as $version => $update_callbacks ) { if ( version_compare( $current_db_version, $version, '<' ) ) { $completed_version_updates = 0; foreach ( $update_callbacks as $update_callback ) { $pending_jobs = WC()->queue()->search( array( 'per_page' => 1, 'hook' => 'woocommerce_run_update_callback', 'search' => wp_json_encode( array( $update_callback ) ), 'group' => 'woocommerce-db-updates', 'status' => 'pending', ) ); $complete_jobs = WC()->queue()->search( array( 'per_page' => 1, 'hook' => 'woocommerce_run_update_callback', 'search' => wp_json_encode( array( $update_callback ) ), 'group' => 'woocommerce-db-updates', 'status' => 'complete', ) ); $completed_version_updates += count( $complete_jobs ); if ( empty( $pending_jobs ) && empty( $complete_jobs ) ) { WC()->queue()->schedule_single( time() + $loop, 'woocommerce_run_update_callback', array( $update_callback ), 'woocommerce-db-updates' ); Cache::invalidate(); } $loop++; } // Users have experienced concurrency issues where all update callbacks // have run but the version option hasn't been updated. If all the updates // for a version are complete, update the version option to reflect that. // See: https:// github.com/woocommerce/woocommerce-admin/issues/5058. if ( count( $update_callbacks ) === $completed_version_updates ) { self::update_db_version( $version ); } } } } /** * Update WC Admin version to current. * * @param string|null $version New WooCommerce Admin DB version or null. */ public static function update_db_version( $version = null ) { delete_option( self::VERSION_OPTION ); add_option( self::VERSION_OPTION, is_null( $version ) ? WC_ADMIN_VERSION_NUMBER : $version ); } /** * Schedule cron events. */ public static function create_events() { if ( ! wp_next_scheduled( 'wc_admin_daily' ) ) { wp_schedule_event( time(), 'daily', 'wc_admin_daily' ); } // Note: this is potentially redundant when the core package exists. wp_schedule_single_event( time() + 10, 'generate_category_lookup_table' ); } /** * Delete obsolete notes. */ protected static function delete_obsolete_notes() { $obsolete_notes_names = array( 'wc-admin-welcome-note', 'wc-admin-store-notice-setting-moved', 'wc-admin-store-notice-giving-feedback', 'wc-admin-learn-more-about-product-settings', 'wc-admin-onboarding-profiler-reminder', 'wc-admin-historical-data', 'wc-admin-review-shipping-settings', 'wc-admin-home-screen-feedback', 'wc-admin-effortless-payments-by-mollie', 'wc-admin-google-ads-and-marketing', ); $additional_obsolete_notes_names = apply_filters( 'woocommerce_admin_obsolete_notes_names', array() ); if ( is_array( $additional_obsolete_notes_names ) ) { $obsolete_notes_names = array_merge( $obsolete_notes_names, $additional_obsolete_notes_names ); } Notes::delete_notes_with_name( $obsolete_notes_names ); } /** * Drop WooCommerce Admin tables. * * @return void */ public static function drop_tables() { global $wpdb; $tables = self::get_tables(); foreach ( $tables as $table ) { /* phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared */ $wpdb->query( "DROP TABLE IF EXISTS {$table}" ); /* phpcs:enable */ } } }