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 7e736948260..089f38c6f23 100644 --- a/plugins/woocommerce-admin/includes/class-wc-admin-api-init.php +++ b/plugins/woocommerce-admin/includes/class-wc-admin-api-init.php @@ -672,12 +672,24 @@ class WC_Admin_Api_Init { ) ); - if ( $blocking_jobs ) { - $blocking_job = current( $blocking_jobs ); - $after_blocking_job = $blocking_job->get_schedule()->next()->getTimestamp() + 5; + $next_job_schedule = null; + $blocking_job_hook = null; + if ( $blocking_jobs ) { + $blocking_job = current( $blocking_jobs ); + $blocking_job_hook = $blocking_job->get_hook(); + $next_job_schedule = $blocking_job->get_schedule()->next(); + } + + // Eliminate the false positive scenario where the blocking job is + // actually another queued dependent action awaiting the same prerequisite. + // Also, ensure that the next schedule is a DateTime (it can be null). + if ( + is_a( $next_job_schedule, 'DateTime' ) && + ( self::QUEUE_DEPEDENT_ACTION !== $blocking_job_hook ) + ) { self::queue()->schedule_single( - $after_blocking_job, + $next_job_schedule->getTimestamp() + 5, self::QUEUE_DEPEDENT_ACTION, array( $action, $action_args, $prerequisite_action ) ); diff --git a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-coupons-data-store.php b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-coupons-data-store.php index b49915211f5..29b4676c452 100644 --- a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-coupons-data-store.php +++ b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-coupons-data-store.php @@ -319,7 +319,9 @@ class WC_Admin_Reports_Coupons_Data_Store extends WC_Admin_Reports_Data_Store im global $wpdb; $order = wc_get_order( $order_id ); - if ( ! $order ) { + + // Skip `shop_order_refunds` when factoring stats on coupon usage. + if ( ! $order || 'shop_order' !== $order->get_type() ) { return -1; } diff --git a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-products-data-store.php b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-products-data-store.php index 7ef84d16b84..3ec9018a438 100644 --- a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-products-data-store.php +++ b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-products-data-store.php @@ -381,6 +381,9 @@ class WC_Admin_Reports_Products_Data_Store extends WC_Admin_Reports_Data_Store i array( '%d' ) ); // WPCS: cache ok, DB call ok. + // Deleting 0 items here isn't a problem, and we should force a successful return. + $result = ( 0 === $result ) ? 1 : $result; + /** * Fires when product's reports are deleted. * diff --git a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-taxes-data-store.php b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-taxes-data-store.php index eb6f934700f..c8cf1658f22 100644 --- a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-taxes-data-store.php +++ b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-reports-taxes-data-store.php @@ -258,7 +258,9 @@ class WC_Admin_Reports_Taxes_Data_Store extends WC_Admin_Reports_Data_Store impl public static function sync_order_taxes( $order_id ) { global $wpdb; $order = wc_get_order( $order_id ); - if ( ! $order ) { + + // Skip `shop_order_refunds` when factoring stats on order tax. + if ( ! $order || 'shop_order' !== $order->get_type() ) { return -1; }