How to Filter Your Posts & Pages by Custom Field in WordPress Dashboard

Snippets by IsItWP

Looking to filter your posts by custom field in WordPress admin? This snippet will add a new custom field dropdown menu to your WordPress post and page listings. The menu will display a list of all custom fields. To filter the posts and pages, you just need to select the field you want to filter by.

add select menu to filter by custom field admin


All you have to do is add this code to your theme’s functions.php file or in a site-specific plugin:

add_filter( 'parse_query', 'ba_admin_posts_filter' );
add_action( 'restrict_manage_posts', 'ba_admin_posts_filter_restrict_manage_posts' );

function ba_admin_posts_filter( $query )
    global $pagenow;
    if ( is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_NAME']) && $_GET['ADMIN_FILTER_FIELD_NAME'] != '') {
        $query->query_vars['meta_key'] = $_GET['ADMIN_FILTER_FIELD_NAME'];
        $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];

function ba_admin_posts_filter_restrict_manage_posts()
    global $wpdb;
    $sql = 'SELECT DISTINCT meta_key FROM '.$wpdb->postmeta.' ORDER BY 1';
    $fields = $wpdb->get_results($sql, ARRAY_N);
<option value=""><?php _e('Filter By Custom Fields', 'baapf'); ?></option>
    $current = isset($_GET['ADMIN_FILTER_FIELD_NAME'])? $_GET['ADMIN_FILTER_FIELD_NAME']:'';
    $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
    foreach ($fields as $field) {
        if (substr($field[0],0,1) != "_"){
                '<option value="%s"%s>%s</option>',
                $field[0] == $current? ' selected="selected"':'',
</select> <?php _e('Value:', 'baapf'); ?><input type="TEXT" name="ADMIN_FILTER_FIELD_VALUE" value="<?php echo $current_v; ?>" />

Note: If this is your first time adding code snippets in WordPress, then please refer to our guide on how to properly copy / paste code snippets in WordPress, so you don’t accidentally break your site.

If you liked this code snippet, please consider checking out our other articles on the site like: 62 best free WordPress blog themes or 7 best WordPress contact form plugins.

Comments   Leave a Reply

  1. Hi, is it possible to only view this on a certain type of post? Thank you

  2. Hi, thanks for the code, but unfortunately it doesn’t work for me. The selection dropdown appears above post list and has the right custom fields but if I write a value – it won’t display any results even though there is a number of posts that have this value in this custom field.

  3. hi i want to use his for Users custom post, how will the code change can anyone help me out!!

  4. Still working smoothly. Thanks, great snippet!

  5. Excellent. Post is somewhat elderly, yet I’ve just copied and pasted the code into my functions file and it works perfectly. (OK, not “perfectly” display wise, but tweaking is my problem! Functionally it seems spot on.) [WP 4.2.2] I’ve wanted this functionality for ages … and finding it was so easy once I decided to actually do something about that. Thanks EVERso! 🙂

  6. Salvatore Capolupo January 3, 2015 at 4:13 pm

    was looking for something like that. not so easy, and useful. thanks 🙂

  7. Hi all, can anyone help me to create a custom function to sort post order without plugin ? I would like to include the ability to sort postorder like pages…

    I have some code like add_filter( ‘parse_query’, ‘my_custom_post_sort’ );

    but I do not know how to go on …

  8. Hi there,

    I just came across your custom field filter snippet.

    Is it possible to filter tags as well? Any idea what I need to change?


  9. Hello, it seems really very interesting…

    But unfortunately it is not exactly I am looking for a long time.

    I really hate the search in Media Library. What is the purpose of search which is not able to find some attachment(s) neither by (sub)string in FILENAMEs, nor by ID, the strings in ALT or CAPTION, CUSTOM FIELDS, TAGS etc.. These standard SEARCH ability have every CMS but WP. Very strange. Do you have any idea hot to add something like this to Media Library “upload.php” and “media-upload.php” (pop-up window for inserting of attachments to Page/Post)?

    I am afraid I am not able to DIY, it is just above my knowledge of PHP. But it seems like you have the code ready for launch! In any case, this example is an inspiration for me.

    1. If you don’t add any information or keywords to your media records, how should you find them?
      Sure the WP search is very limited, but for the media it works fine if you add good ALT tags to every image 😉

      1. WHY to add it to meta data? Generally, FILENAME, ID, Author, etc. – all the information is present in database. Clever SQL can return the data. Not mentioning the problematic sort ASC/DESC columns – I mean the new columns added through function.php (FileSize, ID, etc.) I think the problem is apparent.

  10. Great post, thanks!

  11. This is amazing.
    Is there a way to show the filter only on a custom post type edit page?

    I tried putting a 
    if (isset($_GET[‘post_type’]) && $_GET[‘post_type’] == ‘product’)
    in the filter but it doesn’t seem to work.

  12. Excellent post, thanks Kevin. Implementing now on my sites!

    1. Cool glad to hear it.

  13. hi kevin! nice snippet!
    but i’m having a problem with it… its not possible for me to filter the posts admin list by multiples filters.
    if i filter by my custom field and category, so… it brings me no results (indeed there are).

    what’s can be happening?

    1. I’m sure multiple values would be possible just not something I have looked into, Ill delve a little deeper and see about doing something like this in a future snippet.

  14. Just implemented your code and it works great for the stated purpose. With your code I am able to quickly see which posts do have an entry for a particular custom field, however, I am hoping there is a way to show which posts don’t have an entry for that same custom field so it will be easier for me to go back through an add the missing entry instead of having to open each post individually to see if it has data in that particular custom field.  Any thoughts hugely appreciated.  Thanks!

    1. Well the best way would be to add the custom field value to the admin post listing, you could modify this snippet to do something like that.


      1. I ended up finding a plugin called “Mass Custom Fields Manager” that allowed me to identify all my posts that didn’t have the custom field I wanted and automatically add in the field with a value of my choosing.  I was then able to successfully use your functionality to now filter for that new value.  Works fantastic.  That saved me from having to manually sort through almost 2,000 posts.  Thanks!!

        1. Cool glad to hear you got things running, 2000 post would certainly be a lot to update by hand. No problem glad I could help out!

  15. Nice snippet, thanks.
    I will change it to get it working for the pages section.

    1. Glad to hear you like the snippet if you make any changes sending the changes back to wpsnipp.com via our contribute form http://wpsnipp.com/index.php/contribute/ would be great for our visitors. Enjoy the snippet!

    2. Hi Finalwebsites, have you changed the code? Can you help me?

        1. Thanks for posting the snippet update,

        2. Thank You! But the link gives me timeout!

  16. Kevin,

    thanks for the snippet. It works perfectly. I’m curious, does the ‘ba’ in ba_admin_posts_filter() stand for blog admin?

    1. The ba_admin_posts_filter function name is just a custom function it could be anything really. However in this case the author of the snippet included part of his domain name, en.bainternet.info as ba_

      1. Kevin, here’s a snippet I wrote so the filter can have ‘%’ and ‘_’ wildcards, in case anyone wants such a thing:

        function ba_admin_where_filter($where){    if (strpos($where, ‘meta_value’) !== FALSE) { $where = preg_replace(‘/(.meta_value[^=]*)=(.*)$/U’, “$1 LIKE $2″, $where);  } return $where;}add_filter( ‘posts_where_request’, ‘ba_admin_where_filter’ );FYI, if you specify 0 as the filter, it returns all posts. This is true of your original code as well. I thought it was because$_GET[‘ADMIN_FILTER_FIELD_VALUE’] != ”

        evaluates to false, so I tried 
        strval($_GET[‘ADMIN_FILTER_FIELD_VALUE’]) != ”

        but it still returned all posts. Oh well.

        1. Kevin, is there a way to show the hidden fields as well (i.e. the ones that start with underscore)? Thanks.

  17. Cliff Paulick July 25, 2011 at 5:31 pm

    Is there a way to create a front-end search, based on custom fields or custom taxonomies?

    1. Well this specific snippet is for the admin filtering, you could add the ability to have wordpress search custom fields as well. However with all that said I would check out the plugin search everything.  http://wordpress.org/extend/plugins/search-everything/

      1. Cliff Paulick July 25, 2011 at 6:37 pm

        Yes, I’ve seen that one and others. Just wondering if you had anything different/better – especially looking for a way to sync the search options.
        For example: If city = Tulsa, then narrow the state to only have 1 option = Oklahoma. Or if you choose Oklahoma first, then change the cities drop-down to only display cities in Oklahoma… Then press “Search”.

        Thanks again.

        1. Nothing that I have posted so far, however you can add category selection to search. I use that option in the search box on wpsnipp.com, could setup cities as categories.


Add a Comment Cancel reply

We're glad you have chosen to leave a comment. Please keep in mind that all comments are moderated according to our privacy policy, and all links are nofollow. Do NOT use keywords in the name field. Let's have a personal and meaningful conversation.

WordPress Launch Checklist

The Ultimate WordPress Launch Checklist

We've compiled all the essential checklist items for your next WordPress website launch into one handy ebook.
Yes, Send Me the Free eBook!