Как открыть все поля ACF для Wordpress REST API как на страницах, так и в пользовательских посттипах

Я хочу предоставить все поля ACF, которые принадлежат странице или пользовательскому типу записи, для WordPress REST API, чтобы выполнять некоторые вызовы API через javascript.

Конечным ожидаемым результатом будут все поля ACF внутри объекта ACF, к которым вы можете легко получить доступ.

Дайте нам знать, что вы пробовали до сих пор.. покажите нам код.

cbdeveloper 06.06.2019 11:10

@ cbdev420 Привет, я создал этот вопрос, чтобы помочь другим разработчикам, которые спотыкаются в темноте, отвечая на него сам (см. Ниже).

Mel Macaluso 06.06.2019 11:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
20
2
21 476
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

С помощью следующего кода вы сможете отображать page и ваши настраиваемые поля ACF posttypes в WordPress REST API и получать к ним доступ внутри объекта ACF.

Очевидно, вы можете настроить посттипы для исключения или включения в массивы: $postypes_to_exclude и $extra_postypes_to_include.

function create_ACF_meta_in_REST() {
    $postypes_to_exclude = ['acf-field-group','acf-field'];
    $extra_postypes_to_include = ["page"];
    $post_types = array_diff(get_post_types(["_builtin" => false], 'names'),$postypes_to_exclude);

    array_push($post_types, $extra_postypes_to_include);

    foreach ($post_types as $post_type) {
        register_rest_field( $post_type, 'ACF', [
            'get_callback'    => 'expose_ACF_fields',
            'schema'          => null,
       ]
     );
    }

}

function expose_ACF_fields( $object ) {
    $ID = $object['id'];
    return get_fields($ID);
}

add_action( 'rest_api_init', 'create_ACF_meta_in_REST' );

Вот суть для справки: https://gist.github.com/MelMacaluso/6c4cb3db5ac87894f66a456ab8615f10

Вы можете использовать следующий плагин для отображения полей ACF в REST.

https://wordpress.org/plugins/acf-to-rest-api/

Если ваши поля ACF имеют отношения и вы хотите включить эти отношения в остальные, вы можете использовать следующий плагин.

https://github.com/airesvsg/acf-to-rest-api-рекурсивный

Спасибо, я знал об этих плагинах и использовал их в прошлом. К сожалению, они могут выйти из строя после серьезных (но также и незначительных) обновлений WordPress. Фрагмент кода тоже, но немного меньше, чем используются базовые функции WordPress.

Mel Macaluso 06.06.2019 11:59

Еще одно простое решение, которое отлично работает для меня сейчас. Вы можете добавить следующую функцию на functions.php или fields.php Использование ACF getFields перед отправкой запроса на отдых. Вы можете добавить это на любую специальную страницу rest_prepare_page или rest_prepare_post.

Данные ACF будут в ответе json с ключом acf

// add this to functions.php
//register acf fields to Wordpress API
//https://support.advancedcustomfields.com/forums/topic/json-rest-api-and-acf/

function acf_to_rest_api($response, $post, $request) {
    if (!function_exists('get_fields')) return $response;

    if (isset($post)) {
        $acf = get_fields($post->id);
        $response->data['acf'] = $acf;
    }
    return $response;
}
add_filter('rest_prepare_post', 'acf_to_rest_api', 10, 3);

Это отлично работает! Обратите внимание, что для пользовательского типа сообщений (cpt) используется фильтр rest_prepare_cpt

PattyOK 06.07.2020 23:04

Вы, сэр, легенда. Большое спасибо за предоставление решения без плагинов или хаков.

Marko 30.08.2020 21:09

И для тех, кто замедляет отметку, как я, в комментарии PattyOK cpt в rest_prepare_cpt означает слаг вашего cpt, а не буквальную строку cpt

mozboz 17.09.2021 15:49

ACF имеет возможность добавлять поля в REST API через каждое поле, начиная с версии 5.11. Вы можете ознакомиться с обновлением здесь: https://www.advancedcustomfields.com/resources/rest-api/

Суть в том, что каждое поле имеет параметр «Показать в REST API». По умолчанию для него установлено значение «Нет», но если вы переключите его на «Да», он будет добавлен к данным REST для каждого поста/пользовательского типа поста.

Другие вопросы по теме