Automattic\WooCommerce\Internal\Fulfillments

FulfillmentsManager::try_parse_tracking_numberpublicWC 1.0

Try to parse the tracking number with additional parameters.

Method of the class: FulfillmentsManager{}

No Hooks.

Returns

Array. An array containing the provider as key, and the parsing results.

Usage

$FulfillmentsManager = new FulfillmentsManager();
$FulfillmentsManager->try_parse_tracking_number( $tracking_number, $shipping_from, $shipping_to ): array;
$tracking_number(string) (required)
The tracking number.
$shipping_from(string) (required)
The country code from which the shipment is sent.
$shipping_to(string) (required)
The country code to which the shipment is sent.

FulfillmentsManager::try_parse_tracking_number() code WC 10.3.3

public function try_parse_tracking_number( string $tracking_number, string $shipping_from, string $shipping_to ): array {
	// Validate the tracking number format and length.
	if ( ! is_string( $tracking_number ) || empty( $tracking_number ) || strlen( $tracking_number ) > 50 ) {
		$tracking_number = is_string( $tracking_number ) && ! empty( $tracking_number ) ? substr( $tracking_number, 0, 50 ) : '';
		return array(
			'tracking_number'   => $tracking_number,
			'shipping_provider' => '',
			'tracking_url'      => '',
		);
	}

	// Normalize the tracking number to uppercase.
	$tracking_number = strtoupper( $tracking_number );
	$tracking_number = preg_replace( '/[^A-Z0-9]/', '', $tracking_number ); // Remove non-alphanumeric characters.

	$shipping_providers = FulfillmentUtils::get_shipping_providers();
	$results            = array();
	foreach ( $shipping_providers as $provider ) {
		if ( class_exists( $provider ) && is_subclass_of( $provider, AbstractShippingProvider::class ) ) {
			try {
				/**
				 * Instantiate the shipping provider class.
				 *
				 * @var AbstractShippingProvider $provider_instance
				 */
				$provider_instance = wc_get_container()->get( $provider );
			} catch ( \Throwable $e ) {
				$logger = wc_get_logger();
				$logger->error(
					sprintf(
						'Error instantiating shipping provider class %s: %s',
						$provider,
						$e->getMessage()
					),
					array( 'source' => 'woocommerce-fulfillments' )
				);
				continue; // Skip if the provider class cannot be instantiated.
			}
		} else {
			continue; // Skip if the provider class does not exist or is not a valid shipping provider.
		}

		$parsing_result = $provider_instance->try_parse_tracking_number( $tracking_number, $shipping_from, $shipping_to );
		if ( ! is_null( $parsing_result ) ) {
			$results[ $provider_instance->get_key() ] = $parsing_result;
		}
	}

	if ( 1 === count( $results ) ) {
		$result  = reset( $results );
		$key     = key( $results );
		$results = array(
			'tracking_number'   => $tracking_number,
			'shipping_provider' => $key,
			'tracking_url'      => $result['url'] ?? '',
		);
	} elseif ( 1 < count( $results ) ) {
		// If multiple providers could parse the tracking number, find the one with the highest ambiguity score.
		$possibilities            = $results;
		$results                  = $this->get_best_parsing_result( $results, $tracking_number );
		$results['possibilities'] = $possibilities; // Include all possibilities for reference.
	}

	return $results;
}