WordPress Filterable Admin Columns for Custom Posts

After reading the great article on Ractoon.com on how to create sortable admin columns for custom posts, I decided I wanted to take things a step further and add a select box to the top of the posts table to filter by a custom field.

Here’s the code. I followed the same naming conventions as on Ractoon

add_action('restrict_manage_posts', 'filter_posts_by_mycpt');

function filter_posts_by_mycpt() {
    global $typenow;

    $acf_field_id = $_GET['acf_field'];
    //TODO: sanitize $_GET vars

    if ($typenow !== 'mycpt'){

        <select name="acf_field">
            <option value="0">All acf_fields</option>

    // Get all possible values the field can have.
    // In my case these are Events created by The Events 
    // calendar plugin. But it can be anything really.
    $acf_fields = tribe_get_events();

    foreach($acf_fields as $acf_field) {

                <?php echo $acf_field_id == $acf_field->ID ? 'selected' : '' ?>
                value="<?php echo $acf_field->ID ?>"
                <?php echo get_the_title($acf_field->ID) ?>





add_filter('parse_query', 'parse_query_filter_mycpt');

function parse_query_filter_mycpt($query) {
    global $pagenow;
    $post_type = 'mycpt'; // change to your post type
    $q_vars    = &$query->query_vars;

    $acf_field_id = $_GET['acf_field'];

    if (
        $pagenow == 'edit.php' &&
        isset($q_vars['post_type']) &&
        $q_vars['post_type'] == $post_type &&
    ) {
        $q_vars['meta_key'] = 'acf_field';
        $q_vars['meta_value'] = $acf_field_id;