This introduces an output buffer for the entire template rendering process. This allows for post-processing of the complete HTML output via filtering before it is sent to the browser. This is primarily intended for performance optimizations and other progressive enhancements. Extenders must not rely on output buffer processing for critical content and functionality since a site may opt out of output buffering for the sake of streaming. Extenders are heavily encouraged to use the HTML API as opposed to using regular expressions in output buffer filters. * A new `wp_before_include_template` action is introduced, which fires immediately before the template file is included. This is useful on its own, as it avoids the need to misuse `template_include` filter to run logic right before the template is loaded (e.g. sending a `Server-Timing` header). * The `wp_start_template_enhancement_output_buffer()` function is hooked to this new action. It starts an output buffer, but only if there are `wp_template_enhancement_output_buffer` filters present, or else if there is an explicit opt-in via the `wp_should_output_buffer_template_for_enhancement` filter. * The `wp_finalize_template_enhancement_output_buffer()` function serves as the output buffer callback. It applies `wp_template_enhancement_output_buffer` filters to the buffered content if the response is identified as HTML. * The output buffer callback passes through (without filtering) any content for non-HTML responses, identified by the `Content-Type` response header. * This provides a standardized way for plugins (and core) to perform optimizations, such as removing unused CSS, without each opening their own ad hoc output buffer. Developed in https://github.com/WordPress/wordpress-develop/pull/8412. Props westonruter, nextendweb, dmsnell, flixos90, jorbin, peterwilsoncc, swissspidy, DrewAPicture, DaanvandenBergh, OptimizingMatters, tabrisrp, jonoaldersonwp, SergeyBiryukov. Fixes #43258. Built from https://develop.svn.wordpress.org/trunk@60936 git-svn-id: http://core.svn.wordpress.org/trunk@60272 1a063a9b-81f0-0310-95a4-ce76da25c4cd
134 lines
3.8 KiB
PHP
134 lines
3.8 KiB
PHP
<?php
|
||
/**
|
||
* Loads the correct template based on the visitor's URL
|
||
*
|
||
* @package WordPress
|
||
*/
|
||
if ( wp_using_themes() ) {
|
||
/**
|
||
* Fires before determining which template to load.
|
||
*
|
||
* This action hook executes just before WordPress determines which template page to load.
|
||
* It is a good hook to use if you need to do a redirect with full knowledge of the content
|
||
* that has been queried.
|
||
*
|
||
* Note: Loading a different template is not a good use of this hook. If you include another template
|
||
* and then use `exit()` or `die()`, no subsequent `template_redirect` hooks will be run, which could
|
||
* break the site’s functionality. Instead, use the {@see 'template_include'} filter hook to return
|
||
* the path to the new template you want to use. This will allow an alternative template to be used
|
||
* without interfering with the WordPress loading process.
|
||
*
|
||
* @since 1.5.0
|
||
*/
|
||
do_action( 'template_redirect' );
|
||
}
|
||
|
||
/**
|
||
* Filters whether to allow 'HEAD' requests to generate content.
|
||
*
|
||
* Provides a significant performance bump by exiting before the page
|
||
* content loads for 'HEAD' requests. See #14348.
|
||
*
|
||
* @since 3.5.0
|
||
*
|
||
* @param bool $exit Whether to exit without generating any content for 'HEAD' requests. Default true.
|
||
*/
|
||
if ( 'HEAD' === $_SERVER['REQUEST_METHOD'] && apply_filters( 'exit_on_http_head', true ) ) {
|
||
exit;
|
||
}
|
||
|
||
// Process feeds and trackbacks even if not using themes.
|
||
if ( is_robots() ) {
|
||
/**
|
||
* Fired when the template loader determines a robots.txt request.
|
||
*
|
||
* @since 2.1.0
|
||
*/
|
||
do_action( 'do_robots' );
|
||
return;
|
||
} elseif ( is_favicon() ) {
|
||
/**
|
||
* Fired when the template loader determines a favicon.ico request.
|
||
*
|
||
* @since 5.4.0
|
||
*/
|
||
do_action( 'do_favicon' );
|
||
return;
|
||
} elseif ( is_feed() ) {
|
||
do_feed();
|
||
return;
|
||
} elseif ( is_trackback() ) {
|
||
require ABSPATH . 'wp-trackback.php';
|
||
return;
|
||
}
|
||
|
||
if ( wp_using_themes() ) {
|
||
|
||
$tag_templates = array(
|
||
'is_embed' => 'get_embed_template',
|
||
'is_404' => 'get_404_template',
|
||
'is_search' => 'get_search_template',
|
||
'is_front_page' => 'get_front_page_template',
|
||
'is_home' => 'get_home_template',
|
||
'is_privacy_policy' => 'get_privacy_policy_template',
|
||
'is_post_type_archive' => 'get_post_type_archive_template',
|
||
'is_tax' => 'get_taxonomy_template',
|
||
'is_attachment' => 'get_attachment_template',
|
||
'is_single' => 'get_single_template',
|
||
'is_page' => 'get_page_template',
|
||
'is_singular' => 'get_singular_template',
|
||
'is_category' => 'get_category_template',
|
||
'is_tag' => 'get_tag_template',
|
||
'is_author' => 'get_author_template',
|
||
'is_date' => 'get_date_template',
|
||
'is_archive' => 'get_archive_template',
|
||
);
|
||
$template = false;
|
||
|
||
// Loop through each of the template conditionals, and find the appropriate template file.
|
||
foreach ( $tag_templates as $tag => $template_getter ) {
|
||
if ( call_user_func( $tag ) ) {
|
||
$template = call_user_func( $template_getter );
|
||
}
|
||
|
||
if ( $template ) {
|
||
if ( 'is_attachment' === $tag ) {
|
||
remove_filter( 'the_content', 'prepend_attachment' );
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
if ( ! $template ) {
|
||
$template = get_index_template();
|
||
}
|
||
|
||
/**
|
||
* Filters the path of the current template before including it.
|
||
*
|
||
* @since 3.0.0
|
||
*
|
||
* @param string $template The path of the template to include.
|
||
*/
|
||
$template = apply_filters( 'template_include', $template );
|
||
if ( $template ) {
|
||
/**
|
||
* Fires immediately before including the template.
|
||
*
|
||
* @since 6.9.0
|
||
*
|
||
* @param string $template The path of the template about to be included.
|
||
*/
|
||
do_action( 'wp_before_include_template', $template );
|
||
|
||
include $template;
|
||
} elseif ( current_user_can( 'switch_themes' ) ) {
|
||
$theme = wp_get_theme();
|
||
if ( $theme->errors() ) {
|
||
wp_die( $theme->errors() );
|
||
}
|
||
}
|
||
return;
|
||
}
|