Support » Plugins » Hacks » parse_query filter changed in 3.1 ?

  • in previous versions of WP (3.0.5), i had been able to list all Pages with a given Page Template (meta_key _wp_page_template = “mytemplate.php”) by adding a filter to the “parse_query” . the following code in my theme’s functions.php made it so the link /wp-admin/edit.php?s&post_type=page&mypagetemplate=mytemplate.php showed the EDIT PAGES screen, listing only Pages where the _wp_page_template = “mytemplate.php”

    add_filter( 'parse_query', 'my_pagetemplate_filter' );
    function my_pagetemplate_filter( $query ) {
        global $pagenow;
        if ( is_admin() && $pagenow == 'edit.php' && isset( $_GET['post_type'] ) && isset( $_GET['post_type'] ) == 'page' && isset( $_GET['mypagetemplate'] ) && isset( $_GET['mypagetemplate'] ) == 'mytemplate.php' ) {
            $query->query_vars['orderby'] = 'meta_value';
            $query->query_vars['meta_key'] = '_wp_page_template';
            $query->query_vars['meta_value'] = 'mytemplate.php';

    However, with the upgrade to 3.1, that no longer works, and the same link now just returns “No pages found.”

    Can anyone provide insight as to what has changed on the $query level, if this is still possible with WP 3.1, or if I should just forget that it ever was possible?

Viewing 10 replies - 1 through 10 (of 10 total)
  • It’s not your fault, i’ve just spent the last 30 minutes testing code and checking Trac for bug reports, it’s due to(as far as i can tell) the introduction of the new meta parameters, you need to replace the meta_key and meta_value args with meta_query..

    However, the usage of meta_query isn’t clear and sent me in circles for a little while, i finally spotted what i was doing wrong, which was highlighted in this ticket.

    Remove your three $query->query_vars lines and replace them with..

    set_query_var( 'meta_query', array( array( 'key' => '_wp_page_template', 'value' => 'mytemplate.php' ) ) );
    set_query_var( 'orderby','meta_value' );

    And your function should then work as it previously did.. 😉

    Thanks, Mark. That worked like a charm.

    Thanks (again) t31os! That was starting to seriously bake my bacon!

    Unfortunately this still returns no results.



    add_filter( 'parse_query', 'status_filter' );
    function status_filter( $query ) {
      global $pagenow;
        if ($pagenow=='edit.php' &&
        			isset($_GET['post_type']) && $_GET['post_type']=='inuit-firms' &&
                isset($_GET['sortby_status']) && !empty($_GET['sortby_status'])) {
            set_query_var( 'meta_query', array( array( 'key' => 'if_status', 'value' => $_GET['sortby_status']) ) );


    Before I was using the following which had no problems.

    add_filter( 'request', 'status_request' );
    function status_request($request) {
        $current_url = substr( $GLOBALS['PHP_SELF'], -18);
        if (is_admin() && $current_url == '/wp-admin/edit.php' && isset($request['post_type']) && $request['post_type']=='inuit-firms' &&
        isset( $_GET['sortby_status'] ) && !empty( $_GET['sortby_status'] ) ) {
    	$request['meta_key']   = 'if_status';
    	$request['meta_value'] = $_GET['sortby_status'];
        return $request;

    I tried this code as well but setting $request[‘meta_query’], but this also found no posts.

    Any thoughts on what could be conflicting in this case?


    Try this instead..

    add_action( 'parse_query', 'status_filter' );
    function status_filter() {
    	global $pagenow, $post_type;
    	if( 'edit.php' != $pagenow || 'inuit-firms' != $post_type || !isset( $_GET['sortby_status'] ) )
    	$meta_group = array(
    		'key' => 'if_status',
    		'value' => $_GET['sortby_status']
    	set_query_var( 'meta_query', array( $meta_group ) );

    Unfortunately still finds no posts.

    I’ve just tested the code for you and it works.

    Check your spelling, are you requesting the page with..


    and not..


    And is your field definately called if_status and not if-status

    I can only guess it’s a small error in the naming somewhere(eg. a missing or incorrect character), the code works for me.

    Is your post type name definately correct?
    Is the meta key you’re requesting correct and definately applied to one of the custom post types?

    I do not what it could be. I use the following code to display the dropdown and it works, showing the correct value when selected:

    [Code moderated as per the Forum Rules. Please use the pastebin]

    I definitely have at least one post of each.

    All to say, there could very easily be a naming error somewhere, but I have no idea where!

    I’ll keep looking.

    Thanks for your help,

    I can’t believe this was changed on us like this. My now-not working code seems a little different than the above. Can someone he;lp me out as to what to change?

    My Thesis function to omit some categories of posts from displaying.

    [Code moderated as per the Forum Rules. Please use the pastebin]

    I figured it out. I’ll post the change for anyone else:

    if ($query->is_home ) {
         $query->set('category__not_in', array(226,317));
       } elseif ($query->is_paged ) {
          $query->set('category__not_in', array(226,317));
       } elseif ($query->is_search ) {
          $query->set('category__not_in', array(226));
       } elseif ($query->is_archive ) {
          $query->set('category__not_in', array(226));
       } elseif ($query->is_feed ) {
          $query->set('category__not_in', array(226));
       return $query;
Viewing 10 replies - 1 through 10 (of 10 total)
  • The topic ‘parse_query filter changed in 3.1 ?’ is closed to new replies.