Automattic\WooCommerce\Internal\AddressProvider

AddressProviderController::get_registered_providersprivateWC 1.0

Get all registered providers.

Method of the class: AddressProviderController{}

Hooks from the method

Returns

WC_Address_Provider[]. array of WC_Address_Providers.

Usage

// private - for code of main (parent) class only
$result = $this->get_registered_providers(): array;

AddressProviderController::get_registered_providers() code WC 10.3.3

private function get_registered_providers(): array {
	/**
	 * Filter the registered address providers.
	 *
	 * @since 9.9.0
	 * @param array $providers Array of fully qualified class names (strings) or WC_Address_Provider instances.
	 *                         Class names will be instantiated automatically.
	 *                         Example: array( 'My_Provider_Class', new My_Other_Provider() )
	 */
	$provider_items = apply_filters( 'woocommerce_address_providers', array() );

	// The filter returned nothing but an empty array, so we can skip the rest of the function.
	if ( empty( $provider_items ) && is_array( $provider_items ) ) {
		return array();
	}

	$logger = wc_get_logger();

	if ( ! is_array( $provider_items ) ) {
		$logger->error(
			'Invalid return value for woocommerce_address_providers, expected an array of class names or instances.',
			array(
				'context' => 'address_provider_service',
			)
		);
		return array();
	}

	$providers = array();
	$seen_ids  = array();

	foreach ( $provider_items as $provider_item ) {
		if ( is_string( $provider_item ) && class_exists( $provider_item ) ) {
			$provider_item = new $provider_item();
		}

		// Providers need to be valid and extend WC_Address_Provider.
		if ( ! is_a( $provider_item, WC_Address_Provider::class ) ) {
			$logger->error(
				sprintf(
					'Invalid address provider item "%s", expected a string class name or WC_Address_Provider instance.',
					is_object( $provider_item ) ? get_class( $provider_item ) : gettype( $provider_item )
				),
				array(
					'context' => 'address_provider_service',
				)
			);
			continue;
		}

		// Validate the instance has the necessary properties.
		if ( empty( $provider_item->id ) || empty( $provider_item->name ) ) {
			$logger->error(
				'Invalid address provider instance, id or name property is missing or empty: ' . get_class( $provider_item ),
				array(
					'context' => 'address_provider_service',
				)
			);
			continue;
		}

		// Check for duplicate IDs.
		if ( isset( $seen_ids[ $provider_item->id ] ) ) {
			$logger->error(
				sprintf(
					'Duplicate provider ID found. ID "%s" is used by both %s and %s.',
					$provider_item->id,
					$seen_ids[ $provider_item->id ],
					get_class( $provider_item )
				),
				array(
					'context' => 'address_provider_service',
				)
			);
			continue;
		}

		// Track the ID and its provider class for error reporting.
		$seen_ids[ $provider_item->id ] = get_class( $provider_item );

		// Add the provider instance to the array after all checks are completed.
		$providers[] = $provider_item;
	}

	if ( ! empty( $this->preferred_provider_option ) && ! empty( $providers ) ) {
		// Look for the preferred provider in the array.
		foreach ( $providers as $key => $provider ) {
			if ( $provider->id === $this->preferred_provider_option ) {
				// Found the preferred provider, move it to the beginning of the array.
				$preferred_provider = $provider;
				unset( $providers[ $key ] );
				array_unshift( $providers, $preferred_provider );
				break;
			}
		}
	}

	return $providers;
}