[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/blocks/ -> archives.php (source)

   1  <?php
   2  /**
   3   * Server-side rendering of the `core/archives` block.
   4   *
   5   * @package WordPress
   6   */
   7  
   8  /**
   9   * Renders the `core/archives` block on server.
  10   *
  11   * @since 5.0.0
  12   *
  13   * @see WP_Widget_Archives
  14   *
  15   * @param array $attributes The block attributes.
  16   *
  17   * @return string Returns the post content with archives added.
  18   */
  19  function render_block_core_archives( $attributes ) {
  20      $show_post_count = ! empty( $attributes['showPostCounts'] );
  21      $type            = isset( $attributes['type'] ) ? $attributes['type'] : 'monthly';
  22  
  23      $class = 'wp-block-archives-list';
  24  
  25      if ( ! empty( $attributes['displayAsDropdown'] ) ) {
  26  
  27          $class = 'wp-block-archives-dropdown';
  28  
  29          $dropdown_id = wp_unique_id( 'wp-block-archives-' );
  30          $title       = __( 'Archives' );
  31  
  32          /** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */
  33          $dropdown_args = apply_filters(
  34              'widget_archives_dropdown_args',
  35              array(
  36                  'type'            => $type,
  37                  'format'          => 'option',
  38                  'show_post_count' => $show_post_count,
  39              )
  40          );
  41  
  42          $dropdown_args['echo'] = 0;
  43  
  44          $archives = wp_get_archives( $dropdown_args );
  45  
  46          $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) );
  47  
  48          switch ( $dropdown_args['type'] ) {
  49              case 'yearly':
  50                  $label = __( 'Select Year' );
  51                  break;
  52              case 'monthly':
  53                  $label = __( 'Select Month' );
  54                  break;
  55              case 'daily':
  56                  $label = __( 'Select Day' );
  57                  break;
  58              case 'weekly':
  59                  $label = __( 'Select Week' );
  60                  break;
  61              default:
  62                  $label = __( 'Select Post' );
  63                  break;
  64          }
  65  
  66          $show_label = empty( $attributes['showLabel'] ) ? ' screen-reader-text' : '';
  67  
  68          $block_content = '<label for="' . $dropdown_id . '" class="wp-block-archives__label' . $show_label . '">' . esc_html( $title ) . '</label>
  69          <select id="' . esc_attr( $dropdown_id ) . '" name="archive-dropdown">
  70          <option value="">' . esc_html( $label ) . '</option>' . $archives . '</select>';
  71  
  72          // Inject the dropdown script immediately after the select dropdown.
  73          $block_content .= block_core_archives_build_dropdown_script( $dropdown_id );
  74  
  75          return sprintf(
  76              '<div %1$s>%2$s</div>',
  77              $wrapper_attributes,
  78              $block_content
  79          );
  80      }
  81  
  82      /** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */
  83      $archives_args = apply_filters(
  84          'widget_archives_args',
  85          array(
  86              'type'            => $type,
  87              'show_post_count' => $show_post_count,
  88          )
  89      );
  90  
  91      $archives_args['echo'] = 0;
  92  
  93      $archives = wp_get_archives( $archives_args );
  94  
  95      $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) );
  96  
  97      if ( empty( $archives ) ) {
  98          return sprintf(
  99              '<div %1$s>%2$s</div>',
 100              $wrapper_attributes,
 101              __( 'No archives to show.' )
 102          );
 103      }
 104  
 105      return sprintf(
 106          '<ul %1$s>%2$s</ul>',
 107          $wrapper_attributes,
 108          $archives
 109      );
 110  }
 111  
 112  /**
 113   * Generates the inline script for an archives dropdown field.
 114   *
 115   * @since 6.9.0
 116   *
 117   * @param string $dropdown_id ID of the dropdown field.
 118   *
 119   * @return string Returns the dropdown onChange redirection script.
 120   */
 121  function block_core_archives_build_dropdown_script( $dropdown_id ) {
 122      ob_start();
 123  
 124      $exports = array( $dropdown_id, home_url() );
 125      ?>
 126      <script>
 127      ( ( [ dropdownId, homeUrl ] ) => {
 128          const dropdown = document.getElementById( dropdownId );
 129  		function onSelectChange() {
 130              setTimeout( () => {
 131                  if ( 'escape' === dropdown.dataset.lastkey ) {
 132                      return;
 133                  }
 134                  if ( dropdown.value ) {
 135                      location.href = dropdown.value;
 136                  }
 137              }, 250 );
 138          }
 139  		function onKeyUp( event ) {
 140              if ( 'Escape' === event.key ) {
 141                  dropdown.dataset.lastkey = 'escape';
 142              } else {
 143                  delete dropdown.dataset.lastkey;
 144              }
 145          }
 146  		function onClick() {
 147              delete dropdown.dataset.lastkey;
 148          }
 149          dropdown.addEventListener( 'keyup', onKeyUp );
 150          dropdown.addEventListener( 'click', onClick );
 151          dropdown.addEventListener( 'change', onSelectChange );
 152      } )( <?php echo wp_json_encode( $exports, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ); ?> );
 153      </script>
 154      <?php
 155      return wp_get_inline_script_tag(
 156          trim( str_replace( array( '<script>', '</script>' ), '', ob_get_clean() ) ) .
 157          "\n//# sourceURL=" . rawurlencode( __FUNCTION__ )
 158      );
 159  }
 160  
 161  /**
 162   * Register archives block.
 163   *
 164   * @since 5.0.0
 165   */
 166  function register_block_core_archives() {
 167      register_block_type_from_metadata(
 168          __DIR__ . '/archives',
 169          array(
 170              'render_callback' => 'render_block_core_archives',
 171          )
 172      );
 173  }
 174  add_action( 'init', 'register_block_core_archives' );


Generated : Wed Apr 15 08:20:10 2026 Cross-referenced by PHPXref