WordPress Version: 6.5
/**
* Renders server-side dimensions styles to the block wrapper.
* This block support uses the `render_block` hook to ensure that
* it is also applied to non-server-rendered blocks.
*
* @since 6.5.0
* @access private
*
* @param string $block_content Rendered block content.
* @param array $block Block object.
* @return string Filtered block content.
*/
function wp_render_dimensions_support($block_content, $block)
{
$block_type = WP_Block_Type_Registry::get_instance()->get_registered($block['blockName']);
$block_attributes = (isset($block['attrs']) && is_array($block['attrs'])) ? $block['attrs'] : array();
$has_aspect_ratio_support = block_has_support($block_type, array('dimensions', 'aspectRatio'), false);
if (!$has_aspect_ratio_support || wp_should_skip_block_supports_serialization($block_type, 'dimensions', 'aspectRatio')) {
return $block_content;
}
$dimensions_block_styles = array();
$dimensions_block_styles['aspectRatio'] = $block_attributes['style']['dimensions']['aspectRatio'] ?? null;
// To ensure the aspect ratio does not get overridden by `minHeight` unset any existing rule.
if (isset($dimensions_block_styles['aspectRatio'])) {
$dimensions_block_styles['minHeight'] = 'unset';
} elseif (isset($block_attributes['style']['dimensions']['minHeight']) || isset($block_attributes['minHeight'])) {
$dimensions_block_styles['aspectRatio'] = 'unset';
}
$styles = wp_style_engine_get_styles(array('dimensions' => $dimensions_block_styles));
if (!empty($styles['css'])) {
// Inject dimensions styles to the first element, presuming it's the wrapper, if it exists.
$tags = new WP_HTML_Tag_Processor($block_content);
if ($tags->next_tag()) {
$existing_style = $tags->get_attribute('style');
$updated_style = '';
if (!empty($existing_style)) {
$updated_style = $existing_style;
if (!str_ends_with($existing_style, ';')) {
$updated_style .= ';';
}
}
$updated_style .= $styles['css'];
$tags->set_attribute('style', $updated_style);
if (!empty($styles['classnames'])) {
foreach (explode(' ', $styles['classnames']) as $class_name) {
if (str_contains($class_name, 'aspect-ratio') && !isset($block_attributes['style']['dimensions']['aspectRatio'])) {
continue;
}
$tags->add_class($class_name);
}
}
}
return $tags->get_updated_html();
}
return $block_content;
}