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

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_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 відповідного контролера.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *