Я хочу предоставить все поля ACF, которые принадлежат странице или пользовательскому типу записи, для WordPress REST API, чтобы выполнять некоторые вызовы API через javascript.
Конечным ожидаемым результатом будут все поля ACF внутри объекта ACF, к которым вы можете легко получить доступ.
@ cbdev420 Привет, я создал этот вопрос, чтобы помочь другим разработчикам, которые спотыкаются в темноте, отвечая на него сам (см. Ниже).






С помощью следующего кода вы сможете отображать 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.
Еще одно простое решение, которое отлично работает для меня сейчас.
Вы можете добавить следующую функцию на 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 cpt в rest_prepare_cpt означает слаг вашего cpt, а не буквальную строку cpt
ACF имеет возможность добавлять поля в REST API через каждое поле, начиная с версии 5.11. Вы можете ознакомиться с обновлением здесь: https://www.advancedcustomfields.com/resources/rest-api/
Суть в том, что каждое поле имеет параметр «Показать в REST API». По умолчанию для него установлено значение «Нет», но если вы переключите его на «Да», он будет добавлен к данным REST для каждого поста/пользовательского типа поста.
Дайте нам знать, что вы пробовали до сих пор.. покажите нам код.