Если вы не так давно начали работать с REST API, то не могли не заметить, что в официальной документации есть страница для Записей, есть для Страниц, но произвольные типы записей там не присутствуют.
Та же самая тема, что есть рубрики и метки, но нет таксономий.
В этом уроке мы разберёмся, как добавить маршруты REST API для произвольных постов и таксономий.
Регистрируем тип постов с его поддержкой REST API
На самом для того, чтобы тип записи поддерживался в REST API, достаточно при его регистрации в функцию register_post_type() добавить параметр show_in_rest
в значении true
. Уже после этого у типа записи появится машрут, например wp-json/wp/v2/book/
, пример регистрации:
$args = array( 'public' => true, 'show_in_rest' => true, 'label' => 'Книги' ); register_post_type( 'book', $args );
Также у вас есть возможность задать произвольный маршрут, к примеру не wp/v2/book/
, а wp/v2/books/
, наподобии того, как это делается во множественном числе у записей и страниц. Тогда код регистрации типа записи будет включать ещё и параметр rest_base
, вот как тут:
$args = array( 'public' => true, 'show_in_rest' => true, 'rest_base' => 'books', 'rest_controller_class' => 'WP_REST_Posts_Controller', 'label' => 'Книги' ); register_post_type( 'book', $args );
Для уже зарегистрированного типа записи
В некоторых ситуациях тип записи уже может быть зарегистрирован, например каким-либо плагином или в теме, и у нас уже нет доступа к функции register_post_type(), но даже тогда, но если только ваша версия WordPress выше 4.6.0, у нас есть возможность использовать хук register_post_type_args
.
Передаём через хук те же самые параметры, что мы обсуждали чуть выше:
add_filter( 'register_post_type_args', function( $args, $post_type ) { if( 'book' === $post_type ) { $args[ 'show_in_rest' ] = true; $args[ 'rest_base' ] = 'books'; $args[ 'rest_controller_class' ] = 'WP_REST_Posts_Controller'; } return $args; }, 10, 2 );
Регистрируем таксономию с поддержкой в REST API
Ситуация с таксономиями полностью идентична ситуации с произвольными типами записей. Всё, что нам требуется, это передать в функцию register_taxonomy() параметр 'show_in_rest' => true
, а также, если хотим кастомизировать маршрут, передаём параметры rest_base
и rest_controller_class
.
$labels = array( 'name' => 'Жанры', 'taxonomy general name', 'singular_name' => 'Жанр', 'taxonomy 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' => 'genre' ), 'show_in_rest' => true, 'rest_base' => 'genre', 'rest_controller_class' => 'WP_REST_Terms_Controller', ); register_taxonomy( 'genre', array( 'book' ), $args );
Для уже зарегистрированной таксономии
Точно так же, как и с произвольными типами записей, если ваша таксономия уже была когда-то зарегистрирована и вы не можете редактировать функцию register_taxonomy() непосредственно, то начиная с версии WordPress 4.4.0 это можно сделать через хук register_taxonomy_args
.
add_filter( 'register_taxonomy_args', function( $args, $taxonomy_name ) { if ( 'genre' === $taxonomy_name ) { $args[ 'show_in_rest' ] = true; $args[ 'rest_base' ] = 'genres'; $args[ 'rest_controller_class' ] = 'WP_REST_Terms_Controller'; } return $args; }, 10, 2 );