Automattic\WooCommerce\Blocks\Templates

SingleProductTemplate::process_block_for_password_form │ private static │ WC 1.0

Replace or remove a parsed block when rendering a password-protected product.

Метод класса: SingleProductTemplate{}

Хуков нет.

Возвращает

array{blocks: array, is_already_replaced: bool}. Replacement blocks (empty when removed).

Использование

$result = SingleProductTemplate::process_block_for_password_form( $block, $is_already_replaced );
$block(массив) (обязательный)
Parsed block.
$is_already_replaced(true|false) (обязательный)
If the password form has already been added.

Код SingleProductTemplate::process_block_for_password_form() WC 11.2.2

private static function process_block_for_password_form( $block, $is_already_replaced ) {
	if ( self::is_password_protected_replacement_block( $block ) ) {
		if ( $is_already_replaced ) {
			return array(
				'blocks'              => array(),
				'is_already_replaced' => true,
			);
		}

		return array(
			'blocks'              => array( parse_blocks( '<!-- wp:html -->' . get_the_password_form() . '<!-- /wp:html -->' )[0] ),
			'is_already_replaced' => true,
		);
	}

	if ( empty( $block['innerBlocks'] ) || ! isset( $block['innerContent'] ) || ! is_array( $block['innerContent'] ) ) {
		return array(
			'blocks'              => array( $block ),
			'is_already_replaced' => $is_already_replaced,
		);
	}

	$new_inner_blocks  = array();
	$new_inner_content = array();
	$inner_block_index = 0;

	foreach ( $block['innerContent'] as $chunk ) {
		if ( is_string( $chunk ) ) {
			$new_inner_content[] = $chunk;
			continue;
		}

		if ( ! isset( $block['innerBlocks'][ $inner_block_index ] ) ) {
			continue;
		}

		$processed           = self::process_block_for_password_form( $block['innerBlocks'][ $inner_block_index ], $is_already_replaced );
		$is_already_replaced = $processed['is_already_replaced'];
		++$inner_block_index;

		foreach ( $processed['blocks'] as $processed_block ) {
			$new_inner_blocks[]  = $processed_block;
			$new_inner_content[] = null;
		}
	}

	if ( count( $new_inner_blocks ) === 0 ) {
		return array(
			'blocks'              => array(),
			'is_already_replaced' => $is_already_replaced,
		);
	}

	$block['innerBlocks']  = $new_inner_blocks;
	$block['innerContent'] = $new_inner_content;

	return array(
		'blocks'              => array( $block ),
		'is_already_replaced' => $is_already_replaced,
	);
}