wc_repair_zero_discount_coupons_lookup_table()
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() 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,
);
}