WC_Product_Collection_Block_Tracking::parse_blocks_track_dataprivateWC 1.0

Track usage of the Product Collection block within the given blocks.

Method of the class: WC_Product_Collection_Block_Tracking{}

No Hooks.

Returns

Array. Parsed instances of the Product Collection block.

Usage

// private - for code of main (parent) class only
$result = $this->parse_blocks_track_data( $blocks, $is_in_single_product, $is_in_template_part, $is_in_synced_pattern );
$blocks(array) (required)
The parsed blocks to check.
$is_in_single_product(true|false)
Whether we are in a single product container (used for keeping state in the recurring process).
Default: false
$is_in_template_part(true|false)
Whether we are in a template part (used for keeping state in the recurring process).
Default: false
$is_in_synced_pattern(true|false)
Whether we are in a synced block (used for keeping state in the recurring process).
Default: false

WC_Product_Collection_Block_Tracking::parse_blocks_track_data() code WC 9.9.3

private function parse_blocks_track_data( $blocks, $is_in_single_product = false, $is_in_template_part = false, $is_in_synced_pattern = false ) {

	$instances = array();

	if ( ! is_array( $blocks ) || empty( $blocks ) ) {
		return $instances;
	}

	foreach ( $blocks as $block ) {

		if ( empty( $block['blockName'] ) ) {
			continue;
		}

		if ( 'woocommerce/product-collection' === $block['blockName'] ) {
			$instances[] = array(
				'collection'        => $block['attrs']['collection'] ?? 'product-catalog',
				'in_single_product' => $is_in_single_product ? 'yes' : 'no',
				'in_template_part'  => $is_in_template_part ? 'yes' : 'no',
				'in_synced_pattern' => $is_in_synced_pattern ? 'yes' : 'no',
				'filters'           => wp_json_encode( $this->get_query_filters_usage_data( $block ) ),
			);
		}

		// Track instances within single product container.
		$local_is_in_single_product = $is_in_single_product;
		if ( 'woocommerce/single-product' === $block['blockName'] ) {
			$local_is_in_single_product = true;
		}

		// Track instances within template part.
		// Hint: Supports up to two levels of depth.
		if ( ! $is_in_synced_pattern && ! $is_in_template_part && 'core/template-part' === $block['blockName'] ) {

			$template_part_theme = $block['attrs']['theme'] ?? '';
			$template_part_slug  = $block['attrs']['slug'] ?? '';
			$template_part       = get_block_template( $template_part_theme . '//' . $template_part_slug, 'wp_template_part' );
			if ( $template_part instanceof WP_Block_Template && ! empty( $template_part->content ) ) {
				// Recursive.
				$instances = array_merge( $instances, $this->parse_blocks_track_data( parse_blocks( $template_part->content ), $local_is_in_single_product, true, $is_in_synced_pattern ) );
			}
		}

		// Track instances within synced block.
		// Hint: Supports up to two levels of depth.
		if ( ! $is_in_synced_pattern && ! $is_in_template_part && 'core/block' === $block['blockName'] ) {

			$block_id       = $block['attrs']['ref'] ?? 0;
			$synced_pattern = get_post( $block_id );
			if ( $synced_pattern instanceof WP_Post && ! empty( $synced_pattern->post_content ) ) {
				// Recursive.
				$instances = array_merge( $instances, $this->parse_blocks_track_data( parse_blocks( $synced_pattern->post_content ), $local_is_in_single_product, $is_in_template_part, true ) );
			}
		}

		// Recursive.
		if ( ! empty( $block['innerBlocks'] ) ) {
			$instances = array_merge( $instances, $this->parse_blocks_track_data( $block['innerBlocks'], $local_is_in_single_product, $is_in_template_part, $is_in_synced_pattern ) );
		}
	}

	return $instances;
}