WP_Block::replace_html()privateWP 6.5.0

Depending on the block attribute name, replace its value in the HTML based on the value provided.

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

Хуков нет.

Возвращает

Строку. The modified block content.

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

// private - только в коде основоного (родительского) класса
$result = $this->replace_html( $block_content, $attribute_name, $source_value );
$block_content(строка) (обязательный)
Block content.
$attribute_name(строка) (обязательный)
The attribute name to replace.
$source_value(разное) (обязательный)
The value used to replace in the HTML.

Список изменений

С версии 6.5.0 Введена.

Код WP_Block::replace_html() WP 6.7.1

private function replace_html( string $block_content, string $attribute_name, $source_value ) {
	$block_type = $this->block_type;
	if ( ! isset( $block_type->attributes[ $attribute_name ]['source'] ) ) {
		return $block_content;
	}

	// Depending on the attribute source, the processing will be different.
	switch ( $block_type->attributes[ $attribute_name ]['source'] ) {
		case 'html':
		case 'rich-text':
			$block_reader = new WP_HTML_Tag_Processor( $block_content );

			// TODO: Support for CSS selectors whenever they are ready in the HTML API.
			// In the meantime, support comma-separated selectors by exploding them into an array.
			$selectors = explode( ',', $block_type->attributes[ $attribute_name ]['selector'] );
			// Add a bookmark to the first tag to be able to iterate over the selectors.
			$block_reader->next_tag();
			$block_reader->set_bookmark( 'iterate-selectors' );

			// TODO: This shouldn't be needed when the `set_inner_html` function is ready.
			// Store the parent tag and its attributes to be able to restore them later in the button.
			// The button block has a wrapper while the paragraph and heading blocks don't.
			if ( 'core/button' === $this->name ) {
				$button_wrapper                 = $block_reader->get_tag();
				$button_wrapper_attribute_names = $block_reader->get_attribute_names_with_prefix( '' );
				$button_wrapper_attrs           = array();
				foreach ( $button_wrapper_attribute_names as $name ) {
					$button_wrapper_attrs[ $name ] = $block_reader->get_attribute( $name );
				}
			}

			foreach ( $selectors as $selector ) {
				// If the parent tag, or any of its children, matches the selector, replace the HTML.
				if ( strcasecmp( $block_reader->get_tag( $selector ), $selector ) === 0 || $block_reader->next_tag(
					array(
						'tag_name' => $selector,
					)
				) ) {
					$block_reader->release_bookmark( 'iterate-selectors' );

					// TODO: Use `set_inner_html` method whenever it's ready in the HTML API.
					// Until then, it is hardcoded for the paragraph, heading, and button blocks.
					// Store the tag and its attributes to be able to restore them later.
					$selector_attribute_names = $block_reader->get_attribute_names_with_prefix( '' );
					$selector_attrs           = array();
					foreach ( $selector_attribute_names as $name ) {
						$selector_attrs[ $name ] = $block_reader->get_attribute( $name );
					}
					$selector_markup = "<$selector>" . wp_kses_post( $source_value ) . "</$selector>";
					$amended_content = new WP_HTML_Tag_Processor( $selector_markup );
					$amended_content->next_tag();
					foreach ( $selector_attrs as $attribute_key => $attribute_value ) {
						$amended_content->set_attribute( $attribute_key, $attribute_value );
					}
					if ( 'core/paragraph' === $this->name || 'core/heading' === $this->name ) {
						return $amended_content->get_updated_html();
					}
					if ( 'core/button' === $this->name ) {
						$button_markup  = "<$button_wrapper>{$amended_content->get_updated_html()}</$button_wrapper>";
						$amended_button = new WP_HTML_Tag_Processor( $button_markup );
						$amended_button->next_tag();
						foreach ( $button_wrapper_attrs as $attribute_key => $attribute_value ) {
							$amended_button->set_attribute( $attribute_key, $attribute_value );
						}
						return $amended_button->get_updated_html();
					}
				} else {
					$block_reader->seek( 'iterate-selectors' );
				}
			}
			$block_reader->release_bookmark( 'iterate-selectors' );
			return $block_content;

		case 'attribute':
			$amended_content = new WP_HTML_Tag_Processor( $block_content );
			if ( ! $amended_content->next_tag(
				array(
					// TODO: build the query from CSS selector.
					'tag_name' => $block_type->attributes[ $attribute_name ]['selector'],
				)
			) ) {
				return $block_content;
			}
			$amended_content->set_attribute( $block_type->attributes[ $attribute_name ]['attribute'], $source_value );
			return $amended_content->get_updated_html();

		default:
			return $block_content;
	}
}