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
        $acf_fields = tribe_get_events(); // 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.
        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;
        }
}