【问题标题】:How to expose all the ACF fields to Wordpress REST API in both pages and custom postypes如何在页面和自定义 posttypes 中将所有 ACF 字段公开给 Wordpress REST API
【发布时间】:2019-10-21 18:10:46
【问题描述】:

我想向 WordPress REST API 公开属于页面或自定义帖子类型的所有 ACF 字段,以便通过 javascript 进行一些 API 调用。

最终的预期结果将是您可以轻松访问的 ACF 对象内的所有 ACF 字段。

【问题讨论】:

  • 让我们知道您到目前为止所尝试的内容。向我们展示一些代码。
  • @cbdev420 嗨,我创建这个问题只是为了帮助其他在黑暗中跌跌撞撞的开发人员,自己回答(见下文)。

标签: php wordpress advanced-custom-fields wordpress-rest-api


【解决方案1】:

另一个简单的解决方案现在对我来说是完美的。 您可以在functions.phpfields.php 上添加以下功能 在发送休息请求之前使用 ACF 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')) 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 的评论中放慢速度的人来说,rest_prepare_cpt 中的 cpt 意味着您的 cpt 的 slug 不是文字字符串 cpt
【解决方案2】:

通过以下代码,您将能够在 wordpress REST API 中公开 page 和您的自定义 posttypes 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】:

    您可以使用以下插件在 REST 中公开 ACF 字段。

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

    如果你的 ACF 字段有关系,并且想在 rest 中包含这些关系,你可以使用以下插件。

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

    【讨论】:

    • 谢谢,我知道这些插件并在过去使用过它们。不幸的是,它们很容易与主要(但也较小)的 WordPress 更新发生冲突。代码的 sn-p 也是,但使用核心 vanilla WordPress 函数时略少。
    【解决方案4】:

    从 5.11 版开始,ACF 能够通过每个字段将字段添加到 REST API。您可以在此处查看更新:https://www.advancedcustomfields.com/resources/rest-api/

    要点是每个字段都有“在 REST API 中显示”的设置。默认情况下,它设置为“否”,但如果您将其切换为“是”,它将被添加到每个帖子/自定义帖子类型的 REST 数据中。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 2017-02-01
      • 2020-05-19
      • 1970-01-01
      相关资源
      最近更新 更多