Сегодня дебажил один свой код, написанный примерно два года назад и нашёл там такую строчку:
$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;