Automattic\WooCommerce\Internal\StockNotifications\Frontend

SignupService::signuppublicWC 1.0

Signup.

Method of the class: SignupService{}

Returns

SignupResult|\WP_Error. The signup result.

Usage

$SignupService = new SignupService();
$SignupService->signup( $product_id, $user_id, $user_email, $posted_attributes );
$product_id(int) (required)
The product ID.
$user_id(int) (required)
The user ID.
$user_email(string) (required)
The user email.
$posted_attributes(array)
The posted attributes (Optional).
Default: array()

SignupService::signup() code WC 10.3.6

public function signup( int $product_id, int $user_id, string $user_email, array $posted_attributes = array() ) {

	// Sanity checks.
	if ( ! Config::allows_signups() ) {
		return new \WP_Error( self::ERROR_FAILED );
	}

	if ( empty( $user_email ) && empty( $user_id ) ) {
		return new \WP_Error( self::ERROR_INVALID_REQUEST );
	}

	$product = wc_get_product( $product_id );
	if ( ! $product ) {
		return new \WP_Error( self::ERROR_INVALID_PRODUCT );
	}

	if ( ! $this->eligibility_service->is_product_eligible( $product ) ) {
		return new \WP_Error( self::ERROR_INVALID_PRODUCT );
	}

	if ( $this->eligibility_service->is_stock_status_eligible( $product->get_stock_status() ) ) {
		return new \WP_Error( self::ERROR_INVALID_REQUEST );
	}

	if ( ! $this->eligibility_service->product_allows_signups( $product ) ) {
		return new \WP_Error( self::ERROR_INVALID_PRODUCT );
	}

	$notification = $this->is_already_signed_up( $product_id, $user_id, $user_email, $posted_attributes );
	if ( $notification instanceof Notification ) {
		if ( NotificationStatus::ACTIVE === $notification->get_status() ) {
			return new SignupResult( self::SIGNUP_ALREADY_JOINED, $notification );
		}

		if ( NotificationStatus::PENDING === $notification->get_status() ) {
			if ( Config::requires_double_opt_in() ) {
				return new SignupResult( self::SIGNUP_ALREADY_JOINED_DOUBLE_OPT_IN, $notification );
			}

			// If the notification is pending and double opt-in is not required, skip and activate the notification.
			$notification->set_status( NotificationStatus::ACTIVE );
			$notification->save();

			/**
			 * Action: woocommerce_customer_stock_notifications_signup
			 *
			 * @since 10.2.0
			 *
			 * @param Notification $notification The notification.
			 */
			do_action( 'woocommerce_customer_stock_notifications_signup', $notification );
			return new SignupResult( self::SIGNUP_SUCCESS, $notification );
		}
	}

	$account_created = null;
	if ( empty( $user_id ) && Config::creates_account_on_signup() ) {
		$account_created = $this->create_customer( $user_email );
		$user_id         = $account_created ? $account_created : $user_id;
	}

	$notification = new Notification();
	$notification->set_status( NotificationStatus::ACTIVE );
	$notification->set_product_id( $product_id );
	$notification->set_user_id( $user_id );
	$notification->set_user_email( $user_email );

	if ( ! empty( $posted_attributes ) ) {
		$notification->update_meta_data( 'posted_attributes', $posted_attributes );
	}

	if ( Config::requires_double_opt_in() ) {
		$notification->set_status( NotificationStatus::PENDING );
	}

	$saved = $notification->save();
	if ( ! $saved ) {
		return new \WP_Error( self::ERROR_FAILED );
	}

	/**
	 * Action: woocommerce_customer_stock_notifications_signup
	 *
	 * @since 10.2.0
	 *
	 * @param Notification $notification The notification.
	 */
	do_action( 'woocommerce_customer_stock_notifications_signup', $notification );

	$signup_code = self::SIGNUP_SUCCESS;
	if ( Config::requires_double_opt_in() ) {
		$signup_code = $account_created
			? self::SIGNUP_SUCCESS_ACCOUNT_CREATED_DOUBLE_OPT_IN
			: self::SIGNUP_SUCCESS_DOUBLE_OPT_IN;
	} elseif ( $account_created ) {
		$signup_code = self::SIGNUP_SUCCESS_ACCOUNT_CREATED;
	}
	return new SignupResult( $signup_code, $notification );
}