Query posts by custom taxonomy slug in WP REST API?

For the moment, I’ve created this workaround here thanks to this post here. It’s basically the same, just a little more general.

Assuming a custom post type with the your_custom_post_type slug, and three custom taxonomies with these names here:

  • first_custom_taxonomy_name
  • second_custom_taxonomy_name
  • third_custom_taxonomy_name

The code below enables to query via their slug value if you query not via their $taxonomy_name in the REST API, but via {$taxonomy_name}_slug.

More precisely:

  • Using the taxonomy name in the REST endpoint, you’d have to use the ID:

http://example.org/wp-json/wp/v2/your_custom_post_type?first_custom_taxonomy_name=12

  • Using the taxonomy name + _slug suffix, you can query in f(slug):

http://example.org/wp-json/wp/v2/your_custom_post_type?first_custom_taxonomy_name_slug=slug-value

/**
             * Querying via taxonomy slug is by default not possible in WP, we have to create a
             * filter to do so
             *
             * @param  array            $args     array of arguments to be used in WP_Query
             * @param  WP_REST_Request  $request  The REST API Request
             *
             * @return array $args array of arguments to be used in WP_Query, updated by this function
             */
            
            add_filter(
                "rest_your_custom_post_type_query",
                function (
                    array $args,
                    WP_REST_Request $request
                ): array {
                    
                    // Get parameters of the query
                    $params = $request->get_params();
                    
                    // Enable this feature for all of the custom taxonomies
                    $custom_taxonomies = [
                        'first_custom_taxonomy_name',
                        'second_custom_taxonomy_name',
                        'third_custom_taxonomy_name'
                    ];
                    
                    foreach ( $custom_taxonomies as $custom_taxonomy ) {
                        
                        if ( isset( $params["{$custom_taxonomy}_slug"] ) ) {
                            
                            $args['tax_query'][] = [
                                'taxonomy' => $custom_taxonomy,
                                'field'    => 'slug',
                                'terms'    => explode(
                                    ",",
                                    $params["{$custom_taxonomy}_slug"]
                                )
                            ];
                            
                        }
                        
                    }
                    
                    return $args;
                    
                },
                10,
                2
            );

You can easily extend this with additional taxonomies, just by adding the respective taxonomy name into $custom_taxonomies.