Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/wp-includes/abilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,11 @@

$result = array();
foreach ( $requested_fields as $field ) {
$result[ $field ] = get_bloginfo( $field );
if ( 'language' === $field ) {
$result[ $field ] = str_replace( '_', '-', get_option( 'WPLANG' ) ?: 'en_US' );

Check failure on line 115 in src/wp-includes/abilities.php

View workflow job for this annotation

GitHub Actions / Coding standards / PHP checks

Using short ternaries is not allowed as they are rarely used correctly
} else {
$result[ $field ] = get_bloginfo( $field );
}
}

return $result;
Expand Down
75 changes: 75 additions & 0 deletions src/wp-includes/blocks/accordion-item/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

/**
* Server-side rendering of the `core/accordion-item` block.
*
* @package WordPress
* @since 6.9.0
*
* @param array $attributes The block attributes.
* @param string $content The block content.
*
* @return string Returns the updated markup.
*/
function block_core_accordion_item_render( $attributes, $content ) {
if ( ! $content ) {
return $content;
}

$p = new WP_HTML_Tag_Processor( $content );
$unique_id = wp_unique_id( 'accordion-item-' );

// Initialize the state of the item on the server using a closure,
// since we need to get derived state based on the current context.
wp_interactivity_state(
'core/accordion',
array(
'isOpen' => function () {
$context = wp_interactivity_get_context();
return $context['openByDefault'];
},
)
);

if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-item' ) ) ) {
$open_by_default = $attributes['openByDefault'] ? 'true' : 'false';
$p->set_attribute( 'data-wp-context', '{ "id": "' . $unique_id . '", "openByDefault": ' . $open_by_default . ' }' );
$p->set_attribute( 'data-wp-class--is-open', 'state.isOpen' );
$p->set_attribute( 'data-wp-init', 'callbacks.initAccordionItems' );
$p->set_attribute( 'data-wp-on-window--hashchange', 'callbacks.hashChange' );

if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-heading__toggle' ) ) ) {
$p->set_attribute( 'data-wp-on--click', 'actions.toggle' );
$p->set_attribute( 'data-wp-on--keydown', 'actions.handleKeyDown' );
$p->set_attribute( 'id', $unique_id );
$p->set_attribute( 'aria-controls', $unique_id . '-panel' );
$p->set_attribute( 'data-wp-bind--aria-expanded', 'state.isOpen' );

if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-panel' ) ) ) {
$p->set_attribute( 'id', $unique_id . '-panel' );
$p->set_attribute( 'aria-labelledby', $unique_id );
$p->set_attribute( 'data-wp-bind--inert', '!state.isOpen' );

// Only modify content if all directives have been set.
$content = $p->get_updated_html();
}
}
}

return $content;
}

/**
* Registers the `core/accordion-item` block on server.
*
* @since 6.9.0
*/
function register_block_core_accordion_item() {
register_block_type_from_metadata(
__DIR__ . '/accordion-item',
array(
'render_callback' => 'block_core_accordion_item_render',
)
);
}
add_action( 'init', 'register_block_core_accordion_item' );
45 changes: 45 additions & 0 deletions src/wp-includes/blocks/accordion/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php
/**
* Server-side rendering of the `core/accordion` block.
*
* @package WordPress
* @since 6.9.0
*
* @param array $attributes The block attributes.
* @param string $content The block content.
*
* @return string Returns the updated markup.
*/
function render_block_core_accordion( $attributes, $content ) {
if ( ! $content ) {
return $content;
}

$p = new WP_HTML_Tag_Processor( $content );
$autoclose = $attributes['autoclose'] ? 'true' : 'false';

if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion' ) ) ) {
$p->set_attribute( 'data-wp-interactive', 'core/accordion' );
$p->set_attribute( 'data-wp-context', '{ "autoclose": ' . $autoclose . ', "accordionItems": [] }' );

// Only modify content if directives have been set.
$content = $p->get_updated_html();
}

return $content;
}

/**
* Registers the `core/accordion` block on server.
*
* @since 6.9.0
*/
function register_block_core_accordion() {
register_block_type_from_metadata(
__DIR__ . '/accordion',
array(
'render_callback' => 'render_block_core_accordion',
)
);
}
add_action( 'init', 'register_block_core_accordion' );
174 changes: 174 additions & 0 deletions src/wp-includes/blocks/archives/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,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 = $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' );
Loading
Loading