Opened 12 years ago
Last modified 7 years ago
#21790 assigned defect (bug)
When set a static front page WP main query isn't set correctly
Reported by: | markoheijnen | Owned by: | SergeyBiryukov |
---|---|---|---|
Milestone: | Future Release | Priority: | normal |
Severity: | normal | Version: | 3.4.1 |
Component: | Query | Keywords: | needs-patch |
Focuses: | Cc: |
Description
In my project I use on several places pre_get_posts filter. When setting a static frontpage and blog page I get several notices on my screen. When I var_dump the main query the only value that is set it the page_id.
Even the post_type isn't set.
Attachments (1)
Change History (31)
#2
in reply to:
↑ 1
@
12 years ago
Replying to nacin:
The notices are?
Notice: Undefined property: WP_Query::$post in /var/www/vhosts/*/subdomains/*/httpdocs/wp-includes/query.php on line 2986
Notice: Trying to get property of non-object in /var/www/vhosts/*/subdomains/*/httpdocs/wp-includes/post-template.php on line 1270
Notice: Undefined property: WP_Query::$post in /var/www/vhosts/*/subdomains/*/httpdocs/wp-includes/query.php on line 2986
Notice: Trying to get property of non-object in /var/www/vhosts/*/subdomains/*/httpdocs/wp-includes/query.php on line 3349
Notice: Trying to get property of non-object in /var/www/vhosts/*/subdomains/*/httpdocs/wp-includes/query.php on line 3351
Notice: Trying to get property of non-object in /var/www/vhosts/*/subdomains/*/httpdocs/wp-includes/query.php on line 3353
#3
follow-up:
↓ 6
@
12 years ago
In my case I'm using is_page_template() and is_front_page() on the filter. How I look in the code this will only work inside the loop but I can be wrong. However I somehow do expect it to work without the need of a loop.
#5
@
12 years ago
For me to see the notices is to set a static blog and front page. and use a function like is_front_page. I'm going to try if I can write an unit-test to make it visible. Not sure yet how to create this situation and where to check on.
function some_random_modification( $query ) { if( $query->is_main_query() && is_front_page() ) { } return $query; } add_filter( 'pre_get_posts', 'some_random_modification' );
#6
in reply to:
↑ 3
@
12 years ago
is_front_page()
calls is_page()
, which only works on 'wp'
action or later.
'pre_get_posts'
is too early to use conditional tags (this is also mentioned on the Codex page).
#7
@
12 years ago
Uhm okay, i do think it is wrong tho. 'pre_get_posts' is a place you want to use it since you want to control the main query.
How I can see it now there is no way to do it then. Having said that it does work. I only get some notices.
#8
@
12 years ago
Just a little note what I already said: it only shows the notices when static homepage is set. On all other pages it is fine without any notice.
#9
@
12 years ago
Well, is_front_page()
only calls is_page()
when a static home page is set:
http://core.trac.wordpress.org/browser/tags/3.4.1/wp-includes/query.php#L3287
The notices are coming from get_queried_object()
, where $this->post
is not filled yet:
http://core.trac.wordpress.org/browser/tags/3.4.1/wp-includes/query.php#L2986
So $page_obj
in is_page()
ends up being null:
http://core.trac.wordpress.org/browser/tags/3.4.1/wp-includes/query.php#L3345
#10
@
12 years ago
yes, I know that. I looked through the code to see if I could fix it.
I'm now just curious if it is fixable or how you otherwise modify the query on the front page with the use of WordPress code.
#11
@
12 years ago
I now solved the issue by using this:
( $query->get('page_id') == get_option('page_on_front') || is_front_page() )
Reason was that is_front_page() doesn't work then in pre_get_posts(). It does work but I'm not a fan of using this.
#12
@
11 years ago
- Keywords dev-feedback removed
- Milestone Awaiting Review deleted
- Resolution set to wontfix
- Status changed from new to closed
This ticket appears to be dead - reopen if you think this needs a fix, Marko
#13
@
11 years ago
Ticket is dead since I have no clue how to fix it. The problem is that even core developers say you can use is_front_page() or is_home on the hook pre_get_posts
but you can't since it needs the page obj if a static page has been set. It also will fail then.
So no clue if the code should be fixed or the story we tell to developers.
#14
@
11 years ago
- Resolution wontfix deleted
- Status changed from closed to reopened
Reopening the ticket. This needs a code fix or documentation fix.
#16
@
10 years ago
- Keywords needs-patch needs-unit-tests added
- Milestone changed from Awaiting Review to 4.0
This seems tangentially related to #27015 - will review both
This ticket was mentioned in IRC in #wordpress-dev by SergeyBiryukov. View the logs.
10 years ago
#20
@
10 years ago
- Keywords 4.2-early added
- Milestone changed from Awaiting Review to Future Release
Just got bitten by this, trying to use is_front_page()
in pre_get_posts
.
Looks like the patch on #27015 should resolve this.
This ticket was mentioned in Slack in #core by jorbin. View the logs.
9 years ago
This ticket was mentioned in Slack in #core by jorbin. View the logs.
9 years ago
#28
@
8 years ago
This has been around for a while now. It would be really great to se some movement for 4.8.
This ticket was mentioned in Slack in #core by mattkersley. View the logs.
7 years ago
#30
@
7 years ago
Agreed @justnorris I've noticed quite a few folks having issue with this.
Per @jkohlbach it looks like he's found a workaround in the meantime (this is a WooCommerce specific example but will work elsewhere):
<?php add_action( 'pre_get_posts', 'is_shop_workaround_demo', 1 ); function is_shop_workaround_demo( $query ) { $front_page_id = get_option( 'page_on_front' ); $current_page_id = $query->get( 'page_id' ); $shop_page_id = apply_filters( 'woocommerce_get_shop_page_id' , get_option( 'woocommerce_shop_page_id' ) ); $is_static_front_page = 'page' == get_option( 'show_on_front' ); // Detect if it's a static front page and the current page is the front page, then use our work around // Otherwise, just use is_shop since it works fine on other pages if ( $is_static_front_page && $front_page_id == $current_page_id ) { error_log( 'is static front page and current page is front page' ); $is_shop_page = ( $current_page_id == $shop_page_id ) ? true : false; } else { error_log( 'is not static front page, can use is_shop instead' ); $is_shop_page = is_shop(); } // Now we can use it in a conditional like so: if ($is_shop_page) { error_log( 'this is the shop page' ); } }
The notices are?