OrderSieve_Guard::META_KEY, 'compare' => 'EXISTS', ); } /** * Turn the custom query var into a meta query for the legacy (posts) order * store, which silently drops a meta_query passed to wc_get_orders(). * * @param array $wp_query_args WP_Query args. * @param array $query_vars wc_get_orders() query vars. * * @return array */ public static function filter_cpt_query( $wp_query_args, $query_vars ) { if ( ! empty( $query_vars[ self::QUERY_VAR ] ) ) { $wp_query_args['meta_query'][] = self::blocked_meta_clause(); } return $wp_query_args; } /** * Delete old orders blocked by OrderSieve (flagged with the _ordersieve_blocked meta). * * @return int Number of orders deleted. */ public static function run() { if ( ! function_exists( 'wc_get_orders' ) ) { return 0; } $settings = ordersieve_get_settings(); $days = isset( $settings['cleanup_days'] ) ? (int) $settings['cleanup_days'] : 0; if ( $days < 1 ) { return 0; } $cutoff = time() - ( $days * DAY_IN_SECONDS ); $args = array( 'status' => array( 'failed', 'cancelled', 'trash' ), 'date_created' => '<' . $cutoff, 'limit' => self::BATCH_LIMIT, 'return' => 'objects', ); // HPOS supports meta_query; the legacy posts store ignores it, which would // match every old failed/cancelled order, so it gets the custom query var // that filter_cpt_query() turns into the same meta query. if ( \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ) { $args['meta_query'] = array( self::blocked_meta_clause() ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Bounded by status and limit; runs once a day. } else { $args[ self::QUERY_VAR ] = true; } $orders = wc_get_orders( $args ); $deleted = 0; foreach ( $orders as $order ) { // Never delete an order OrderSieve did not block, whatever the query returned. if ( ! $order instanceof WC_Order || '' === (string) $order->get_meta( OrderSieve_Guard::META_KEY ) ) { continue; } if ( $order->delete( true ) ) { ++$deleted; } } if ( $deleted > 0 && 'yes' === $settings['logging'] ) { wc_get_logger()->info( sprintf( /* translators: %d: number of orders */ __( 'Cleanup: deleted %d junk order(s).', 'ordersieve' ), $deleted ), array( 'source' => 'ordersieve' ) ); } return $deleted; } }