Пользовательские типы записей отфильтрованные по таксономии с помощью REST API v2

2 авг. 2017 г., 14:54:05
Просмотры: 29.8K
Голосов: 16

У меня следующая ситуация:

Я создал пользовательский тип записи с названием 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. Так какой правильный способ сделать это сейчас? Можете привести пример, пожалуйста?

Заранее спасибо!

0
Все ответы на вопрос 4
4
19

Хорошо, решение было следующим:

example.com/wp-json/wp/v2/works?work_type=10

Здесь work_types рассматриваются как идентификаторы. Вы можете посмотреть идентификаторы по адресу:

example.com/wp-json/wp/v2/works
2 авг. 2017 г. 15:16:25
Комментарии

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

user254153 user254153
1 сент. 2018 г. 09:13:12

Добавление _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

Tim Tim
1 окт. 2018 г. 16:49:55

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

That Brazilian Guy That Brazilian Guy
20 мая 2019 г. 18:26:46

@ThatBrazilianGuy не могли бы вы указать на какую-либо документацию по этому поводу? Техника, похоже, не работает с WP 5.3.2

jgangso jgangso
2 янв. 2020 г. 10:09:58
3

Я установил плагин 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
5 мар. 2019 г. 15:13:35
Комментарии

Пожалуйста, отметьте как решение. ;)

DARKVIDE DARKVIDE
5 февр. 2020 г. 14:38:53

Я считаю, что использование плагина - это не "решение"

ZecKa ZecKa
29 апр. 2020 г. 11:55:40

Согласен, просто установка плагина обычно не является решением, когда автор поста публикует код.

Simao Gomes Viana Simao Gomes Viana
2 мая 2024 г. 16:00:57
1

Если вам действительно нужно использовать 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
29 апр. 2020 г. 11:54:53
Комментарии

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

Mark Howells-Mead Mark Howells-Mead
16 сент. 2021 г. 15:16:58
0
-1

https://developer.wordpress.org/reference/functions/get_posts/

Эта ссылка поможет

Она включает метод get_posts(), который используется для получения записей

Передайте тип записи в аргументах

5 мар. 2019 г. 16:09:35