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

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

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


person Mel Macaluso    schedule 06.06.2019    source источник
comment
Сообщите нам, что вы уже пробовали ... покажите нам код.   -  person cbdeveloper    schedule 06.06.2019
comment
@ cbdev420 Привет, я создал этот вопрос, чтобы помочь другим разработчикам, которые спотыкаются в темноте, отвечая на него сам (см. ниже).   -  person Mel Macaluso    schedule 06.06.2019


Ответы (3)


Еще одно простое решение, которое сейчас идеально подходит для меня. Вы можете добавить следующую функцию в 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);
person calmar    schedule 14.08.2019
comment
Это прекрасно работает! Обратите внимание, что для настраиваемого типа сообщений (cpt) фильтр rest_prepare_cpt - person PattyOK; 07.07.2020
comment
Вы, сэр, легенда. Большое спасибо за решение без плагинов и хаков. - person Marko; 30.08.2020

С помощью следующего кода вы сможете раскрыть page и свои пользовательские поля ACF посттипов в 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/6c4cb3d8610a878

person Mel Macaluso    schedule 06.06.2019

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

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

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

https://github.com/airesvsg/acf-to-rest-api-recursive

person Sagar Bahadur Tamang    schedule 06.06.2019
comment
Спасибо, я знал об этих плагинах и использовал их в прошлом. К сожалению, они часто ломаются из-за крупных (но также и незначительных) обновлений WordPress. Фрагмент кода тоже, но немного меньше, так как он использует основные функции WordPress. - person Mel Macaluso; 06.06.2019