_wp_add_block_level_preset_styles

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

WordPress Version: 6.4

/**
 * Render the block level presets stylesheet.
 *
 * @internal
 *
 * @since 6.2.0
 * @since 6.3.0 Updated preset styles to use Selectors API.
 * @access private
 *
 * @param string|null $pre_render   The pre-rendered content. Default null.
 * @param array       $block The block being rendered.
 *
 * @return null
 */
function _wp_add_block_level_preset_styles($pre_render, $block)
{
    // Return early if the block has not support for descendent block styles.
    $block_type = WP_Block_Type_Registry::get_instance()->get_registered($block['blockName']);
    if (!block_has_support($block_type, '__experimentalSettings', false)) {
        return null;
    }
    // return early if no settings are found on the block attributes.
    $block_settings = isset($block['attrs']['settings']) ? $block['attrs']['settings'] : null;
    if (empty($block_settings)) {
        return null;
    }
    $class_name = '.' . _wp_get_presets_class_name($block);
    // the root selector for preset variables needs to target every possible block selector
    // in order for the general setting to override any bock specific setting of a parent block or
    // the site root.
    $variables_root_selector = '*,[class*="wp-block"]';
    $registry = WP_Block_Type_Registry::get_instance();
    $blocks = $registry->get_all_registered();
    foreach ($blocks as $block_type) {
        /*
         * We only want to append selectors for blocks using custom selectors
         * i.e. not `wp-block-<name>`.
         */
        $has_custom_selector = isset($block_type->supports['__experimentalSelector']) && is_string($block_type->supports['__experimentalSelector']) || isset($block_type->selectors['root']) && is_string($block_type->selectors['root']);
        if ($has_custom_selector) {
            $variables_root_selector .= ',' . wp_get_block_css_selector($block_type);
        }
    }
    $variables_root_selector = WP_Theme_JSON::scope_selector($class_name, $variables_root_selector);
    // Remove any potentially unsafe styles.
    $theme_json_shape = WP_Theme_JSON::remove_insecure_properties(array('version' => WP_Theme_JSON::LATEST_SCHEMA, 'settings' => $block_settings));
    $theme_json_object = new WP_Theme_JSON($theme_json_shape);
    $styles = '';
    // include preset css variables declaration on the stylesheet.
    $styles .= $theme_json_object->get_stylesheet(array('variables'), null, array('root_selector' => $variables_root_selector, 'scope' => $class_name));
    // include preset css classes on the the stylesheet.
    $styles .= $theme_json_object->get_stylesheet(array('presets'), null, array('root_selector' => $class_name . ',' . $class_name . ' *', 'scope' => $class_name));
    if (!empty($styles)) {
        wp_enqueue_block_support_styles($styles);
    }
    return null;
}

WordPress Version: 6.3

/**
 * Render the block level presets stylesheet.
 *
 * @internal
 *
 * @since 6.2.0
 * @since 6.3.0 Updated preset styles to use Selectors API.
 * @access private
 *
 * @param string|null $pre_render   The pre-rendered content. Default null.
 * @param array       $block The block being rendered.
 *
 * @return null
 */
function _wp_add_block_level_preset_styles($pre_render, $block)
{
    // Return early if the block has not support for descendent block styles.
    $block_type = WP_Block_Type_Registry::get_instance()->get_registered($block['blockName']);
    if (!block_has_support($block_type, array('__experimentalSettings'), false)) {
        return null;
    }
    // return early if no settings are found on the block attributes.
    $block_settings = _wp_array_get($block, array('attrs', 'settings'), null);
    if (empty($block_settings)) {
        return null;
    }
    $class_name = '.' . _wp_get_presets_class_name($block);
    // the root selector for preset variables needs to target every possible block selector
    // in order for the general setting to override any bock specific setting of a parent block or
    // the site root.
    $variables_root_selector = '*,[class*="wp-block"]';
    $registry = WP_Block_Type_Registry::get_instance();
    $blocks = $registry->get_all_registered();
    foreach ($blocks as $block_type) {
        /*
         * We only want to append selectors for blocks using custom selectors
         * i.e. not `wp-block-<name>`.
         */
        $has_custom_selector = isset($block_type->supports['__experimentalSelector']) && is_string($block_type->supports['__experimentalSelector']) || isset($block_type->selectors['root']) && is_string($block_type->selectors['root']);
        if ($has_custom_selector) {
            $variables_root_selector .= ',' . wp_get_block_css_selector($block_type);
        }
    }
    $variables_root_selector = WP_Theme_JSON::scope_selector($class_name, $variables_root_selector);
    // Remove any potentially unsafe styles.
    $theme_json_shape = WP_Theme_JSON::remove_insecure_properties(array('version' => WP_Theme_JSON::LATEST_SCHEMA, 'settings' => $block_settings));
    $theme_json_object = new WP_Theme_JSON($theme_json_shape);
    $styles = '';
    // include preset css variables declaration on the stylesheet.
    $styles .= $theme_json_object->get_stylesheet(array('variables'), null, array('root_selector' => $variables_root_selector, 'scope' => $class_name));
    // include preset css classes on the the stylesheet.
    $styles .= $theme_json_object->get_stylesheet(array('presets'), null, array('root_selector' => $class_name . ',' . $class_name . ' *', 'scope' => $class_name));
    if (!empty($styles)) {
        wp_enqueue_block_support_styles($styles);
    }
    return null;
}

WordPress Version: 6.2

/**
 * Render the block level presets stylesheet.
 *
 * @internal
 *
 * @since 6.2.0
 * @access private
 *
 * @param string|null $pre_render   The pre-rendered content. Default null.
 * @param array       $block The block being rendered.
 *
 * @return null
 */
function _wp_add_block_level_preset_styles($pre_render, $block)
{
    // Return early if the block has not support for descendent block styles.
    $block_type = WP_Block_Type_Registry::get_instance()->get_registered($block['blockName']);
    if (!block_has_support($block_type, array('__experimentalSettings'), false)) {
        return null;
    }
    // return early if no settings are found on the block attributes.
    $block_settings = _wp_array_get($block, array('attrs', 'settings'), null);
    if (empty($block_settings)) {
        return null;
    }
    $class_name = '.' . _wp_get_presets_class_name($block);
    // the root selector for preset variables needs to target every possible block selector
    // in order for the general setting to override any bock specific setting of a parent block or
    // the site root.
    $variables_root_selector = '*,[class*="wp-block"]';
    $registry = WP_Block_Type_Registry::get_instance();
    $blocks = $registry->get_all_registered();
    foreach ($blocks as $block_type) {
        if (isset($block_type->supports['__experimentalSelector']) && is_string($block_type->supports['__experimentalSelector'])) {
            $variables_root_selector .= ',' . $block_type->supports['__experimentalSelector'];
        }
    }
    $variables_root_selector = WP_Theme_JSON::scope_selector($class_name, $variables_root_selector);
    // Remove any potentially unsafe styles.
    $theme_json_shape = WP_Theme_JSON::remove_insecure_properties(array('version' => WP_Theme_JSON::LATEST_SCHEMA, 'settings' => $block_settings));
    $theme_json_object = new WP_Theme_JSON($theme_json_shape);
    $styles = '';
    // include preset css variables declaration on the stylesheet.
    $styles .= $theme_json_object->get_stylesheet(array('variables'), null, array('root_selector' => $variables_root_selector, 'scope' => $class_name));
    // include preset css classes on the the stylesheet.
    $styles .= $theme_json_object->get_stylesheet(array('presets'), null, array('root_selector' => $class_name . ',' . $class_name . ' *', 'scope' => $class_name));
    if (!empty($styles)) {
        wp_enqueue_block_support_styles($styles);
    }
    return null;
}