如何在WordPress的页面和自定义文章类型中向REST API公开所有ACF字段

20

我希望在WordPress REST API中暴露属于页面或自定义文章类型的所有ACF字段,以便通过JavaScript进行一些API调用。

最终期望的结果是将所有ACF字段放入一个名为ACF的对象中,以便轻松访问。


请告诉我们你已经尝试了什么,展示一些代码给我们看看。 - cbdeveloper
3
@cbdev420你好,我创建了这个问题只是为了帮助其他在黑暗中摸索的开发人员,下面是我的答案。 - Mel Macaluso
4个回答

35

另一个对我现在完美运作的简单解决方案。 您可以在functions.phpfields.php中添加以下函数 在发送rest请求之前使用ACF {{link1:getFields}}。您可以将其添加到任何特殊页面rest_prepare_pagerest_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') && isset($post->id)) {
        $response->data['acf'] = get_fields($post->id);
    }
    return $response;
}
add_filter('rest_prepare_post', 'acf_to_rest_api', 10, 3);

9
做得很好!请注意,对于自定义文章类型(CPT),筛选器是 rest_prepare_cpt - PattyOK
2
您先生是一个传奇。非常感谢您提供了没有插件或黑客的解决方案。 - Marko
1
对于像我这样慢一拍的人,在PattyOK的评论中,“cpt”在“rest_prepare_cpt”中代表您的自定义文章类型(CPT)的slug,而不是字面字符串“cpt”。 - mozboz

18
通过以下代码,您将能够在WordPress REST API中公开页面和自定义内容类型的ACF字段,并在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


3
ACF在5.11版本中具有通过每个字段添加到REST API的能力。您可以在此处查看更新:https://www.advancedcustomfields.com/resources/rest-api/ 要点是每个字段都有一个“在REST API中显示”的设置。默认情况下,它设置为“否”,但如果您将其切换为“是”,它将被添加到每个帖子/自定义帖子类型的REST数据中。

1

1
谢谢,我知道那些插件并且过去使用过它们。不幸的是,它们容易在主要(也包括次要)WordPress更新中出现问题。代码片段也有这个问题,但相对较少,因为它使用核心的vanilla WordPress函数。 - Mel Macaluso
1
这不再建议使用,因为ACF插件现在有自己的设置来添加页面/帖子有效载荷上的ACF字段。请参见Ron的答案:https://dev59.com/clMI5IYBdhLWcg3wVp-m#69921567 - Leo Fisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接