Automattic\WooCommerce\EmailEditor\Integrations\WooCommerce

Coupon_Code_Generator::generate_couponpublicWC 1.0

Generate a WooCommerce coupon from block attributes.

Method of the class: Coupon_Code_Generator{}

No Hooks.

Returns

String. The generated coupon code, or empty string on failure.

Usage

$Coupon_Code_Generator = new Coupon_Code_Generator();
$Coupon_Code_Generator->generate_coupon( $coupon_code, $attrs, $rendering_context ): string;
$coupon_code(string) (required)
The coupon code (empty if not yet generated).
$attrs(array) (required)
Block attributes.
$rendering_context(Rendering_Context) (required)
The rendering context.

Coupon_Code_Generator::generate_coupon() code WC 10.9.1

public function generate_coupon( string $coupon_code, array $attrs, Rendering_Context $rendering_context ): string {
	if ( ! empty( $coupon_code ) ) {
		return $coupon_code;
	}

	if ( $rendering_context->get( 'is_user_preview' ) ) {
		return Coupon_Code::COUPON_CODE_PLACEHOLDER;
	}

	if ( ! function_exists( 'wc_get_coupon_types' ) || ! class_exists( 'WC_Coupon' ) ) {
		return '';
	}

	try {
		$coupon = new \WC_Coupon();
		$coupon->set_code( $this->generate_unique_code() );

		$discount_type = $this->validate_discount_type( $attrs['discountType'] ?? 'percent' );
		$coupon->set_discount_type( $discount_type );

		if ( isset( $attrs['amount'] ) ) {
			$coupon->set_amount( (float) $attrs['amount'] );
		}

		if ( ! empty( $attrs['expiryDay'] ) ) {
			$expiration = time() + ( (int) $attrs['expiryDay'] * DAY_IN_SECONDS );
			$coupon->set_date_expires( $expiration );
		}

		$coupon->set_free_shipping( ! empty( $attrs['freeShipping'] ) );

		$coupon->set_minimum_amount( (float) ( $attrs['minimumAmount'] ?? 0 ) );
		$coupon->set_maximum_amount( (float) ( $attrs['maximumAmount'] ?? 0 ) );
		$coupon->set_individual_use( ! empty( $attrs['individualUse'] ) );
		$coupon->set_exclude_sale_items( ! empty( $attrs['excludeSaleItems'] ) );

		$coupon->set_product_ids( $this->extract_ids( $attrs['productIds'] ?? array() ) );
		$coupon->set_excluded_product_ids( $this->extract_ids( $attrs['excludedProductIds'] ?? array() ) );
		$coupon->set_product_categories( $this->extract_ids( $attrs['productCategoryIds'] ?? array() ) );
		$coupon->set_excluded_product_categories( $this->extract_ids( $attrs['excludedProductCategoryIds'] ?? array() ) );

		$email_restrictions = $this->parse_email_restrictions( $attrs['emailRestrictions'] ?? '' );

		$recipient = $rendering_context->get_recipient_email();
		if ( $recipient && is_email( $recipient ) ) {
			$email_restrictions[] = $recipient;
		}

		$coupon->set_email_restrictions( array_unique( $email_restrictions ) );

		$usage_limit          = $attrs['usageLimit'] ?? 0;
		$usage_limit_per_user = $attrs['usageLimitPerUser'] ?? 0;
		$coupon->set_usage_limit( is_numeric( $usage_limit ) ? (int) $usage_limit : 0 );
		$coupon->set_usage_limit_per_user( is_numeric( $usage_limit_per_user ) ? (int) $usage_limit_per_user : 0 );

		$coupon->set_description(
			__( 'Auto-generated coupon by WooCommerce Email Editor', 'woocommerce' )
		);

		$coupon->save();

		return $coupon->get_code();
	} catch ( \Exception $e ) {
		wc_get_logger()->error(
			'Coupon auto-generation failed: ' . $e->getMessage(),
			array( 'source' => 'email-editor-coupon-generator' )
		);
		return '';
	}
}