我想将所有属于页面或自定义帖子类型的ACF字段公开给WordPress REST API,以便通过javascript进行一些API调用。
最终的预期结果将是可以轻松访问的ACF
对象中的所有 ACF 字段。
另一个简单的解决方案,现在对我来说是完美的。您可以在functions.php
或fields.php
上添加以下函数在发送 rest 请求之前使用 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') && isset($post->id)) {
$response->data['acf'] = get_fields($post->id);
}
return $response;
}
add_filter('rest_prepare_post', 'acf_to_rest_api', 10, 3);
通过以下代码,您将能够在wordpress REST API中公开page
和自定义postypes ACF字段,并在ACF
对象中访问它们。
显然,您可以自定义要排除或包含在数组中的postype:$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
从版本 5.11 开始,ACF 能够通过每个字段将字段添加到 REST API。您可以在此处查看更新:https://www.advancedcustomfields.com/resources/rest-api/
要点是每个字段都有一个"在 REST API 中显示"的设置。默认情况下,它设置为"否",但如果您将其切换为"是",它将被添加到每个帖子/自定义帖子类型的 REST 数据中。
您可以使用以下插件在 REST 中公开 ACF 字段。
https://wordpress.org/plugins/acf-to-rest-api/
如果您的 ACF 字段具有关系,并且也希望将这些关系包含在 rest 中,则可以使用以下插件。
https://github.com/airesvsg/acf-to-rest-api-recursive
更新:ACF 有自己的设置,可以将 ACF 字段添加到 REST 响应。因此,您不需要使用它。