wpseek.com
A WordPress-centric search engine for devs and theme authors
wp_render_position_support is private and should not be used in themes or plugins directly.
wp_render_position_support › WordPress Function
Since6.2.0
Deprecatedn/a
› wp_render_position_support ( $block_content, $block )
| Access: |
|
| Parameters: (2) |
|
| Returns: |
|
| Defined at: |
|
| Codex: | |
| Change Log: |
|
Renders position styles to the block wrapper.
Source
function wp_render_position_support( $block_content, $block ) {
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
$has_position_support = block_has_support( $block_type, 'position', false );
$style_attribute = $block['attrs']['style'] ?? null;
if ( ! $has_position_support || ! is_array( $style_attribute ) ) {
return $block_content;
}
/*
* Position styles can exist in either the default state or a viewport state.
*/
$has_position_style = ! empty( $style_attribute['position'] );
if ( ! $has_position_style ) {
foreach ( $style_attribute as $key => $style ) {
if (
is_string( $key ) &&
str_starts_with( $key, '@' ) &&
is_array( $style ) &&
! empty( $style['position'] )
) {
$has_position_style = true;
break;
}
}
}
if ( ! $has_position_style ) {
return $block_content;
}
$global_settings = wp_get_global_settings();
$theme_has_sticky_support = $global_settings['position']['sticky'] ?? false;
$theme_has_fixed_support = $global_settings['position']['fixed'] ?? false;
// Only allow output for position types that the theme supports.
$allowed_position_types = array();
if ( true === $theme_has_sticky_support ) {
$allowed_position_types[] = 'sticky';
}
if ( true === $theme_has_fixed_support ) {
$allowed_position_types[] = 'fixed';
}
$viewport_settings = $global_settings['viewport'] ?? null;
$responsive_media_queries = WP_Theme_JSON::get_viewport_media_queries( $viewport_settings );
$class_name = wp_unique_id( 'wp-container-' );
$selector = ".$class_name";
$position_styles = array();
$wrapper_classes = array();
$base_position = $style_attribute['position'] ?? null;
// Default viewport (base) position styles.
$base_styles = wp_get_position_support_styles(
$selector,
$base_position,
$allowed_position_types
);
if ( ! empty( $base_styles ) ) {
$position_styles = $base_styles;
$wrapper_classes[] = 'is-position-' . $base_position['type'];
}
/*
* Responsive viewport state styles. A viewport state inherits any values
* it does not set from the default state, so a state that only overrides
* e.g. the `top` offset keeps the base position type.
*/
foreach ( $responsive_media_queries as $breakpoint => $media_query ) {
$viewport_position_style = $style_attribute[ $breakpoint ]['position'] ?? null;
if ( empty( $viewport_position_style ) || ! is_array( $viewport_position_style ) ) {
continue;
}
$viewport_position = is_array( $base_position )
? array_replace( $base_position, $viewport_position_style )
: $viewport_position_style;
$viewport_styles = wp_get_position_support_styles(
$selector,
$viewport_position,
$allowed_position_types
);
if ( ! empty( $viewport_styles ) ) {
$wrapper_classes[] = 'is-position-' . $viewport_position['type'];
} elseif ( ! empty( $base_styles ) ) {
/*
* The viewport state can explicitly clear the position type inherited from the
* default state.
*/
$viewport_styles = array(
array(
'selector' => $selector,
'declarations' => array( 'position' => 'static' ),
),
);
} else {
continue;
}
foreach ( $viewport_styles as $index => $rule ) {
$viewport_styles[ $index ]['rules_group'] = $media_query;
}
$position_styles = array_merge( $position_styles, $viewport_styles );
}
if ( ! empty( $position_styles ) ) {
/*
* Add to the style engine store to enqueue and render position styles.
*/
wp_style_engine_get_stylesheet_from_css_rules(
$position_styles,
array(
'context' => 'block-supports',
'prettify' => false,
)
);
// Inject class name to block container markup.
$content = new WP_HTML_Tag_Processor( $block_content );
$content->next_tag();
$content->add_class( $class_name );
foreach ( array_unique( $wrapper_classes ) as $class ) {
$content->add_class( $class );
}
return (string) $content;
}
return $block_content;
}