WordPress как на ладони
rgbcode is looking for WordPress developers.

Маршруты для постов и таксономий

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. Такой вариант более стабильный, по сравнению с предыдущем, однако он больше похож на костыль smile

Если код не срабатывает, то попробуйте повысить приоритет (укажите 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 соответствующего контроллера.

2 комментария
    Войти