wc_repair_zero_discount_coupons_lookup_table()WC 10.1.0

Repair coupon lookup entries with zero discount_amount. A bug in WC 9.9 (fixed in 10.0) caused discount_amount to be set to zero when a coupon code was used with different case (e.g. "10-off" vs "10-OFF").

No Hooks.

Returns

Array. Array with 'success' boolean and 'message' string.

Usage

wc_repair_zero_discount_coupons_lookup_table();

Changelog

Since 10.1.0 Introduced.

wc_repair_zero_discount_coupons_lookup_table() code WC 10.3.3

function wc_repair_zero_discount_coupons_lookup_table() {
	global $wpdb;

	$table_name = $wpdb->prefix . 'wc_order_coupon_lookup';

	// Check if table exists.
	// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
	if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) !== $table_name ) {
		return array(
			'success' => false,
			'message' => __( 'Coupons lookup table does not exist.', 'woocommerce' ),
		);
	}

	// Get entries with zero discount_amount.
	$zero_discount_entries = $wpdb->get_results(
		$wpdb->prepare(
			// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
			"SELECT order_id, coupon_id FROM $table_name WHERE discount_amount = %f",
			0.0
		),
		ARRAY_A
	);

	if ( empty( $zero_discount_entries ) ) {
		return array(
			'success' => true,
			'message' => __( 'No entries with zero discount amount found. Coupons lookup table is up to date.', 'woocommerce' ),
		);
	}

	$processed_count = 0;
	$error_count     = 0;

	foreach ( $zero_discount_entries as $entry ) {
		try {
			$result = CouponsDataStore::sync_order_coupons( $entry['order_id'] );
			if ( false !== $result ) {
				++$processed_count;
			} else {
				++$error_count;
			}
		} catch ( Exception $e ) {
			++$error_count;
			$logger = wc_get_logger();
			$logger->error(
				sprintf(
					'Error fixing coupon lookup entry for order %d: %s',
					$entry['order_id'],
					$e->getMessage()
				),
				array(
					'source'   => 'coupons-lookup-fix',
					'order_id' => $entry['order_id'],
					'error'    => $e,
				)
			);
		}
	}

	// Clear any related caches.
	wp_cache_flush_group( 'coupons' );
	WC_Cache_Helper::get_transient_version( 'woocommerce_reports', true );

	$message = sprintf(
		/* translators: %1$d: number of entries processed, %2$d: number of errors */
		__( 'Coupons lookup table entries with zero discount amount repaired successfully. Processed %1$d entries with %2$d errors.', 'woocommerce' ),
		$processed_count,
		$error_count
	);

	return array(
		'success' => true,
		'message' => $message,
	);
}