Тут совсем короткая заметка которая по сути описывает то что есть в официальной документации, но когда я делал это в первый раз то проглядел данный момент.
Итак, допустим нам нужно добавить новый кастомный тип "Новости". Для этого в functions.php вашей темы регистрируем его:
// Новости
$labels = array(
'name' => 'Новости',
'singular_name' => 'Новости',
'menu_name' => 'Новости',
'name_admin_bar' => 'Новости',
'add_new' => 'Добавить',
'add_new_item' => 'Добавить новость',
'new_item' => 'Новая',
'edit_item' => 'Редактировать',
'view_item' => 'Просмотр',
'all_items' => 'Новости',
'search_items' => 'Поиск',
'parent_item_colon' => 'Новости',
'not_found' => 'Ничего не найдено',
'not_found_in_trash' => 'Ничего не найдено'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => false,
'revision' => true,
'show_in_rest' => true,
'supports' => array( 'title', 'thumbnail', 'excerpt', 'editor' ),
'rewrite' => array('slug' => 'news'),
);
register_post_type('news', $args);
В данном примере у новости я оставил только заголовок, содержимое, краткое описание и главное изображение.
Ну а где же вся магия из-за чего затевалась данная статья?
Так вот же - 'show_in_rest' => true
Этот параметр по дефолту выключен и свежесозданные типы данных без этой строчки недоступны в API.
Теперь добавляем её и новый роут http://example.com/wp-json/wp/v2/news/ отображается в списке роутов вот тут
http://example.com/wp-json/
Ну и чтоб заметка была не такой короткой поделюсь еще небольшим лайфхаком.
По-умолчанию в API выдается только ссылка на получение данных по изображению. Возьмем предыдущий запрос и выведем список наших новостей - http://example.com/wp-json/wp/v2/news/
В параметре
_links['wp:featuredmedia'][0]['href']
Мы обнаружим ссылку на запрос для получения данных по аттачу.
Например - http://example.com/wp-json/wp/v2/media/118 где 118 это id аттача.
Получается для получения полного поста нам нужно сделать 2 запроса - один для контента и один для картинки.
Но в WP предусмотрен вариант для получения всего сразу. Просто добавляем специальный GET-параметр и получаем данные по изображению в первом запросе.
http://example.com/wp-json/wp/v2/news/?_embed