Query: Check if $wp_query is set in is_main_query().

This avoids a PHP fatal error and triggers a `_doing_it_wrong()` notice if `is_main_query()` is called too early, bringing consistency with all the other `is_*()` conditionals: `is_single()`, `is_home()`, etc.

Follow-up to [16947], [17068], [17083], [18699], [37985].

Props vdankbaar, nhadsall, johnbillion, costdev, thijsoo, teunvgisteren, timkersten655, SergeyBiryukov.
Fixes #55104.

git-svn-id: https://develop.svn.wordpress.org/trunk@53395 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Sergey Biryukov
2022-05-14 15:08:58 +00:00
parent 44cd1981b9
commit 3da312a954
2 changed files with 15 additions and 0 deletions

View File

@@ -901,6 +901,11 @@ function is_embed() {
function is_main_query() {
global $wp_query;
if ( ! isset( $wp_query ) ) {
_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '6.1.0' );
return false;
}
if ( 'pre_get_posts' === current_filter() ) {
_doing_it_wrong(
__FUNCTION__,

View File

@@ -1616,4 +1616,14 @@ class Tests_Query_Conditionals extends WP_UnitTestCase {
$this->assertQueryTrue( 'is_page', 'is_singular', 'is_privacy_policy' );
}
/**
* @ticket 55104
* @expectedIncorrectUsage is_main_query
*/
public function test_is_main_query_returns_false_if_wp_query_is_not_set() {
unset( $GLOBALS['wp_query'] );
$this->assertFalse( is_main_query() );
}
}