首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在REST中使用ACF自定义Post类型,如何获得这些值?

在REST中使用ACF自定义Post类型,如何获得这些值?
EN

WordPress Development用户
提问于 2018-09-26 20:05:12
回答 2查看 6.6K关注 0票数 1

我使用http://github.com/jjgrainger/PostTypes/注册我的自定义post类型,使用ACF将自定义字段添加到我的自定义帖子中,并且我希望在wp-json响应中包括每个帖子中所有已注册的字段,并执行以下操作

代码语言:javascript
运行
复制
$options = [
    'supports' => array('revisions'),
    'has_archive' => false,
    'show_in_rest' => true,
    'rewrite' => array('slug' => __('teachers', 'teachers')),
    'capability_type' => 'post',
    'rest_base' => 'teachers',
    'query_var' => true,
    'rest_controller_class' => 'WP_REST_Posts_Controller',
];
$teachers = new PostType('teacher', $options);
$locations = new Taxonomy('location');
$levels = new Taxonomy('level');

$teachers->filters(['first_name', 'last_name']);
$teachers->columns()->hide(['title', 'date']);

$teachers->columns()->add([
    'first_name' => __('First Name'),
    'last_name' => __('Last Name'),
]);

$teachers->taxonomy('location');
$teachers->taxonomy('level');

$teachers->columns()->populate('first_name', function ($column, $post_id) {
    echo get_post_meta($post_id, 'first_name')[0];
});

$teachers->columns()->populate('last_name', function ($column, $post_id) {
    echo get_post_meta($post_id, 'last_name')[0];
});

$levels->columns()->add([
    'level' => __('Level'),
]);

$levels->register();
$locations->register();
$teachers->register();

但是在wp-json响应中,我没有任何自定义字段,而在googling中添加了以下筛选器之后,我尝试过使用

代码语言:javascript
运行
复制
function my_rest_prepare_post($data, $post, $request) {
    dd($data);
    $_data = $data->data;

    $fields = get_fields($post->ID);
    foreach ($fields as $key => $value){
        $_data[$key] = get_field($key, $post->ID);
    }
    $data->data = $_data;

    return $data;
}
add_filter("rest_prepare_teacher", 'my_rest_prepare_post', 10, 3);

但在这种情况下,我得到了一个致命的错误

代码语言:javascript
运行
复制
Fatal error:  Uncaught Error: Call to a member function get_links() on null in

如何在wp响应中反映自定义post类型的所有相关自定义字段值?

<#>更新

我忘记提到,在wordpress的顶部,我使用字板和sage,在跟踪rest_prepare_{$post_type}方法之后,我得到了这一点,这在我的情况下是可行的。

代码语言:javascript
运行
复制
add_filter("rest_prepare_teacher", function($post) {
    $_data = $post->data;
    $fields = get_fields($_data['id']);

    foreach ($fields as $key => $value){
        $_data[$key] = get_field($key, $_data['id']);
    }
    $post->data = $_data;
    return $post;
});
EN

回答 2

WordPress Development用户

发布于 2019-07-11 23:31:17

我真希望你能处理好这件事。如果您不这样做,这种方法对我来说是可行的,因为有一种方法可以注册自定义acf端点,在functions.php文件中,您必须添加下一段代码:

代码语言:javascript
运行
复制
//Custom acf endpoint;
function my_endpoint( $request_data ) {

    // setup query argument
    $args = array(
        'post_type' => 'my_post_type',
        'posts_per_page' => -1
    );

    // get posts
    $posts = get_posts($args);

    // add custom field data to posts array 
    foreach ($posts as $key => $post) {
            $posts[$key]->acf = get_fields($post->ID);
            $posts[$key]->link = get_permalink($post->ID);
            $posts[$key]->image = get_the_post_thumbnail_url($post->ID);
    }
    return $posts;
}

// register the endpoint;
add_action( 'rest_api_init', function () {
    register_rest_route( 'my_endpoint/v1', '/my_post_type/', array(
        'methods' => 'GET',
        'callback' => 'my_endpoint',
        )
    );
}

贷记:https://clarencepearson.com/advanced-custom-fields-rest-api/

票数 2
EN

WordPress Development用户

发布于 2021-10-08 12:35:42

这个答案激励我找到我的解决方案--我想把它发到这里,以防它对未来的人有帮助:

代码语言:javascript
运行
复制
use WP_Post;
use WP_REST_Request;
use WP_REST_Response;

class PreparePostAcfData
{
    public function preparePostAcfData(WP_REST_Response $response, WP_Post $post, WP_REST_Request $request): WP_REST_Response
    {
        $data = $response->get_data();
        $fieldsData = get_fields($post->ID);
        if(is_array($data['acf']) && is_array($fieldsData)) {
            $data['acf'] = array_merge($data['acf'], $fieldsData);
        }
        $response->set_data($data);

        return $response;
    }
}

然后,您可以使用wordpress rest过滤器之一将其附加到任何自定义post类型。

代码语言:javascript
运行
复制
$this->loader->add_filter('rest_prepare_advice_zone', $plugin_public->preparePostAcfData, 'preparePostAcfData', 99, 3);

唯一要注意的是,在请求周期的早期,我已经准备好了所有已定义的$data['acf'],但是您可以很容易地将数组替换出来,检查是否存在或任何看起来相关的内容。读取正在使用的wordpress筛选器休息_准备_帖子_类型

干杯

票数 0
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/315246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档