Spaces:
Sleeping
Sleeping
File size: 4,337 Bytes
7428bdb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
<?php
/**
* Position block support flag.
*
* @package WordPress
* @since 6.2.0
*/
/**
* Registers the style block attribute for block types that support it.
*
* @since 6.2.0
* @access private
*
* @param WP_Block_Type $block_type Block Type.
*/
function wp_register_position_support( $block_type ) {
$has_position_support = block_has_support( $block_type, 'position', false );
// Set up attributes and styles within that if needed.
if ( ! $block_type->attributes ) {
$block_type->attributes = array();
}
if ( $has_position_support && ! array_key_exists( 'style', $block_type->attributes ) ) {
$block_type->attributes['style'] = array(
'type' => 'object',
);
}
}
/**
* 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;
}
// Register the block support.
WP_Block_Supports::get_instance()->register(
'position',
array(
'register_attribute' => 'wp_register_position_support',
)
);
add_filter( 'render_block', 'wp_render_position_support', 10, 2 );
|