From 30883c26bdceb9eaf32c8d4a1b0c1bce223b5226 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 09:57:26 +0200 Subject: Adding upstream version 6.5+dfsg1. Signed-off-by: Daniel Baumann --- wp-includes/blocks/query.php | 154 +++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 101 deletions(-) (limited to 'wp-includes/blocks/query.php') diff --git a/wp-includes/blocks/query.php b/wp-includes/blocks/query.php index b6a5733..b6c34eb 100644 --- a/wp-includes/blocks/query.php +++ b/wp-includes/blocks/query.php @@ -17,84 +17,57 @@ * @return string Returns the modified output of the query block. */ function render_block_core_query( $attributes, $content, $block ) { - if ( $attributes['enhancedPagination'] && isset( $attributes['queryId'] ) ) { + $is_interactive = isset( $attributes['enhancedPagination'] ) + && true === $attributes['enhancedPagination'] + && isset( $attributes['queryId'] ); + + // Enqueue the script module and add the necessary directives if the block is + // interactive. + if ( $is_interactive ) { + $suffix = wp_scripts_get_suffix(); + if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) { + $module_url = gutenberg_url( '/build/interactivity/query.min.js' ); + } + + wp_register_script_module( + '@wordpress/block-library/query', + isset( $module_url ) ? $module_url : includes_url( "blocks/query/view{$suffix}.js" ), + array( + array( + 'id' => '@wordpress/interactivity', + 'import' => 'static', + ), + array( + 'id' => '@wordpress/interactivity-router', + 'import' => 'dynamic', + ), + ), + defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' ) + ); + wp_enqueue_script_module( '@wordpress/block-library/query' ); + $p = new WP_HTML_Tag_Processor( $content ); if ( $p->next_tag() ) { // Add the necessary directives. - $p->set_attribute( 'data-wp-interactive', true ); - $p->set_attribute( 'data-wp-navigation-id', 'query-' . $attributes['queryId'] ); - // Use context to send translated strings. - $p->set_attribute( - 'data-wp-context', - wp_json_encode( - array( - 'core' => array( - 'query' => array( - 'loadingText' => __( 'Loading page, please wait.' ), - 'loadedText' => __( 'Page Loaded.' ), - ), - ), - ), - JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP - ) - ); + $p->set_attribute( 'data-wp-interactive', 'core/query' ); + $p->set_attribute( 'data-wp-router-region', 'query-' . $attributes['queryId'] ); + $p->set_attribute( 'data-wp-init', 'callbacks.setQueryRef' ); + $p->set_attribute( 'data-wp-context', '{}' ); $content = $p->get_updated_html(); - - // Mark the block as interactive. - $block->block_type->supports['interactivity'] = true; - - // Add a div to announce messages using `aria-live`. - $html_tag = 'div'; - if ( ! empty( $attributes['tagName'] ) ) { - $html_tag = esc_attr( $attributes['tagName'] ); - } - $last_tag_position = strripos( $content, '' ); - $content = substr_replace( - $content, - '
-
', - $last_tag_position, - 0 - ); - } - } - - $view_asset = 'wp-block-query-view'; - if ( ! wp_script_is( $view_asset ) ) { - $script_handles = $block->block_type->view_script_handles; - // If the script is not needed, and it is still in the `view_script_handles`, remove it. - if ( - ( ! $attributes['enhancedPagination'] || ! isset( $attributes['queryId'] ) ) - && in_array( $view_asset, $script_handles, true ) - ) { - $block->block_type->view_script_handles = array_diff( $script_handles, array( $view_asset ) ); - } - // If the script is needed, but it was previously removed, add it again. - if ( $attributes['enhancedPagination'] && isset( $attributes['queryId'] ) && ! in_array( $view_asset, $script_handles, true ) ) { - $block->block_type->view_script_handles = array_merge( $script_handles, array( $view_asset ) ); } } + // Add the styles to the block type if the block is interactive and remove + // them if it's not. $style_asset = 'wp-block-query'; if ( ! wp_style_is( $style_asset ) ) { $style_handles = $block->block_type->style_handles; // If the styles are not needed, and they are still in the `style_handles`, remove them. - if ( - ( ! $attributes['enhancedPagination'] || ! isset( $attributes['queryId'] ) ) - && in_array( $style_asset, $style_handles, true ) - ) { + if ( ! $is_interactive && in_array( $style_asset, $style_handles, true ) ) { $block->block_type->style_handles = array_diff( $style_handles, array( $style_asset ) ); } // If the styles are needed, but they were previously removed, add them again. - if ( $attributes['enhancedPagination'] && isset( $attributes['queryId'] ) && ! in_array( $style_asset, $style_handles, true ) ) { + if ( $is_interactive && ! in_array( $style_asset, $style_handles, true ) ) { $block->block_type->style_handles = array_merge( $style_handles, array( $style_asset ) ); } } @@ -102,25 +75,6 @@ function render_block_core_query( $attributes, $content, $block ) { return $content; } -/** - * Ensure that the view script has the `wp-interactivity` dependency. - * - * @since 6.4.0 - * - * @global WP_Scripts $wp_scripts - */ -function block_core_query_ensure_interactivity_dependency() { - global $wp_scripts; - if ( - isset( $wp_scripts->registered['wp-block-query-view'] ) && - ! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-query-view']->deps, true ) - ) { - $wp_scripts->registered['wp-block-query-view']->deps[] = 'wp-interactivity'; - } -} - -add_action( 'wp_print_scripts', 'block_core_query_ensure_interactivity_dependency' ); - /** * Registers the `core/query` block on the server. */ @@ -150,14 +104,18 @@ function block_core_query_disable_enhanced_pagination( $parsed_block ) { static $dirty_enhanced_queries = array(); static $render_query_callback = null; - $block_name = $parsed_block['blockName']; - - if ( - 'core/query' === $block_name && - isset( $parsed_block['attrs']['enhancedPagination'] ) && - true === $parsed_block['attrs']['enhancedPagination'] && - isset( $parsed_block['attrs']['queryId'] ) - ) { + $block_name = $parsed_block['blockName']; + $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block_name ); + $has_enhanced_pagination = isset( $parsed_block['attrs']['enhancedPagination'] ) && true === $parsed_block['attrs']['enhancedPagination'] && isset( $parsed_block['attrs']['queryId'] ); + /* + * Client side navigation can be true in two states: + * - supports.interactivity = true; + * - supports.interactivity.clientNavigation = true; + */ + $supports_client_navigation = ( isset( $block_type->supports['interactivity']['clientNavigation'] ) && true === $block_type->supports['interactivity']['clientNavigation'] ) + || ( isset( $block_type->supports['interactivity'] ) && true === $block_type->supports['interactivity'] ); + + if ( 'core/query' === $block_name && $has_enhanced_pagination ) { $enhanced_query_stack[] = $parsed_block['attrs']['queryId']; if ( ! isset( $render_query_callback ) ) { @@ -172,21 +130,15 @@ function block_core_query_disable_enhanced_pagination( $parsed_block ) { * @return string Returns the modified output of the query block. */ $render_query_callback = static function ( $content, $block ) use ( &$enhanced_query_stack, &$dirty_enhanced_queries, &$render_query_callback ) { - $has_enhanced_pagination = - isset( $block['attrs']['enhancedPagination'] ) && - true === $block['attrs']['enhancedPagination'] && - isset( $block['attrs']['queryId'] ); + $has_enhanced_pagination = isset( $block['attrs']['enhancedPagination'] ) && true === $block['attrs']['enhancedPagination'] && isset( $block['attrs']['queryId'] ); if ( ! $has_enhanced_pagination ) { return $content; } if ( isset( $dirty_enhanced_queries[ $block['attrs']['queryId'] ] ) ) { - $p = new WP_HTML_Tag_Processor( $content ); - if ( $p->next_tag() ) { - $p->set_attribute( 'data-wp-navigation-disabled', 'true' ); - } - $content = $p->get_updated_html(); + // Disable navigation in the router store config. + wp_interactivity_config( 'core/router', array( 'clientNavigationDisabled' => true ) ); $dirty_enhanced_queries[ $block['attrs']['queryId'] ] = null; } @@ -205,7 +157,7 @@ function block_core_query_disable_enhanced_pagination( $parsed_block ) { } elseif ( ! empty( $enhanced_query_stack ) && isset( $block_name ) && - ( ! str_starts_with( $block_name, 'core/' ) || 'core/post-content' === $block_name ) + ( ! $supports_client_navigation ) ) { foreach ( $enhanced_query_stack as $query_id ) { $dirty_enhanced_queries[ $query_id ] = true; -- cgit v1.2.3