Despite the fact I googled a lot, I've not found the answer to a very simple question :

I have some posts with a custom field (i.e. supplier_name). I would like to be able to search and filter my posts according to this custom field. In other words, in the admin posts listing, I would like to have a search box (named "Supplier name") where I can type in a value (ex. "IBM") and then, click on a search button that will give me back all the posts that have a custom field named "supplier_name" and, if so, the value of the custom field will be "IBM".

How can I do this ?


I coded a plugin just for that and never got around to publish it :

enter image description here


In the dropdown you have a list of all custom fields, so just select the field you want to filter by and click filter. if you want to filter to a specific value of a custom field then select the field's name , enter the value you want and click filter.

Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: Filter posts or pages in admin by custom fields (post meta)
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info

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; ?>" />
  • 7
    Why not use the helper function for your selection box? ie. replace $field[0] == $current? ' selected="selected"':'', with selected( $field[0] == $current, true, false ), ... :) – t31os Jul 18 '11 at 14:44
  • this answer doesn't work anymore. – Kir Mazur Jul 9 '18 at 19:48
  • Is there a way to make it work in newest versions of WordPress? – nakkeru Nov 27 '18 at 11:30

protected by Community Mar 13 '12 at 14:24

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

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