API на WordPress с использованием ACF + WP REST API?

Ссылка скопирована
1 ответ

Хотел сделать 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

API на WordPress с использованием ACF + WP REST API?

Дополнительно:

Отдавайте по апи уже сформированые нужным образом данные.. Читать про wp rest api для начала, потом основы php изучить

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

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);
}

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: без мусора, без глубокой вложенности и только с теми полями, которые нужны приложению.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно