Маршруты для постов и таксономий
Rest API умеет создавать маршруты для произвольных типов записей и таксономий. Такие маршруты создаются внутри пространства имен wp/v2
. При этом будут использоваться привычные для этих типов контента контроллеры, см. Записи, Категории. Этот раздел показывает, как включить поддержку REST API при регистрации своего типа записи или таксономии. Ниже описан самый простой и удобный способ заставить все это работать.
Регистрация типа записи с поддержкой REST API
Поддержка REST API включается в функции register_post_type() при регистрации типа записи:
## Регистрация типа записи book с поддержкой rest API add_action( 'init', 'my_book_cpt' ); function my_book_cpt() { register_post_type( 'book', array( 'label' => 'Books' 'public' => true, ... // остальные параметры // параметры связанные с REST 'show_in_rest' => true, 'rest_base' => 'book', 'rest_controller_class' => 'WP_REST_Posts_Controller', ) ); }
- show_in_rest = true
- Включает поддержку REST API. Этот параметр добавит новый маршрут и соответствующие эндпоинты в пространство имен
wp/v2
. - rest_base
- Параметр, чтобы изменить название типа в URL (по умолчанию там указывается имя типа записи). Например, если указать
rest_base = books
, то вместоwp-json/wp/v2/book/
мы получим маршрутwp-json/wp/v2/books
. - rest_controller_class
- Параметр, где нужно указать подкласс класса WP_REST_Controller. По умолчанию в этом параметре используется подкласс WP_REST_Posts_Controller. Если используется другой контроллер, то скорее всего маршрут уже не будет находится в пространстве имен
wp/v2
.
Регистрация таксономии с поддержкой REST API
Поддержка REST API включается в функции register_taxonomy() при регистрации таксономии:
## Регистрация таксономии genre с поддержкой REST API add_action( 'init', 'my_book_taxonomy', 30 ); function my_book_taxonomy() { register_taxonomy( 'genre', array( 'book' ), array( 'hierarchical' => true, ... // остальные параметры // параметры связанные с REST 'show_in_rest' => true, 'rest_base' => 'genre', 'rest_controller_class' => 'WP_REST_Terms_Controller', ) ); }
Здесь все работает точно также как для типов записей:
- Включается поддержка REST API через
show_in_rest = true
. - В
rest_base
можно изменить название типа контента в маршруте. По умолчанию там указывается название таксономии. - В
rest_controller_class
можно изменить класс контроллера. По умолчанию там указывается класс WP_REST_Terms_Controller.
Добавление поддержки rest API к существующим типам Контента
Если произвольный Тип записи или Таксономия были добавлены темой или плагином (кодом, который вы не можете изменить), но вам нужно включить поддержку REST, то сделать это можно несколькими способами. В них нужно указать такие же переменные что описаны выше.
Вариант 1:
Этот вариант использует хуки register_post_type_args и register_taxonomy_args, чтобы изменить параметры типа записи и таксономии в момент их регистрации. Этот вариант более правильный, однако в редких случаях он может не работать (когда плагин или тема неправильно регистрируют типа записи или таксу - не на хуке init, как это рекомендовано).
Пример для типа записи:
## Добавим поддержку REST API для уже существующего типа записи add_filter( 'register_post_type_args', 'my_custom_post_type_rest_support', 10, 2 ); function my_custom_post_type_rest_support( $args, $post_type ) { // убедимся что это наш тип записи if ( $post_type === 'planet' ) { $args['show_in_rest'] = true; $args['rest_base'] = 'planet'; $args['rest_controller_class'] = 'WP_REST_Posts_Controller'; } return $args; }
Пример для типа таксономии:
## Добавим поддержку REST API для уже существующей таксономии add_action( 'register_taxonomy_args', 'my_custom_taxonomy_rest_support', 10, 2 ); function my_custom_taxonomy_rest_support( $args, $taxonomy ) { // убедимся что это наша таксономия if ( $taxonomy === 'planet_class' ) { $args['show_in_rest'] = true; $args['rest_base'] = 'planet_class'; $args['rest_controller_class'] = 'WP_REST_Terms_Controller'; } return $args; }
Вариант 2:
Этот вариант использует глобальные переменные $wp_post_types и $wp_taxonomies. Такой вариант более стабильный, по сравнению с предыдущем, однако он больше похож на костыль
Если код не срабатывает, то попробуйте повысить приоритет (укажите 99 вместо 50). Если хук срабатывает до регистрации типа записи или таксономии, то проверка isset предотвратит ошибку, но поддержка rest не будет добавлена.
## Добавим поддержку REST API для уже существующего типа записи add_action( 'init', 'my_custom_post_type_rest_support', 50 ); function my_custom_post_type_rest_support() { global $wp_post_types; // убедимся что это наш тип записи $post_type = 'planet'; if( isset( $wp_post_types[ $post_type ] ) ) { $wp_post_types[ $post_type ]->show_in_rest = true; $wp_post_types[ $post_type ]->rest_base = $post_type; $wp_post_types[ $post_type ]->rest_controller_class = 'WP_REST_Posts_Controller'; } }
## Добавим поддержку REST API для уже существующей таксономии add_action( 'init', 'my_custom_taxonomy_rest_support', 50 ); function my_custom_taxonomy_rest_support() { global $wp_taxonomies; // убедимся что это наша таксономия $tax_name = 'planet_class'; if ( isset( $wp_taxonomies[ $tax_name ] ) ) { $wp_taxonomies[ $tax_name ]->show_in_rest = true; $wp_taxonomies[ $tax_name ]->rest_base = $tax_name; $wp_taxonomies[ $tax_name ]->rest_controller_class = 'WP_REST_Terms_Controller'; } }
Связи ресурсов для произвольных типов
Про связи ресурсов читайте в разделе Ссылки и встраивания
Произвольные Типы записей и таксономии созданные для них автоматически связываются в REST ответе. Но что если, например, нужно связать два разных типа записи? В WP для этого нет каких-то специальных функций, но сделать это можно вручную прописав связи в свойстве _link соответствующего контроллера.