Automattic\WooCommerce\Blocks\BlockTypes

Checkout::enqueue_dataprotectedWC 1.0

Extra data passed through from server to client for block.

Method of the class: Checkout{}

Returns

null. Nothing (null).

Usage

// protected - for code of main (parent) or child class
$result = $this->enqueue_data( $attributes );
$attributes(array)
Any attributes that currently are available from the block. Note, this will be empty in the editor context when the block is not in the post content on editor load.
Default: []

Checkout::enqueue_data() code WC 10.9.1

protected function enqueue_data( array $attributes = [] ) {
	parent::enqueue_data( $attributes );

	$country_data    = CartCheckoutUtils::get_country_data();
	$address_formats = WC()->countries->get_address_formats();

	// Move the address format into the 'countryData' setting.
	// We need to skip 'default' because that's not a valid country.
	foreach ( $address_formats as $country_code => $format ) {
		if ( 'default' === $country_code ) {
			continue;
		}
		$country_data[ $country_code ]['format'] = $format;
	}

	$providers_payload = [];
	if ( class_exists( AddressProviderController::class ) && 'no' !== get_option( 'woocommerce_address_autocomplete_enabled', 'no' ) ) {
		$controller        = wc_get_container()->get( AddressProviderController::class );
		$providers         = $controller->get_providers();
		$providers_payload = array_map(
			static function ( $provider ) {
				return array(
					'id'            => (string) $provider->id,
					'name'          => sanitize_text_field( (string) $provider->name ),
					'branding_html' => wp_kses_post( (string) $provider->branding_html ),
				);
			},
			(array) $providers
		);
	}
	$this->asset_data_registry->add( 'addressAutocompleteProviders', $providers_payload );
	$this->asset_data_registry->add( 'countryData', $country_data );
	$this->asset_data_registry->add( 'defaultAddressFormat', $address_formats['default'] );

	// Prime caches to reduce future queries.
	wp_prime_option_caches(
		array(
			'woocommerce_enable_guest_checkout',
			'woocommerce_enable_signup_and_login_from_checkout',
			'woocommerce_enable_checkout_login_reminder',
			'woocommerce_tax_display_cart', // This one is autoloaded, but we add it here for clarity.
			'woocommerce_tax_total_display',
			'woocommerce_ship_to_destination',
			'woocommerce_registration_generate_password',
			'pickup_location_pickup_locations',
		)
	);

	$this->asset_data_registry->add(
		'checkoutAllowsGuest',
		false === filter_var(
			wc()->checkout()->is_registration_required(),
			FILTER_VALIDATE_BOOLEAN
		)
	);
	$this->asset_data_registry->add(
		'checkoutAllowsSignup',
		filter_var(
			wc()->checkout()->is_registration_enabled(),
			FILTER_VALIDATE_BOOLEAN
		)
	);
	$this->asset_data_registry->add( 'checkoutShowLoginReminder', filter_var( get_option( 'woocommerce_enable_checkout_login_reminder' ), FILTER_VALIDATE_BOOLEAN ) );
	$this->asset_data_registry->add( 'displayCartPricesIncludingTax', 'incl' === get_option( 'woocommerce_tax_display_cart' ) );
	$this->asset_data_registry->add( 'displayItemizedTaxes', 'itemized' === get_option( 'woocommerce_tax_total_display' ) );
	$this->asset_data_registry->add( 'forcedBillingAddress', 'billing_only' === get_option( 'woocommerce_ship_to_destination' ) );
	$this->asset_data_registry->add( 'generatePassword', filter_var( get_option( 'woocommerce_registration_generate_password' ), FILTER_VALIDATE_BOOLEAN ) );
	$this->asset_data_registry->add( 'taxesEnabled', wc_tax_enabled() );
	$this->asset_data_registry->add( 'couponsEnabled', wc_coupons_enabled() );
	$this->asset_data_registry->add( 'shippingEnabled', wc_shipping_enabled() );
	$this->asset_data_registry->add( 'hasDarkEditorStyleSupport', current_theme_supports( 'dark-editor-style' ) );
	$this->asset_data_registry->register_page_id( isset( $attributes['cartPageId'] ) ? $attributes['cartPageId'] : 0 );
	$this->asset_data_registry->add( 'isBlockTheme', wp_is_block_theme() );
	$this->asset_data_registry->add( 'isCheckoutBlock', true );

	$pickup_location_settings = LocalPickupUtils::get_local_pickup_settings();
	$local_pickup_method_ids  = LocalPickupUtils::get_local_pickup_method_ids();

	$this->asset_data_registry->add( 'localPickupEnabled', $pickup_location_settings['enabled'] );
	$this->asset_data_registry->add( 'localPickupText', $pickup_location_settings['title'] );
	$this->asset_data_registry->add( 'localPickupCost', $pickup_location_settings['cost'] );
	$this->asset_data_registry->add( 'collectableMethodIds', $local_pickup_method_ids );
	$this->asset_data_registry->add( 'shippingMethodsExist', CartCheckoutUtils::shipping_methods_exist() );

	$is_block_editor = $this->is_block_editor();

	if ( $is_block_editor ) {
		$this->asset_data_registry->add(
			'localPickupLocations',
			array_filter(
				array_map(
					function ( $location ) {
						if ( ! wc_string_to_bool( $location['enabled'] ) ) {
							return null;
						}
						$location['formatted_address'] = wc()->countries->get_formatted_address( $location['address'], ', ' );
						return $location;
					},
					LocalPickupUtils::get_local_pickup_method_locations()
				)
			),
		);
	}

	if ( $is_block_editor && ! $this->asset_data_registry->exists( 'globalShippingMethods' ) ) {
		$shipping_methods           = WC()->shipping()->get_shipping_methods();
		$formatted_shipping_methods = array_reduce(
			$shipping_methods,
			function ( array $acc, $method ) use ( $local_pickup_method_ids ) {
				if ( in_array( $method->id, $local_pickup_method_ids, true ) ) {
					return $acc;
				}
				if ( $method->supports( 'settings' ) ) {
					$acc[] = [
						'id'          => $method->id,
						'title'       => $method->method_title,
						'description' => $method->method_description,
					];
				}
				return $acc;
			},
			[]
		);
		$this->asset_data_registry->add( 'globalShippingMethods', $formatted_shipping_methods );
	}

	if ( $is_block_editor && ! $this->asset_data_registry->exists( 'activeShippingZones' ) && class_exists( '\WC_Shipping_Zones' ) ) {
		$this->asset_data_registry->add( 'activeShippingZones', CartCheckoutUtils::get_shipping_zones() );
	}

	if ( $is_block_editor && ! $this->asset_data_registry->exists( 'globalPaymentMethods' ) ) {
		// These are used to show options in the sidebar. We want to get the full list of enabled payment methods,
		// not just the ones that are available for the current cart (which may not exist yet).
		$payment_methods           = PaymentUtils::get_enabled_payment_gateways();
		$formatted_payment_methods = array_reduce(
			$payment_methods,
			function ( array $acc, $method ) {
				$acc[] = [
					'id'          => $method->id,
					'title'       => $method->get_method_title() !== '' ? $method->get_method_title() : $method->get_title(),
					'description' => $method->get_method_description() !== '' ? $method->get_method_description() : $method->get_description(),
				];
				return $acc;
			},
			[]
		);
		$this->asset_data_registry->add( 'globalPaymentMethods', $formatted_payment_methods );
	}

	// Check `current_user_can` so we can show notices about incompatible extensions in the front-end to admins too.
	if ( ( $is_block_editor || current_user_can( 'manage_woocommerce' ) ) && ! $this->asset_data_registry->exists( 'incompatibleExtensions' ) ) {
		if ( ! class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) || ! function_exists( 'get_plugins' ) ) {
			return;
		}

		$declared_extensions     = \Automattic\WooCommerce\Utilities\FeaturesUtil::get_compatible_plugins_for_feature( 'cart_checkout_blocks' );
		$all_plugins             = \get_plugins(); // Note that `get_compatible_plugins_for_feature` calls `get_plugins` internally, so this is already in cache.
		$incompatible_extensions = array_reduce(
			$declared_extensions['incompatible'],
			function ( array $acc, $item ) use ( $all_plugins ) {
				$plugin      = $all_plugins[ $item ] ?? null;
				$plugin_id   = $plugin['TextDomain'] ?? dirname( $item );
				$plugin_name = $plugin['Name'] ?? $plugin_id;
				$acc[]       = [
					'id'    => $plugin_id,
					'title' => $plugin_name,
				];
				return $acc;
			},
			[]
		);
		$this->asset_data_registry->add( 'incompatibleExtensions', $incompatible_extensions );
	}

	if ( ! is_admin() && ! WC()->is_rest_api_request() ) {
		$this->asset_data_registry->hydrate_api_request( '/wc/store/v1/cart' );
		$this->asset_data_registry->hydrate_data_from_api_request( 'checkoutData', '/wc/store/v1/checkout' );
		$this->hydrate_customer_payment_methods();
	}

	/**
	 * Fires after checkout block data is registered.
	 *
	 * @since 2.6.0
	 */
	do_action( 'woocommerce_blocks_checkout_enqueue_data' );
}