126 lines
4.0 KiB
PHP
126 lines
4.0 KiB
PHP
<?php
|
|
/**
|
|
* Server-side rendering of the `core/query` block.
|
|
*
|
|
* @package WordPress
|
|
*/
|
|
|
|
/**
|
|
* Modifies the static `core/query` block on the server.
|
|
*
|
|
* @since 6.4.0
|
|
*
|
|
* @param array $attributes Block attributes.
|
|
* @param string $content Block default content.
|
|
* @param string $block Block instance.
|
|
*
|
|
* @return string Returns the modified output of the query block.
|
|
*/
|
|
function render_block_core_query( $attributes, $content, $block ) {
|
|
if ( $attributes['enhancedPagination'] ) {
|
|
$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
|
|
)
|
|
);
|
|
$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`.
|
|
$last_div_position = strripos( $content, '</div>' );
|
|
$content = substr_replace(
|
|
$content,
|
|
'<div
|
|
class="wp-block-query__enhanced-pagination-navigation-announce"
|
|
aria-live="polite"
|
|
data-wp-text="context.core.query.message"
|
|
></div>
|
|
<div
|
|
class="wp-block-query__enhanced-pagination-animation"
|
|
data-wp-class--start-animation="selectors.core.query.startAnimation"
|
|
data-wp-class--finish-animation="selectors.core.query.finishAnimation"
|
|
></div>',
|
|
$last_div_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'] && 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'] && ! in_array( $view_asset, $script_handles, true ) ) {
|
|
$block->block_type->view_script_handles = array_merge( $script_handles, array( $view_asset ) );
|
|
}
|
|
}
|
|
|
|
$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'] && 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'] && ! in_array( $style_asset, $style_handles, true ) ) {
|
|
$block->block_type->style_handles = array_merge( $style_handles, array( $style_asset ) );
|
|
}
|
|
}
|
|
|
|
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.
|
|
*/
|
|
function register_block_core_query() {
|
|
register_block_type_from_metadata(
|
|
__DIR__ . '/query',
|
|
array(
|
|
'render_callback' => 'render_block_core_query',
|
|
)
|
|
);
|
|
}
|
|
add_action( 'init', 'register_block_core_query' );
|