Не забываем про rest_base при отправке запросов к REST API

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

Сегодня дебажил один свой код, написанный примерно два года назад и нашёл там такую строчку:

$type = in_array( $post_type, array( 'post', 'page' ) ) ? $post_type . 's' : $post_type;
 
$request = wp_remote_request(
	"{$url}/wp-json/wp/v2/{$type}",
	array(
		'method' => 'POST',
		'headers' => array(

И этот код можно сказать работает в 99% случаях на практике, потому что за эти два года никто мне не пожаловался аля «Миша, твой плагин не робит для кастомных типов записей!». Но когда мы смотрим на такую историю $post_type . 's', то чисто подсознательно может казаться, что ну вот что-то здесь явно не чисто.

Да и вообще, вы не задались вопросом – почему это у стандартных типов записей (записей и страниц) энпойнты для REST API во множественном числе – wp/v2/posts и wp/v2/pages, а у кастомных типов – в единственном, например wp/v2/book?

Открою вам секрет – этот код будет работать до тех пор, пока кто-либо не зарегистрирует произвольный тип поста и не укажет при регистрации что-то произвольное в качестве параметра rest_base, например вот так:

$args = array(
	'labels' => array(
		'menu_name' => 'Countries'
	),
	'public' => true,
	'show_in_rest' => true,
	//'rest_base' => 'countries',
);
register_post_type( 'country', 'post', $args );

Это вызовет немедленную поломку всех REST API запросов.

А решение – невероятно симпл, всё что нам нужно, убрать странное шортхэнд условие и использовать функцию get_post_type_object() (с произвольными таксономиями история точно такая же, только функция другая – get_taxonomy()).

$post_type_object = get_post_type_object( $post_type );
$type = $post_type_object->rest_base ? $post_type_object->rest_base : $post_type;
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии