[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/blocks/ -> tab-panel.php (source)

   1  <?php
   2  /**
   3   * Tab Panel Block
   4   *
   5   * @package WordPress
   6   */
   7  
   8  /**
   9   * Render callback for core/tab-panel.
  10   *
  11   * @since 7.1.0
  12   *
  13   * @param array     $attributes Block attributes.
  14   * @param string    $content    Block content.
  15   * @param \WP_Block $block      Block instance.
  16   *
  17   * @return string Updated HTML.
  18   */
  19  function block_core_tab_panel_render( array $attributes, string $content, \WP_Block $block ): string {
  20      $tabs_id = $block->context['core/tabs-id'] ?? '';
  21  
  22      static $tab_counters = array();
  23  
  24      if ( ! isset( $tab_counters[ $tabs_id ] ) ) {
  25          $tab_counters[ $tabs_id ] = 1;
  26      }
  27  
  28      $tab_number = $tab_counters[ $tabs_id ];
  29      ++$tab_counters[ $tabs_id ];
  30  
  31      $tag_processor = new WP_HTML_Tag_Processor( $content );
  32      $tag_processor->next_tag( array( 'class_name' => 'wp-block-tab-panel' ) );
  33  
  34      // Use the user's custom anchor if present, otherwise fall back to
  35      // the generated position-based ID.
  36      $tab_id = (string) $tag_processor->get_attribute( 'id' );
  37      if ( empty( $tab_id ) ) {
  38          $tab_id = ! empty( $tabs_id )
  39              ? $tabs_id . '-tab-' . $tab_number
  40              : 'tab-' . $tab_number;
  41          $tag_processor->set_attribute( 'id', $tab_id );
  42      }
  43  
  44      $tag_processor->set_attribute( 'aria-labelledby', 'tab__' . $tab_id );
  45  
  46      /*
  47       * Hiding a panel is left to the client, which is why `hidden` is bound to a
  48       * state getter the server cannot resolve rather than set here: a visitor
  49       * whose browser never runs the block's script is then given the content of
  50       * every panel instead of none of it. `core/accordion` works the same way.
  51       */
  52      $tag_processor->set_attribute( 'data-wp-bind--hidden', 'state.isHidden' );
  53      $tag_processor->set_attribute( 'data-wp-bind--tabindex', 'state.tabIndexAttribute' );
  54      $tag_processor->set_attribute( 'data-wp-on--beforematch', 'actions.handleBeforeMatch' );
  55  
  56      return (string) $tag_processor->get_updated_html();
  57  }
  58  
  59  /**
  60   * Registers the `core/tab-panel` block on the server.
  61   *
  62   * @hook init
  63   *
  64   * @since 7.1.0
  65   */
  66  function register_block_core_tab_panel() {
  67      register_block_type_from_metadata(
  68          __DIR__ . '/tab-panel',
  69          array(
  70              'render_callback' => 'block_core_tab_panel_render',
  71          )
  72      );
  73  }
  74  add_action( 'init', 'register_block_core_tab_panel' );


Generated : Mon Sep 14 08:20:31 2026 Cross-referenced by PHPXref