Search code examples
phpwordpressfiltercustom-post-type

Filter custom post type based on post meta value


I want to create a filter in Wordpress Admin for a custom post type using the value of post_meta. I found that it's possible to filter based on a taxonomy from the hook 'restrict_manage_posts', and I managed to get this working using the following code. I'd like to modify it to filter based on the value of the post_meta. The reason I want this to be meta instead of taxonomy is so that it doesn't show on the front end. It should be a filter for the user's admin only. How can I use the filter with meta instead of taxonomy?

add_action( 'restrict_manage_posts', 'add_admin_filters', 10, 1 );
 
public function add_admin_filters( $post_type ){
    if( 'my_post_type' !== $post_type ){
        return;
    }
    $taxonomies_slugs = array(
        'my_taxonomy',
        'my_other_taxonomy'
    );
    // loop through the taxonomy filters array
    foreach( $taxonomies_slugs as $slug ){
        $taxonomy = get_taxonomy( $slug );
        $selected = '';
        // if the current page is already filtered, get the selected term slug
        $selected = isset( $_REQUEST[ $slug ] ) ? $_REQUEST[ $slug ] : '';
        // render a dropdown for this taxonomy's terms
        wp_dropdown_categories( array(
            'show_option_all' =>  $taxonomy->labels->all_items,
            'taxonomy'        =>  $slug,
            'name'            =>  $slug,
            'orderby'         =>  'name',
            'value_field'     =>  'slug',
            'selected'        =>  $selected,
            'hierarchical'    =>  true,
        ) );
    }
}

Solution

  • The solution to this is to use a private taxonomy instead of post_meta, and then you can create the filter. That way it doesn't show on the front end.

     /**
     * Register a private 'Genre' taxonomy for post type 'book'.
     *
     * @see register_post_type() for registering post types.
     */
    function wpdocs_register_private_taxonomy() {
        $args = array(
            'label'        => __( 'Genre', 'textdomain' ),
            'public'       => false,
            'rewrite'      => false,
            'hierarchical' => true
        );
         
        register_taxonomy( 'genre', 'book', $args );
    }
    add_action( 'init', 'wpdocs_register_private_taxonomy', 0 );