API на WordPress с использованием ACF + WP REST API?
Хотел сделать API на WordPress с использованием ACF + WP REST API.
Сделал типы записей Писатели, Книги.
И чтобы при заполнении Писателя было поле для выбора книг.
Для Писателя-01 выбрал Книга-01 и Книга-02.
Вот по этому адресу получаю список писателей.
http://api.site.ru/wp-json/wp/v2/writers/
Но книги там получается закопаны очень глубоко,
получается еще на 5 ступеней вниз надо спуститься чтобы добраться до одной книги писателя.
array/0/acf/писатели_и_их_книги/0/post_title
Потом до второй книги - еще в другой ветке так же на 5 ступеней вниз (см.рис.)
А хотелось бы более аккуратную структуру получить.
И вообще очень много лишних полей получается.
Вопрос - с плагином ACF только так можно сделать, или это я что-то не так делаю,
Или можно ли сделать с помощью другого плагина, может Карбон Филдс.
Или может лучше делать не через плагины, а только кодом в Functions.php
Дополнительно:
Отдавайте по апи уже сформированые нужным образом данные.. Читать про wp rest api для начала, потом основы php изучить
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

ACF сам по себе не обязан отдавать удобный публичный API. Он хранит поля так, как удобно WordPress-админке, а стандартный REST API часто возвращает слишком много служебных данных. Если Вам нужен аккуратный ответ вида “писатель + список книг”, лучше сформировать свой REST-ответ, а не пытаться использовать сырой вывод ACF как готовый API.
Нормальный вариант: зарегистрировать отдельный endpoint и вернуть только нужные поля. Например:
add_action('rest_api_init', function () { register_rest_route('site/v1', '/writers', [ 'methods' => 'GET', 'callback' => 'site_get_writers', 'permission_callback' => '__return_true', ]); }); function site_get_writers() { $writers = get_posts([ 'post_type' => 'writers', 'posts_per_page' => -1, ]); return array_map(function ($writer) { $books = get_field('writers_books', $writer->ID) ?: []; return [ 'id' => $writer->ID, 'title' => get_the_title($writer), 'books' => array_map(function ($book) { return [ 'id' => $book->ID, 'title' => get_the_title($book), 'url' => get_permalink($book), ]; }, $books), ]; }, $writers); }
Так Вы контролируете структуру, убираете лишние поля и не зависите от того, как ACF решил сериализовать relationship-поле. Carbon Fields решит задачу примерно так же: данные всё равно нужно нормально подготовить перед отдачей наружу.
Если API только внутренний, можно включить ACF в REST и затем на фронте “добираться” до вложенных данных. Но для публичного API это плохой вариант: структура тяжёлая, нестабильная и неудобная для клиента.
Итог: ACF использовать можно, но REST-ответ лучше делать кодом. ACF остаётся удобной админкой для заполнения данных, а endpoint формирует чистый JSON: без мусора, без глубокой вложенности и только с теми полями, которые нужны приложению.