widget-group.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. /**
  3. * Server-side rendering of the `core/widget-group` block.
  4. *
  5. * @package WordPress
  6. */
  7. /**
  8. * Renders the 'core/widget-group' block.
  9. *
  10. * @param array $attributes The block attributes.
  11. * @param string $content The block content.
  12. * @param WP_Block $block The block.
  13. *
  14. * @return string Rendered block.
  15. */
  16. function render_block_core_widget_group( $attributes, $content, $block ) {
  17. global $wp_registered_sidebars, $_sidebar_being_rendered;
  18. if ( isset( $wp_registered_sidebars[ $_sidebar_being_rendered ] ) ) {
  19. $before_title = $wp_registered_sidebars[ $_sidebar_being_rendered ]['before_title'];
  20. $after_title = $wp_registered_sidebars[ $_sidebar_being_rendered ]['after_title'];
  21. } else {
  22. $before_title = '<h2 class="widget-title">';
  23. $after_title = '</h2>';
  24. }
  25. $html = '';
  26. if ( ! empty( $attributes['title'] ) ) {
  27. $html .= $before_title . esc_html( $attributes['title'] ) . $after_title;
  28. }
  29. $html .= '<div class="wp-widget-group__inner-blocks">';
  30. foreach ( $block->inner_blocks as $inner_block ) {
  31. $html .= $inner_block->render();
  32. }
  33. $html .= '</div>';
  34. return $html;
  35. }
  36. /**
  37. * Registers the 'core/widget-group' block.
  38. */
  39. function register_block_core_widget_group() {
  40. register_block_type_from_metadata(
  41. __DIR__ . '/widget-group',
  42. array(
  43. 'render_callback' => 'render_block_core_widget_group',
  44. )
  45. );
  46. }
  47. add_action( 'init', 'register_block_core_widget_group' );
  48. /**
  49. * Make a note of the sidebar being rendered before WordPress starts rendering
  50. * it. This lets us get to the current sidebar in
  51. * render_block_core_widget_group().
  52. *
  53. * @param int|string $index Index, name, or ID of the dynamic sidebar.
  54. */
  55. function note_sidebar_being_rendered( $index ) {
  56. global $_sidebar_being_rendered;
  57. $_sidebar_being_rendered = $index;
  58. }
  59. add_action( 'dynamic_sidebar_before', 'note_sidebar_being_rendered' );
  60. /**
  61. * Clear whatever we set in note_sidebar_being_rendered() after WordPress
  62. * finishes rendering a sidebar.
  63. */
  64. function discard_sidebar_being_rendered() {
  65. global $_sidebar_being_rendered;
  66. unset( $_sidebar_being_rendered );
  67. }
  68. add_action( 'dynamic_sidebar_after', 'discard_sidebar_being_rendered' );