diff options
Diffstat (limited to 'wp-includes/blocks/widget-group.php')
-rw-r--r-- | wp-includes/blocks/widget-group.php | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/wp-includes/blocks/widget-group.php b/wp-includes/blocks/widget-group.php new file mode 100644 index 0000000..8c8584b --- /dev/null +++ b/wp-includes/blocks/widget-group.php @@ -0,0 +1,78 @@ +<?php +/** + * Server-side rendering of the `core/widget-group` block. + * + * @package WordPress + */ + +/** + * Renders the 'core/widget-group' block. + * + * @param array $attributes The block attributes. + * @param string $content The block content. + * @param WP_Block $block The block. + * + * @return string Rendered block. + */ +function render_block_core_widget_group( $attributes, $content, $block ) { + global $wp_registered_sidebars, $_sidebar_being_rendered; + + if ( isset( $wp_registered_sidebars[ $_sidebar_being_rendered ] ) ) { + $before_title = $wp_registered_sidebars[ $_sidebar_being_rendered ]['before_title']; + $after_title = $wp_registered_sidebars[ $_sidebar_being_rendered ]['after_title']; + } else { + $before_title = '<h2 class="widget-title">'; + $after_title = '</h2>'; + } + + $html = ''; + + if ( ! empty( $attributes['title'] ) ) { + $html .= $before_title . esc_html( $attributes['title'] ) . $after_title; + } + + $html .= '<div class="wp-widget-group__inner-blocks">'; + foreach ( $block->inner_blocks as $inner_block ) { + $html .= $inner_block->render(); + } + $html .= '</div>'; + + return $html; +} + +/** + * Registers the 'core/widget-group' block. + */ +function register_block_core_widget_group() { + register_block_type_from_metadata( + __DIR__ . '/widget-group', + array( + 'render_callback' => 'render_block_core_widget_group', + ) + ); +} + +add_action( 'init', 'register_block_core_widget_group' ); + +/** + * Make a note of the sidebar being rendered before WordPress starts rendering + * it. This lets us get to the current sidebar in + * render_block_core_widget_group(). + * + * @param int|string $index Index, name, or ID of the dynamic sidebar. + */ +function note_sidebar_being_rendered( $index ) { + global $_sidebar_being_rendered; + $_sidebar_being_rendered = $index; +} +add_action( 'dynamic_sidebar_before', 'note_sidebar_being_rendered' ); + +/** + * Clear whatever we set in note_sidebar_being_rendered() after WordPress + * finishes rendering a sidebar. + */ +function discard_sidebar_being_rendered() { + global $_sidebar_being_rendered; + unset( $_sidebar_being_rendered ); +} +add_action( 'dynamic_sidebar_after', 'discard_sidebar_being_rendered' ); |