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