Automattic\WooCommerce\StoreApi\Utilities

OrderController::validate_couponsprotectedWC 1.0

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() 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
	}
}