Automattic\WooCommerce\StoreApi\Utilities
OrderController::validate_coupons
Validate coupons applied to the order and remove those that are not valid.
Method of the class: OrderController{}
No Hooks.
Returns
null. Nothing (null).
Usage
// protected - for code of main (parent) or child class $result = $this->validate_coupons( $order, $use_order_data );
- $order(WC_Order) (required)
- Order object.
- $use_order_data(true|false)
- Whether to use order data or cart data.
Default: false
OrderController::validate_coupons() OrderController::validate coupons code WC 10.3.3
protected function validate_coupons( \WC_Order $order, bool $use_order_data = false ) {
$coupon_codes = $order->get_coupon_codes();
$coupons = array_filter( array_map( array( $this, 'get_coupon' ), $coupon_codes ) );
$validators = array( 'validate_coupon_email_restriction', 'validate_coupon_usage_limit' );
$coupon_errors = array();
foreach ( $coupons as $coupon ) {
try {
array_walk(
$validators,
function ( $validator, $index, $params ) {
call_user_func_array( array( $this, $validator ), $params );
},
array( $coupon, $order )
);
} catch ( Exception $error ) {
$coupon_errors[ $coupon->get_code() ] = $error->getMessage();
}
}
if ( $coupon_errors ) {
// Remove all coupons that were not valid.
if ( $use_order_data ) {
$error_code = 'woocommerce_rest_order_coupon_errors';
foreach ( $coupon_errors as $coupon_code => $message ) {
$order->remove_coupon( $coupon_code );
}
// Recalculate totals.
$order->calculate_totals();
} else {
$error_code = 'woocommerce_rest_cart_coupon_errors';
foreach ( $coupon_errors as $coupon_code => $message ) {
wc()->cart->remove_coupon( $coupon_code );
}
// Recalculate totals.
wc()->cart->calculate_totals();
// Re-sync order with cart.
$this->update_order_from_cart( $order );
}
// Return exception so customer can review before payment.
if ( 1 === count( $coupon_errors ) && $use_order_data ) {
$error_message = sprintf(
/* translators: %1$s Coupon codes, %2$s Reason */
__( '"%1$s" was removed from the order. %2$s', 'woocommerce' ),
array_keys( $coupon_errors )[0],
array_values( $coupon_errors )[0],
);
} elseif ( 1 === count( $coupon_errors ) ) {
$error_message = sprintf(
/* translators: %1$s Coupon codes, %2$s Reason */
__( '"%1$s" was removed from the cart. %2$s', 'woocommerce' ),
array_keys( $coupon_errors )[0],
array_values( $coupon_errors )[0],
);
} elseif ( $use_order_data ) {
$error_message = sprintf(
/* translators: %s Coupon codes. */
__( 'Invalid coupons were removed from the order: "%s"', 'woocommerce' ),
implode( '", "', array_keys( $coupon_errors ) )
);
} else {
$error_message = sprintf(
/* translators: %s Coupon codes. */
__( 'Invalid coupons were removed from the cart: "%s"', 'woocommerce' ),
implode( '", "', array_keys( $coupon_errors ) )
);
}
throw new RouteException( $error_code, $error_message, 409, array( 'removed_coupons' => $coupon_errors ) ); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
}
}