Automattic\WooCommerce\Blocks\BlockTypes

Cart::render()protectedWC 1.0

Append frontend scripts when rendering the Cart block.

Method of the class: Cart{}

No Hooks.

Return

String. Rendered block type output.

Usage

// protected - for code of main (parent) or child class
$result = $this->render( $attributes, $content, $block );
$attributes(array) (required)
Block attributes.
$content(string) (required)
Block content.
$block(WP_Block) (required)
Block instance.

Cart::render() code WC 8.6.1

protected function render( $attributes, $content, $block ) {
	// Dequeue the core scripts when rendering this block.
	add_action( 'wp_enqueue_scripts', array( $this, 'dequeue_woocommerce_core_scripts' ), 20 );

	/**
	 * We need to check if $content has any templates from prior iterations of the block, in order to update to the latest iteration.
	 * We test the iteration version by searching for new blocks brought in by it.
	 * The blocks used for testing should be always available in the block (not removable by the user).
	 */

	$regex_for_filled_cart_block = '/<div[^<]*?data-block-name="woocommerce\/filled-cart-block"[^>]*?>/mi';
	// Filled Cart block was added in i2, so we search for it to see if we have a Cart i1 template.
	$has_i1_template = ! preg_match( $regex_for_filled_cart_block, $content );

	if ( $has_i1_template ) {
		/**
		 * This fallback structure needs to match the defaultTemplate variables defined in the block's edit.tsx files,
		 * starting from the parent block and going down each inner block, in the order the blocks were registered.
		 */
		$inner_blocks_html = '$0
		<div data-block-name="woocommerce/filled-cart-block" class="wp-block-woocommerce-filled-cart-block">
			<div data-block-name="woocommerce/cart-items-block" class="wp-block-woocommerce-cart-items-block">
				<div data-block-name="woocommerce/cart-line-items-block" class="wp-block-woocommerce-cart-line-items-block"></div>
			</div>
			<div data-block-name="woocommerce/cart-totals-block" class="wp-block-woocommerce-cart-totals-block">
				<div data-block-name="woocommerce/cart-order-summary-block" class="wp-block-woocommerce-cart-order-summary-block"></div>
				<div data-block-name="woocommerce/cart-express-payment-block" class="wp-block-woocommerce-cart-express-payment-block"></div>
				<div data-block-name="woocommerce/proceed-to-checkout-block" class="wp-block-woocommerce-proceed-to-checkout-block"></div>
				<div data-block-name="woocommerce/cart-accepted-payment-methods-block" class="wp-block-woocommerce-cart-accepted-payment-methods-block"></div>
			</div>
		</div>
		<div data-block-name="woocommerce/empty-cart-block" class="wp-block-woocommerce-empty-cart-block">
		';

		$content = preg_replace( '/<div class="[a-zA-Z0-9_\- ]*wp-block-woocommerce-cart[a-zA-Z0-9_\- ]*">/mi', $inner_blocks_html, $content );
		$content = $content . '</div>';
	}

	/**
	 * Cart i3 added inner blocks for Order summary. We need to add them to Cart i2 templates.
	 * The order needs to match the order in which these blocks were registered.
	 */
	$order_summary_with_inner_blocks = '$0
		<div data-block-name="woocommerce/cart-order-summary-heading-block" class="wp-block-woocommerce-cart-order-summary-heading-block"></div>
		<div data-block-name="woocommerce/cart-order-summary-subtotal-block" class="wp-block-woocommerce-cart-order-summary-subtotal-block"></div>
		<div data-block-name="woocommerce/cart-order-summary-fee-block" class="wp-block-woocommerce-cart-order-summary-fee-block"></div>
		<div data-block-name="woocommerce/cart-order-summary-discount-block" class="wp-block-woocommerce-cart-order-summary-discount-block"></div>
		<div data-block-name="woocommerce/cart-order-summary-coupon-form-block" class="wp-block-woocommerce-cart-order-summary-coupon-form-block"></div>
		<div data-block-name="woocommerce/cart-order-summary-shipping-form-block" class="wp-block-woocommerce-cart-order-summary-shipping-block"></div>
		<div data-block-name="woocommerce/cart-order-summary-taxes-block" class="wp-block-woocommerce-cart-order-summary-taxes-block"></div>
	';
	// Order summary subtotal block was added in i3, so we search for it to see if we have a Cart i2 template.
	$regex_for_order_summary_subtotal = '/<div[^<]*?data-block-name="woocommerce\/cart-order-summary-subtotal-block"[^>]*?>/mi';
	$regex_for_order_summary          = '/<div[^<]*?data-block-name="woocommerce\/cart-order-summary-block"[^>]*?>/mi';
	$has_i2_template                  = ! preg_match( $regex_for_order_summary_subtotal, $content );

	if ( $has_i2_template ) {
		$content = preg_replace( $regex_for_order_summary, $order_summary_with_inner_blocks, $content );
	}

	return $content;
}