[wp-hackers] pre_get_posts problem

Mike Schinkel mikeschinkel at newclarity.net
Sun Aug 1 23:13:00 UTC 2010

On Jul 31, 2010, at 2:42 AM, Angelia Baladon wrote:

> Hi all,
> Well, I'm still at it trying to figure out what to do to get my custom post
> types in the loop for my author.php file. Ironically, I think I'm beginning
> to understand why everyone is using the pre_get_posts solution ... ? I got
> this bit from Andrew ... thanks Andrew! but, unfortunately, I tested it and
> it didn't return any results. Does anyone else have anything to add that
> might help here? There are literally hundreds of sites out there
> recommending the pre_get_posts solution to this, so, it anyone can help sort
> this out, I'll be sure to go viral with the answer ... if only *sigh*. It's
> over my head, so, all I can do is keep begging ;-)
> Here's the code from Andrew:
> <code>
> function my_request_cpt_author( $query_vars ) {
>   if ( is_author() )
>      $query_vars['post_type'] = array( 'post', 'my_post_type' );
>   return $query_vars;
> }
> add_filter( 'request', 'my_request_cpt_author' );
> </code>

Both the problem you are having and with that solution are several fold.  First you are testing for is_author() which returns true if you are on an author page however it will return true for the query of nav_menu_items as well.  So you have to ensure you are not running an author query and not an nav_menu_item query.

Also the "request" hook is the one I thought of first too, but it is fired before the $query->is_author property has been set so it won't return true inside a request hook even if you are on an author page.

So you need to use the right hook (one that works is "parse_query") and you need to figure out if you are running an author query, not that you are just on an author page.  You can do that by checking for isset($query->query['author_name']).  Of course if something else sets "author_name" for another query on the author page this will fail, but you can cross that bridge when you come to it.

I know you also wanted to have it work for the search page so do the same with the "s" arg, i.e. test isset($q['s']).  Same caveats here too; if someone sets the "s" query_var in the other query on the search page you'll get unexpected results.

Try this and let me know if it solves your problem:

add_filter( 'parse_query', 'my_parse_query' );
function my_parse_query( $query ) {
	$q = $query->query;
	$is_menu = (isset($q['post_type']) && $q['post_type']=='nav_menu_item');
	if (!$is_menu && ((is_author() && isset($q['author_name']) || (is_search() && isset($q['s']))))) {
		$query->query_vars['post_type'] = array( 'post', 'nav_menu_item', 'lesson', 'howto', 'workshop', 'attachment' );


More information about the wp-hackers mailing list