Themes: Add a return value to theme functions calling locate_template():

* `get_header()`
* `get_footer()`
* `get_sidebar()`
* `get_template_part()`

These functions now return false if the template file could not be found, to allow for easier debugging.

Props tferry, sphakka, johnbillion, pento, davidbinda, desrosj, birgire, garrett-eclipse, williampatton, davidbaumwald, SergeyBiryukov.
Fixes #40969.

git-svn-id: https://develop.svn.wordpress.org/trunk@48209 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Sergey Biryukov 2020-06-28 23:08:57 +00:00
parent 43823df70a
commit 9f053c58fe
5 changed files with 65 additions and 10 deletions

View File

@ -16,8 +16,10 @@
* "special".
*
* @since 1.5.0
* @since 5.5.0 A return value was added.
*
* @param string $name The name of the specialised header.
* @return void|false Void on success, false if the template does not exist.
*/
function get_header( $name = null ) {
/**
@ -38,7 +40,9 @@ function get_header( $name = null ) {
$templates[] = 'header.php';
locate_template( $templates, true );
if ( ! locate_template( $templates, true ) ) {
return false;
}
}
/**
@ -51,8 +55,10 @@ function get_header( $name = null ) {
* "special".
*
* @since 1.5.0
* @since 5.5.0 A return value was added.
*
* @param string $name The name of the specialised footer.
* @return void|false Void on success, false if the template does not exist.
*/
function get_footer( $name = null ) {
/**
@ -73,7 +79,9 @@ function get_footer( $name = null ) {
$templates[] = 'footer.php';
locate_template( $templates, true );
if ( ! locate_template( $templates, true ) ) {
return false;
}
}
/**
@ -86,8 +94,10 @@ function get_footer( $name = null ) {
* "special".
*
* @since 1.5.0
* @since 5.5.0 A return value was added.
*
* @param string $name The name of the specialised sidebar.
* @return void|false Void on success, false if the template does not exist.
*/
function get_sidebar( $name = null ) {
/**
@ -108,7 +118,9 @@ function get_sidebar( $name = null ) {
$templates[] = 'sidebar.php';
locate_template( $templates, true );
if ( ! locate_template( $templates, true ) ) {
return false;
}
}
/**
@ -128,9 +140,11 @@ function get_sidebar( $name = null ) {
* "special".
*
* @since 3.0.0
* @since 5.5.0 A return value was added.
*
* @param string $slug The slug name for the generic template.
* @param string $name The name of the specialised template.
* @return void|false Void on success, false if the template does not exist.
*/
function get_template_part( $slug, $name = null ) {
/**
@ -165,7 +179,9 @@ function get_template_part( $slug, $name = null ) {
*/
do_action( 'get_template_part', $slug, $name, $templates );
locate_template( $templates, true, false );
if ( ! locate_template( $templates, true, false ) ) {
return false;
}
}
/**

View File

@ -0,0 +1 @@
Footer

View File

@ -0,0 +1 @@
Header

View File

@ -0,0 +1 @@
Sidebar

View File

@ -631,15 +631,51 @@ class Tests_General_Template extends WP_UnitTestCase {
/**
* @ticket 40969
*/
function test_get_template_part_returns_nothing() {
ob_start();
function test_get_header_returns_nothing_on_success() {
$this->expectOutputRegex( '/Header/' );
// The `get_header()` function must not return anything
// due to themes in the wild that may echo its return value.
$this->assertNull( get_header() );
}
/**
* @ticket 40969
*/
function test_get_footer_returns_nothing_on_success() {
$this->expectOutputRegex( '/Footer/' );
// The `get_footer()` function must not return anything
// due to themes in the wild that may echo its return value.
$this->assertNull( get_footer() );
}
/**
* @ticket 40969
*/
function test_get_sidebar_returns_nothing_on_success() {
$this->expectOutputRegex( '/Sidebar/' );
// The `get_sidebar()` function must not return anything
// due to themes in the wild that may echo its return value.
$this->assertNull( get_sidebar() );
}
/**
* @ticket 40969
*/
function test_get_template_part_returns_nothing_on_success() {
$this->expectOutputRegex( '/Template Part/' );
// The `get_template_part()` function must not return anything
// due to themes in the wild that echo its return value.
$part = get_template_part( 'template', 'part' );
$output = ob_get_clean();
$this->assertNull( get_template_part( 'template', 'part' ) );
}
self::assertSame( 'Template Part', trim( $output ) );
self::assertSame( null, $part );
/**
* @ticket 40969
*/
function test_get_template_part_returns_false_on_failure() {
$this->assertFalse( get_template_part( 'non-existing-template' ) );
}
}