wp_render_position_support

The timeline below displays how wordpress function wp_render_position_support has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * Renders position styles to the block wrapper.
 *
 * @since 6.2.0
 * @access private
 *
 * @param  string $block_content Rendered block content.
 * @param  array  $block         Block object.
 * @return string                Filtered block content.
 */
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);
    if (!$has_position_support || empty($block['attrs']['style']['position'])) {
        return $block_content;
    }
    $global_settings = wp_get_global_settings();
    $theme_has_sticky_support = isset($global_settings['position']['sticky']) ? $global_settings['position']['sticky'] : false;
    $theme_has_fixed_support = isset($global_settings['position']['fixed']) ? $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';
    }
    $style_attribute = isset($block['attrs']['style']) ? $block['attrs']['style'] : null;
    $class_name = wp_unique_id('wp-container-');
    $selector = ".{$class_name}";
    $position_styles = array();
    $position_type = isset($style_attribute['position']['type']) ? $style_attribute['position']['type'] : '';
    $wrapper_classes = array();
    if (in_array($position_type, $allowed_position_types, true)) {
        $wrapper_classes[] = $class_name;
        $wrapper_classes[] = 'is-position-' . $position_type;
        $sides = array('top', 'right', 'bottom', 'left');
        foreach ($sides as $side) {
            $side_value = isset($style_attribute['position'][$side]) ? $style_attribute['position'][$side] : null;
            if (null !== $side_value) {
                /*
                 * For fixed or sticky top positions,
                 * ensure the value includes an offset for the logged in admin bar.
                 */
                if ('top' === $side && ('fixed' === $position_type || 'sticky' === $position_type)) {
                    // Ensure 0 values can be used in `calc()` calculations.
                    if ('0' === $side_value || 0 === $side_value) {
                        $side_value = '0px';
                    }
                    // Ensure current side value also factors in the height of the logged in admin bar.
                    $side_value = "calc({$side_value} + var(--wp-admin--admin-bar--position-offset, 0px))";
                }
                $position_styles[] = array('selector' => $selector, 'declarations' => array($side => $side_value));
            }
        }
        $position_styles[] = array('selector' => $selector, 'declarations' => array('position' => $position_type, 'z-index' => '10'));
    }
    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();
        foreach ($wrapper_classes as $class) {
            $content->add_class($class);
        }
        return (string) $content;
    }
    return $block_content;
}

WordPress Version: 6.2

/**
 * Renders position styles to the block wrapper.
 *
 * @since 6.2.0
 * @access private
 *
 * @param  string $block_content Rendered block content.
 * @param  array  $block         Block object.
 * @return string                Filtered block content.
 */
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, array('position'), false);
    if (!$has_position_support || empty($block['attrs']['style']['position'])) {
        return $block_content;
    }
    $global_settings = wp_get_global_settings();
    $theme_has_sticky_support = _wp_array_get($global_settings, array('position', 'sticky'), false);
    $theme_has_fixed_support = _wp_array_get($global_settings, array('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';
    }
    $style_attribute = _wp_array_get($block, array('attrs', 'style'), null);
    $class_name = wp_unique_id('wp-container-');
    $selector = ".{$class_name}";
    $position_styles = array();
    $position_type = _wp_array_get($style_attribute, array('position', 'type'), '');
    $wrapper_classes = array();
    if (in_array($position_type, $allowed_position_types, true)) {
        $wrapper_classes[] = $class_name;
        $wrapper_classes[] = 'is-position-' . $position_type;
        $sides = array('top', 'right', 'bottom', 'left');
        foreach ($sides as $side) {
            $side_value = _wp_array_get($style_attribute, array('position', $side));
            if (null !== $side_value) {
                /*
                 * For fixed or sticky top positions,
                 * ensure the value includes an offset for the logged in admin bar.
                 */
                if ('top' === $side && ('fixed' === $position_type || 'sticky' === $position_type)) {
                    // Ensure 0 values can be used in `calc()` calculations.
                    if ('0' === $side_value || 0 === $side_value) {
                        $side_value = '0px';
                    }
                    // Ensure current side value also factors in the height of the logged in admin bar.
                    $side_value = "calc({$side_value} + var(--wp-admin--admin-bar--position-offset, 0px))";
                }
                $position_styles[] = array('selector' => $selector, 'declarations' => array($side => $side_value));
            }
        }
        $position_styles[] = array('selector' => $selector, 'declarations' => array('position' => $position_type, 'z-index' => '10'));
    }
    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();
        foreach ($wrapper_classes as $class) {
            $content->add_class($class);
        }
        return (string) $content;
    }
    return $block_content;
}