Automattic\WooCommerce\EmailEditor\Integrations\Core\Renderer\Blocks

Image::add_image_size_when_missingprivateWC 1.0

When the width is not set, it's important to get it for the image to be displayed correctly

Method of the class: Image{}

No Hooks.

Returns

null. Nothing (null).

Usage

// private - for code of main (parent) class only
$result = $this->add_image_size_when_missing( $parsed_block, $image_url ): array;
$parsed_block(array) (required)
Parsed block.
$image_url(string) (required)
Image URL.

Image::add_image_size_when_missing() code WC 10.5.0

private function add_image_size_when_missing( array $parsed_block, string $image_url ): array {
	if ( isset( $parsed_block['attrs']['width'] ) ) {
		return $parsed_block;
	}
	// Can't determine any width let's go with 100%.
	if ( ! isset( $parsed_block['email_attrs']['width'] ) ) {
		$parsed_block['attrs']['width'] = '100%';
		return $parsed_block;
	}
	$max_width = Styles_Helper::parse_value( $parsed_block['email_attrs']['width'] );

	$image_size = null;

	if ( $image_url ) {
		// Try to extract width from URL query parameter if it exists.
		$parsed_url = wp_parse_url( $image_url );
		if ( isset( $parsed_url['query'] ) ) {
			parse_str( $parsed_url['query'], $query_params );
			if ( isset( $query_params['w'] ) && is_numeric( $query_params['w'] ) && $query_params['w'] > 0 ) {
				$image_size = (int) $query_params['w'];
			}
		}

		// Next we check the attachment data if it has an ID.
		if ( ! isset( $image_size ) ) {
			$attachment_id = $parsed_block['attrs']['id'] ?? null;
			if ( $attachment_id ) {
				$size_slug = $parsed_block['attrs']['sizeSlug'] ?? 'large';

				// Check the metadata first.
				$metadata = wp_get_attachment_metadata( $attachment_id );
				if ( $metadata ) {
					if ( isset( $metadata['sizes'][ $size_slug ]['width'] ) ) {
						$image_size = (int) $metadata['sizes'][ $size_slug ]['width'];
					} elseif ( 'full' === $size_slug && isset( $metadata['width'] ) ) {
						$image_size = (int) $metadata['width'];
					}
				}

				// Try to get dimensions from wp_get_attachment_image_src if metadata didn't have it.
				if ( ! isset( $image_size ) ) {
					$image_src = wp_get_attachment_image_src( $attachment_id, $size_slug );
					if ( $image_src && isset( $image_src[1] ) ) {
						$image_size = (int) $image_src[1];
					}
				}
			}
		}

		// Fallback to wp_getimagesize if we still don't have a size.
		if ( ! isset( $image_size ) ) {
			$upload_dir = wp_upload_dir();
			$image_path = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $image_url );
			$result     = wp_getimagesize( $image_path );
			if ( $result ) {
				$image_size = (int) $result[0];
			}
		}
	}

	// Use the found image size or fall back to max_width.
	$width = isset( $image_size ) ? min( $image_size, $max_width ) : $max_width;

	$parsed_block['attrs']['width'] = "{$width}px";
	return $parsed_block;
}