Automattic\WooCommerce\Gateways\PayPal

Request::get_paypal_order_shippingprivateWC 1.0

Get the shipping information for the PayPal create-order request.

Method of the class: Request{}

No Hooks.

Returns

Array|null. Returns null if the shipping is not required, or the address is not set, or is incomplete.

Usage

// private - for code of main (parent) class only
$result = $this->get_paypal_order_shipping( $order ): ?array;
$order(WC_Order) (required)
Order object.

Request::get_paypal_order_shipping() code WC 10.8.1

private function get_paypal_order_shipping( WC_Order $order ): ?array {
	if ( ! $order->needs_shipping() ) {
		return null;
	}

	$address_type = 'yes' === $this->gateway->get_option( 'send_shipping' ) ? 'shipping' : 'billing';

	$full_name      = trim( $order->{"get_formatted_{$address_type}_full_name"}() );
	$address_line_1 = trim( $order->{"get_{$address_type}_address_1"}() );
	$address_line_2 = trim( $order->{"get_{$address_type}_address_2"}() );
	$state          = trim( $order->{"get_{$address_type}_state"}() );
	$city           = trim( $order->{"get_{$address_type}_city"}() );
	$postcode       = trim( $order->{"get_{$address_type}_postcode"}() );
	$country        = trim( $order->{"get_{$address_type}_country"}() );

	// If we do not have the complete address,
	// e.g. PayPal Buttons on product pages, we should not set the 'shipping' param
	// for the create-order request, otherwise it will fail.
	// Shipping information will be updated by the shipping callback handlers.

	// Country is a required field.
	if ( empty( $country ) ) {
		return null;
	}

	// Make sure the country code is in the correct format.
	$raw_country = $country;
	$country     = $this->normalize_paypal_order_shipping_country_code( $raw_country );
	if ( ! $country ) {
		\WC_Gateway_Paypal::log( sprintf( 'Could not identify a correct country code. Raw value: %s', $raw_country ), 'error' );
		return null;
	}

	// Validate required fields based on country-specific address requirements.
	// phpcs:ignore Generic.Commenting.Todo.TaskFound
	// TODO: The container call can be removed once we migrate this class to the `src` folder.
	$address_requirements = wc_get_container()->get( PayPalAddressRequirements::class )::instance();
	if ( empty( $city ) && $address_requirements->country_requires_city( $country ) ) {
		\WC_Gateway_Paypal::log( sprintf( 'City is required for country: %s', $country ), 'error' );
		return null;
	}

	if ( empty( $postcode ) && $address_requirements->country_requires_postal_code( $country ) ) {
		\WC_Gateway_Paypal::log( sprintf( 'Postal code is required for country: %s', $country ), 'error' );
		return null;
	}

	return array(
		'name'    => array(
			'full_name' => $full_name,
		),
		'address' => array(
			'address_line_1' => $this->limit_length( $address_line_1, PayPalConstants::PAYPAL_ADDRESS_LINE_MAX_LENGTH ),
			'address_line_2' => $this->limit_length( $address_line_2, PayPalConstants::PAYPAL_ADDRESS_LINE_MAX_LENGTH ),
			'admin_area_1'   => $this->limit_length( $state, PayPalConstants::PAYPAL_STATE_MAX_LENGTH ),
			'admin_area_2'   => $this->limit_length( $city, PayPalConstants::PAYPAL_CITY_MAX_LENGTH ),
			'postal_code'    => $this->limit_length( $postcode, PayPalConstants::PAYPAL_POSTAL_CODE_MAX_LENGTH ),
			'country_code'   => strtoupper( $country ),
		),
	);
}