WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm currently trying to set up some filters for a custom post type within my admin. The custom post type is 'players' and I'm filtering them by another custom post type 'teams'.

To create my dropdown list of teams I use get_posts to retrieve all my teams:

$args = array( 'numberposts' => -1, 'post_type'=> 'team', 'order' => 'ASC', 'orderby' => 'title' );
return get_posts( $args );

This works when I first arrive at the edit screen. Drop down list is rendered perfectly. I then perform the filter ( say by the Ladies 1st XI team ) and it works as expected, only players in the Ladies 1st XI are output. But my filter list isn't working any more, and I've narrowed this down to get_posts not retrieving anything from my database.

I've done a few tests and no matter what I do get_posts stops working after I've performed the filter.

For note this is the code I use to output my team filter and perform the filter when required:

add_filter( 'parse_query', 'esf_admin_posts_filter' );
add_action( 'restrict_manage_posts','esf_restrict_listings_by_team' );

function esf_restrict_listings_by_team( ){
global $typenow;
if ( $typenow=='player' ) {
    $teams = esf_get_teams();

    <select name="esf_team_select">
        <option value=""><?php _e('Filter By Team', 'baapf'); ?></option>
        <? foreach( $teams as $team): ?>
        <option value="<?=$team->ID?>"><?=$team->post_title?></option>
        <? endforeach; ?>

function esf_admin_posts_filter( $query ){
global $pagenow;

if ( is_admin() && $pagenow=='edit.php' && isset( $_GET['esf_team_select']) && $_GET['esf_team_select'] != '') {
        $query->query_vars['meta_key'] = 'esf_mm_teams';
        $query->query_vars['meta_value'] = $_GET['esf_team_select'];

return $query;

Thanks in advance for any help you can offer!


share|improve this question
up vote 2 down vote accepted

That's because esf_admin_posts_filter() will apply itself to your query inside esf_get_teams() too!

Adding $query->is_main_query() to the if conditions inside your filter should prevent this.

share|improve this answer
Works perfectly. Thanks for the answer and the explanation! Much appreciated – Helen Jul 5 '12 at 8:15

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.