[buddypress-trac] [BuddyPress Trac] #9300: `is_home()` returns `true` on BuddyPress pages when checking early hooks
buddypress-trac
noreply at wordpress.org
Thu Aug 21 18:42:41 UTC 2025
#9300: `is_home()` returns `true` on BuddyPress pages when checking early hooks
--------------------------+-----------------------------
Reporter: r-a-y | Owner: (none)
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Route Parser | Version: 12.0.0
Severity: normal | Keywords: has-patch
--------------------------+-----------------------------
If a developer is doing checks for `is_home()` on an early hook like
`'pre_get_posts'`, `is_home()` will currently return `true` on any
BuddyPress page (except if a BuddyPress component is set as the front
page, in this case, `is_home()` will return `false` as expected).
BuddyPress pages should always have `is_home` set to `false` on these
early hooks.
You can use this code snippet to verify the current behavior:
{{{#!php
<?php
add_action(
'pre_get_posts',
function( $query ) {
if ( ! $query->is_main_query() ) {
return;
}
// This returns true on all BuddyPress pages at this juncture.
// Except for when a BP component page is set as the front page,
then this returns false.
var_dump( $query->is_home() );
}
);
// Runs later in the WP bootstrap.
add_action( 'wp', function() {
// This returns false on all BuddyPress pages at this juncture.
var_dump( is_home() );
} );
}}}
Here's the technical rundown as to why `is_home()` is returning true on
BuddyPress pages on early hooks such as the `'pre_get_posts'` hook:
BuddyPress rewrite pages are not correctly set as `is_singular = true` at
this juncture:
https://github.com/WordPress/WordPress/blob/817670fdedda7cab8d01ddbb3e3ca0f0d95db6de
/wp-includes/class-wp-query.php#L1035.
This is because BuddyPress pages are not real pages (if we exclude
directory pages), so WP's parse query block doesn't take this into
account. See
https://github.com/WordPress/WordPress/blob/817670fdedda7cab8d01ddbb3e3ca0f0d95db6de
/wp-includes/class-wp-query.php#L881-L891 where WP actually sets `is_page`
or `is_single`. BP rewrite rules do not use the query vars that WP is
expecting such as `'pagename'` or `'name'`. So since `is_singular` is
`false` when on a BP page, `is_home` is set to true at:
https://github.com/WordPress/WordPress/blob/817670fdedda7cab8d01ddbb3e3ca0f0d95db6de
/wp-includes/class-wp-query.php#L1044.
To address this, we can either set the query vars that WP is expecting
such as `'pagename'` or `'name'` to all our BP rewrite rules or we
manually set `is_home` to the correct value of `false` when on the
`'parse_query'` hook. I'm doing the latter since it's the easiest path.
--
Ticket URL: <https://buddypress.trac.wordpress.org/ticket/9300>
BuddyPress Trac <http://buddypress.org/>
BuddyPress Trac
More information about the buddypress-trac
mailing list