PluginProbe
Gutenberg / 22.9.0
Gutenberg v22.9.0
23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 7.4.0 All 402 releases
gutenberg / build / scripts / block-library / archives.php

archives.php in Gutenberg 22.9.0, at build/scripts/block-library/archives.php

175 lines 4.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 gutenberg_render_block_core_archives( $attributes ) {
20 $show_post_count = ! empty( $attributes['showPostCounts'] );
21 $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 .= gutenberg_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 gutenberg_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 gutenberg_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 gutenberg_onKeyUp( event ) {
140 if ( 'Escape' === event.key ) {
141 dropdown.dataset.lastkey = 'escape';
142 } else {
143 delete dropdown.dataset.lastkey;
144 }
145 }
146 function gutenberg_onClick() {
147 delete dropdown.dataset.lastkey;
148 }
149 dropdown.addEventListener( 'keyup', gutenberg_onKeyUp );
150 dropdown.addEventListener( 'click', gutenberg_onClick );
151 dropdown.addEventListener( 'change', gutenberg_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 gutenberg_register_block_core_archives() {
167 register_block_type_from_metadata(
168 __DIR__ . '/archives',
169 array(
170 'render_callback' => 'gutenberg_render_block_core_archives',
171 )
172 );
173 }
174 add_action( 'init', 'gutenberg_register_block_core_archives', 20 );
175