Did you check what part of is_front_page() is causing it to return false?
I could reproduce the problem by following the setup from the trac ticket. In my case inside this function the call to is_page() was returning false
.
I guess this is due to using $wp_query->set()
for page_id
and is_page
is only causing the query_vars
to be changed, you don’t change the “state of the query” itself.
I was able to create a workaround for this by appending this two lines to your code:
$query->is_page = true;
$query->queried_object = get_post(get_option('page_on_front') );
Which resulted (in my setup) in the page being correctly displayed on the frontpage (despite the query_var being present in the URL) and also is_front_page()
returning true
.
I hope this is helping you somewhat further.
If you look at the definition of the WP_Query class, you’ll see that there is a variable $query_vars
and a variable $is_page
.
The set
function you used ($query->set( 'is_page', true );
) does only set a query var:
function set($query_var, $value) {
$this->query_vars[$query_var] = $value;
}
It does not change the state information that is saved in $query->is_page = true
, instead it sets the query var $query->query_vars['is_page'] = true
.
That is a bit misleading if you come from an OOP-approach and understand WP_Query::set()
as a classic class-setter function – which it isn’t.