Automattic\WooCommerce\Internal\Admin

Analytics::run_regenerate_order_fulfillment_status_toolpublicWC 1.0

Regenerate order fulfillment status directly using SQL.

Method of the class: Analytics{}

No Hooks.

Returns

String. Success message or error message.

Usage

$Analytics = new Analytics();
$Analytics->run_regenerate_order_fulfillment_status_tool();

Analytics::run_regenerate_order_fulfillment_status_tool() code WC 10.4.3

public function run_regenerate_order_fulfillment_status_tool() {
	global $wpdb;

	// Check if the column exists, create it if not.
	if ( ! OrderStatsDataStore::has_fulfillment_status_column() ) {
		$create_column_result = OrderStatsDataStore::add_fulfillment_status_column();

		if ( true !== $create_column_result ) {
			return sprintf(
				/* translators: %s: error message */
				__( 'Failed to create fulfillment status column: %s', 'woocommerce' ),
				$create_column_result
			);
		}
	}

	$order_stats_table = $wpdb->prefix . 'wc_order_stats';

	// If HPOS is enabled, use the wc_orders_meta table, else use wp_postmeta.
	if ( OrderUtil::custom_orders_table_usage_is_enabled() ) {
		$order_meta_table  = OrdersTableDataStore::get_meta_table_name();
		$order_meta_column = 'order_id';
	} else {
		$order_meta_table  = $wpdb->postmeta;
		$order_meta_column = 'post_id';
	}

	// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	$updated = $wpdb->query(
		$wpdb->prepare(
			// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Table and column names cannot be prepared.
			"UPDATE {$order_stats_table} os INNER JOIN {$order_meta_table} om ON os.order_id = om.{$order_meta_column}
			SET os.fulfillment_status = CASE
				WHEN om.meta_value = %s THEN NULL
				ELSE om.meta_value
			END
			WHERE om.meta_key = %s",
			'no_fulfillments',
			'_fulfillment_status'
		)
	);

	if ( false === $updated ) {
		return __( 'Failed to update order fulfillment status. Please check the database logs for errors.', 'woocommerce' );
	}

	// Mark as completed.
	update_option( 'woocommerce_analytics_order_fulfillment_status_regenerated', true, false );

	return sprintf(
		/* translators: %d: number of orders updated */
		__( 'Successfully updated fulfillment status for %d orders.', 'woocommerce' ),
		$updated
	);
}