Пользовательские типы записей отфильтрованные по таксономии с помощью REST API v2
У меня следующая ситуация:
Я создал пользовательский тип записи с названием Works. И также прикрепил к нему пользовательскую таксономию с названием Work Types
Вот код
function rk_work_post_type(){
$labels = array(
'name' => 'Работы',
'singular_name' => 'Работа',
'add_new' => 'Добавить работу',
'all_items' => 'Все работы',
'add_new_item' => 'Добавить работу',
'edit_item' => 'Редактировать работу',
'new_item' => 'Новая работа',
'view_item' => 'Просмотр работы',
'search_item' => 'Поиск работы',
'not_found' => 'Записей не найдено',
'not_found_in_trash' => 'В корзине записей не найдено',
'parent_item_colon' => 'Родительская запись'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'publicly_queryable' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'supports' => array(
'title',
'editor',
'excerpt',
'thumbnail',
'revisions',
'comments',
),
// 'taxonomies' => array('category', 'post_tag'),
'menu_icon' => 'dashicons-hammer',
'menu_position' => 5,
'exclude_from_search' => false,
'show_in_rest' => true,
'rest_base' => 'works',
'rest_controller_class' => 'WP_REST_Posts_Controller',
);
register_post_type('work',$args);
}
add_action('init','rk_work_post_type');
function rk_work_taxonomies() {
//добавить новую иерархическую таксономию
$labels = array(
'name' => 'Типы работ',
'singular_name' => 'Тип работы',
'search_items' => 'Поиск типов',
'all_items' => 'Все типы работ',
'parent_item' => 'Родительский тип',
'parent_item_colon' => 'Родительский тип:',
'edit_item' => 'Редактировать тип работы',
'update_item' => 'Обновить тип работы',
'add_new_item' => 'Добавить новый тип работы',
'new_item_name' => 'Название нового типа работы',
'menu_name' => 'Типы работ'
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'work_type' ),
'show_in_rest' => true,
'rest_base' => 'work_type',
'rest_controller_class' => 'WP_REST_Terms_Controller',
);
register_taxonomy('work_type', array('work'), $args);
}
add_action( 'init' , 'rk_work_taxonomies' );
Проблема в том, что я не могу найти способ получить Works отфильтрованные по Work Type используя REST API v2
Я читал, что после некоторого обновления WordPress фильтр запросов был удален из REST API. Так какой правильный способ сделать это сейчас? Можете привести пример, пожалуйста?
Заранее спасибо!

для получения по слагу просто добавьте _slug в конце слага категории. work_type_slug={slug}

Добавление _slug в конце параметра не работает у меня. Я использую WordPress 4.9.8, REST API v2. Однако использование id работает отлично.
Если вы хотите получить отдельный термин из REST API на основе слага, то используйте slug={term_slug}, например:
example.com/wp-json/wp/v2/works?slug=work-type-slug

Чтобы это работало, необходимо указать 'show_in_rest' => true,
в register_taxonomy
.

Я установил плагин WP REST Filter и теперь могу фильтровать записи по слагу категории, например:
http://www.example.com/wp-json/wp/v2/my_custom_posts?filter[my_custom_taxomony]=my_custom_taxonomy_slug
В вашем случае:
http://www.example.com/wp-json/wp/v2/works?filter[work_type]=building

Если вам действительно нужно использовать slug в качестве параметра URL, вы можете добавить пользовательский фильтр, ознакомьтесь с хуком rest_{$this->post_type}_query
Вы можете сделать что-то вроде этого (post_type: work, таксономия: work_type):
/**
* Фильтрация типа записи work по slug таксономии work_type
*
* @param array $args
* @param WP_Rest_Rquest $request
* @return array $args
*/
function filter_rest_work_query( $args, $request ) {
$params = $request->get_params();
if(isset($params['work_type_slug'])){
$args['tax_query'] = array(
array(
'taxonomy' => 'work_type',
'field' => 'slug',
'terms' => explode(',', $params['work_type_slug'])
)
);
}
return $args;
}
// Добавляем фильтр
add_filter( "rest_work_query", 'filter_rest_work_query', 10, 2 );
и затем
https://example.com/wp-json/wp/v2/work?work_type_slug=slug01,slug02

Этот код будет работать только в том случае, если не передаются другие таксономии. (Явная установка $args['tax_query'] таким образом перезапишет любые другие значения tax_query, которые могут быть установлены.) Вам нужно проверить, определен ли массив, и расширить его, если это так, а не перезаписывать.

https://developer.wordpress.org/reference/functions/get_posts/
Эта ссылка поможет
Она включает метод get_posts(), который используется для получения записей
Передайте тип записи в аргументах
