WC_Customer::has_full_shipping_address │ public │ WC 9.8.0

Checks whether the address is "full" in the sense that it contains all required fields to calculate shipping rates. This method uses the current country's locale to determine if a field is required, or falls back to the default locale if there's no country-specific setting for that field.

This method is only used internally by StoreAPI, and not by the classic/shortcode checkout.

Method of the class: WC_Customer{}

No Hooks.

Returns

bool. Whether the customer has a full shipping address (city, state, postcode, country). Only required fields are checked based on the country locale.

Usage

$WC_Customer = new WC_Customer();
$WC_Customer->has_full_shipping_address();

Changelog

Since 9.8.0 Introduced.

WC_Customer::has_full_shipping_address() code WC 11.1.2

public function has_full_shipping_address() {
	// These are the important fields required to get the shipping rates. Note that while we're respecting the filters
	// for the shipping calculator below (city, postcode, state), we're not respecting the filter for the country field.
	// The country field is always required as a bare minimum for shipping.
	$shipping_address = array(
		'country'  => $this->get_shipping_country(),
		'city'     => $this->get_shipping_city(),
		'state'    => $this->get_shipping_state(),
		'postcode' => $this->get_shipping_postcode(),
	);

	$address_fields = WC()->countries->get_country_locale();
	$locale_key     = ! empty( $shipping_address['country'] ) && array_key_exists( $shipping_address['country'], $address_fields ) ? $shipping_address['country'] : 'default';
	$default_locale = $address_fields['default'];
	$country_locale = $address_fields[ $locale_key ] ?? array();

	/**
	 * Checks all shipping address fields against the country's locale settings.
	 *
	 * If there's a `required` setting for the field in the country-specific locale, that setting is used, otherwise
	 * the default locale's setting is used. If the default locale doesn't have a setting either, the field is
	 * considered optional and therefore valid, even if empty.
	 */
	foreach ( $shipping_address as $key => $value ) {
		// Skip further checks if the field has a value. From this point on $value is empty.
		if ( ! empty( $value ) ) {
			continue;
		}

		// If the field is hidden in the country-specific locale, we can skip it.
		if ( isset( $country_locale[ $key ]['hidden'] ) && true === wc_string_to_bool( $country_locale[ $key ]['hidden'] ) ) {
			continue;
		}

		// Check if the field is hidden in the default locale, if so, we can skip too (because it wasn't hidden in country-specific locale).
		if ( isset( $default_locale[ $key ]['hidden'] ) && true === wc_string_to_bool( $default_locale[ $key ]['hidden'] ) ) {
			continue;
		}

		$locale_to_check = isset( $country_locale[ $key ]['required'] ) ? $country_locale : $default_locale;

		// If the locale requires the field return false.
		if ( isset( $locale_to_check[ $key ]['required'] ) && true === wc_string_to_bool( $locale_to_check[ $key ]['required'] ) ) {
			return false;
		}
	}
	return true;
}