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'){
            return;
    }

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

    // 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) {
        ?>

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

        <?php
    }

    ?>

        </select>

    <?php
}

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 &&
        tribe_is_event($acf_field_id)
    ) {
        $q_vars['meta_key'] = 'acf_field';
        $q_vars['meta_value'] = $acf_field_id;
    }
}