Добавление произвольных типов постов и таксономий в REST API

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

Если вы не так давно начали работать с 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 );
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии