File "full-page-client-side-navigation.php"
Full Path: /home/pumpbmko/public_html/wp-content-20250114123711/plugins/gutenberg/lib/experimental/full-page-client-side-navigation.php
File size: 3.45 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Registers full page client-side navigation option using the Interactivity API and adds the necessary directives.
*/
/**
* Enqueue the interactivity router script.
*/
function _gutenberg_enqueue_interactivity_router() {
// Set the navigation mode to full page client-side navigation.
wp_interactivity_config( 'core/router', array( 'navigationMode' => 'fullPage' ) );
wp_enqueue_script_module( '@wordpress/interactivity-router' );
}
add_action( 'wp_enqueue_scripts', '_gutenberg_enqueue_interactivity_router' );
/**
* Set enhancedPagination attribute for query loop when the experiment is enabled.
*
* @param array $parsed_block The parsed block.
*
* @return array The same parsed block with the modified attribute.
*/
function _gutenberg_add_enhanced_pagination_to_query_block( $parsed_block ) {
if ( 'core/query' !== $parsed_block['blockName'] ) {
return $parsed_block;
}
$parsed_block['attrs']['enhancedPagination'] = true;
return $parsed_block;
}
add_filter( 'render_block_data', '_gutenberg_add_enhanced_pagination_to_query_block' );
/**
* Adds client-side navigation directives to BODY tag.
*
* Note: This should probably be done per site, not by default when this option is enabled.
*
* @param string $response_body The response body.
*
* @return string The rendered template with modified BODY attributes.
*/
function _gutenberg_add_client_side_navigation_directives( $response_body ) {
$is_html_content_type = false;
foreach ( headers_list() as $header ) {
$header_parts = preg_split( '/\s*[:;]\s*/', strtolower( $header ) );
if ( count( $header_parts ) >= 2 && 'content-type' === $header_parts[0] ) {
$is_html_content_type = in_array( $header_parts[1], array( 'text/html', 'application/xhtml+xml' ), true );
}
}
if ( ! $is_html_content_type ) {
return $response_body;
}
$p = new WP_HTML_Tag_Processor( $response_body );
if ( $p->next_tag( array( 'tag_name' => 'BODY' ) ) ) {
$p->set_attribute( 'data-wp-interactive', 'core/experimental' );
$p->set_attribute( 'data-wp-context', '{}' );
$response_body = $p->get_updated_html();
}
return $response_body;
}
// TODO: Explore moving this to the server directive processing.
add_filter( 'gutenberg_template_output_buffer', '_gutenberg_add_client_side_navigation_directives' );
/**
* Starts output buffering at the end of the 'template_include' filter.
*
* This is to implement #43258 in core.
*
* This is a hack which would eventually be replaced with something like this in wp-includes/template-loader.php:
*
* $template = apply_filters( 'template_include', $template );
* + ob_start( 'wp_template_output_buffer_callback' );
* if ( $template ) {
* include $template;
* } elseif ( current_user_can( 'switch_themes' ) ) {
*
* @link https://core.trac.wordpress.org/ticket/43258
*
* @param string $passthrough Value for the template_include filter which is passed through.
*
* @return string Unmodified value of $passthrough.
*/
function _gutenberg_buffer_template_output( string $passthrough ): string {
ob_start(
static function ( string $output ): string {
/**
* Filters the template output buffer prior to sending to the client.
*
* @param string $output Output buffer.
* @return string Filtered output buffer.
*/
return (string) apply_filters( 'gutenberg_template_output_buffer', $output );
}
);
return $passthrough;
}
add_filter( 'template_include', '_gutenberg_buffer_template_output', PHP_INT_MAX );