WC_API_Coupons::create_coupon()publicWC 2.2

Create a coupon

Метод класса: WC_API_Coupons{}

Возвращает

Массив|WP_Error.

Использование

$WC_API_Coupons = new WC_API_Coupons();
$WC_API_Coupons->create_coupon( $data );
$data(массив) (обязательный)
-

Список изменений

С версии 2.2 Введена.

Код WC_API_Coupons::create_coupon() WC 8.7.0

public function create_coupon( $data ) {
	global $wpdb;

	try {
		if ( ! isset( $data['coupon'] ) ) {
			throw new WC_API_Exception( 'woocommerce_api_missing_coupon_data', sprintf( __( 'No %1$s data specified to create %1$s', 'woocommerce' ), 'coupon' ), 400 );
		}

		$data = $data['coupon'];

		// Check user permission
		if ( ! current_user_can( 'publish_shop_coupons' ) ) {
			throw new WC_API_Exception( 'woocommerce_api_user_cannot_create_coupon', __( 'You do not have permission to create coupons', 'woocommerce' ), 401 );
		}

		$data = apply_filters( 'woocommerce_api_create_coupon_data', $data, $this );

		// Check if coupon code is specified
		if ( ! isset( $data['code'] ) ) {
			throw new WC_API_Exception( 'woocommerce_api_missing_coupon_code', sprintf( __( 'Missing parameter %s', 'woocommerce' ), 'code' ), 400 );
		}

		$coupon_code  = wc_format_coupon_code( $data['code'] );
		$id_from_code = wc_get_coupon_id_by_code( $coupon_code );

		if ( $id_from_code ) {
			throw new WC_API_Exception( 'woocommerce_api_coupon_code_already_exists', __( 'The coupon code already exists', 'woocommerce' ), 400 );
		}

		$defaults = array(
			'type'                         => 'fixed_cart',
			'amount'                       => 0,
			'individual_use'               => false,
			'product_ids'                  => array(),
			'exclude_product_ids'          => array(),
			'usage_limit'                  => '',
			'usage_limit_per_user'         => '',
			'limit_usage_to_x_items'       => '',
			'usage_count'                  => '',
			'expiry_date'                  => '',
			'enable_free_shipping'         => false,
			'product_category_ids'         => array(),
			'exclude_product_category_ids' => array(),
			'exclude_sale_items'           => false,
			'minimum_amount'               => '',
			'maximum_amount'               => '',
			'customer_emails'              => array(),
			'description'                  => '',
		);

		$coupon_data = wp_parse_args( $data, $defaults );

		// Validate coupon types
		if ( ! in_array( wc_clean( $coupon_data['type'] ), array_keys( wc_get_coupon_types() ) ) ) {
			throw new WC_API_Exception( 'woocommerce_api_invalid_coupon_type', sprintf( __( 'Invalid coupon type - the coupon type must be any of these: %s', 'woocommerce' ), implode( ', ', array_keys( wc_get_coupon_types() ) ) ), 400 );
		}

		$new_coupon = array(
			'post_title'   => $coupon_code,
			'post_content' => '',
			'post_status'  => 'publish',
			'post_author'  => get_current_user_id(),
			'post_type'    => 'shop_coupon',
			'post_excerpt' => $coupon_data['description'],
 		);

		$id = wp_insert_post( $new_coupon, true );

		if ( is_wp_error( $id ) ) {
			throw new WC_API_Exception( 'woocommerce_api_cannot_create_coupon', $id->get_error_message(), 400 );
		}

		// Set coupon meta
		update_post_meta( $id, 'discount_type', $coupon_data['type'] );
		update_post_meta( $id, 'coupon_amount', wc_format_decimal( $coupon_data['amount'] ) );
		update_post_meta( $id, 'individual_use', ( true === $coupon_data['individual_use'] ) ? 'yes' : 'no' );
		update_post_meta( $id, 'product_ids', implode( ',', array_filter( array_map( 'intval', $coupon_data['product_ids'] ) ) ) );
		update_post_meta( $id, 'exclude_product_ids', implode( ',', array_filter( array_map( 'intval', $coupon_data['exclude_product_ids'] ) ) ) );
		update_post_meta( $id, 'usage_limit', absint( $coupon_data['usage_limit'] ) );
		update_post_meta( $id, 'usage_limit_per_user', absint( $coupon_data['usage_limit_per_user'] ) );
		update_post_meta( $id, 'limit_usage_to_x_items', absint( $coupon_data['limit_usage_to_x_items'] ) );
		update_post_meta( $id, 'usage_count', absint( $coupon_data['usage_count'] ) );
		update_post_meta( $id, 'expiry_date', $this->get_coupon_expiry_date( wc_clean( $coupon_data['expiry_date'] ) ) );
		update_post_meta( $id, 'date_expires', $this->get_coupon_expiry_date( wc_clean( $coupon_data['expiry_date'] ), true ) );
		update_post_meta( $id, 'free_shipping', ( true === $coupon_data['enable_free_shipping'] ) ? 'yes' : 'no' );
		update_post_meta( $id, 'product_categories', array_filter( array_map( 'intval', $coupon_data['product_category_ids'] ) ) );
		update_post_meta( $id, 'exclude_product_categories', array_filter( array_map( 'intval', $coupon_data['exclude_product_category_ids'] ) ) );
		update_post_meta( $id, 'exclude_sale_items', ( true === $coupon_data['exclude_sale_items'] ) ? 'yes' : 'no' );
		update_post_meta( $id, 'minimum_amount', wc_format_decimal( $coupon_data['minimum_amount'] ) );
		update_post_meta( $id, 'maximum_amount', wc_format_decimal( $coupon_data['maximum_amount'] ) );
		update_post_meta( $id, 'customer_email', array_filter( array_map( 'sanitize_email', $coupon_data['customer_emails'] ) ) );

		do_action( 'woocommerce_api_create_coupon', $id, $data );
		do_action( 'woocommerce_new_coupon', $id );

		$this->server->send_status( 201 );

		return $this->get_coupon( $id );
	} catch ( WC_API_Exception $e ) {
		return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) );
	}
}