我使用http://github.com/jjgrainger/PostTypes/注册我的自定义post类型,使用ACF将自定义字段添加到我的自定义帖子中,并且我希望在wp-json响应中包括每个帖子中所有已注册的字段,并执行以下操作
$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中添加了以下筛选器之后,我尝试过使用
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);
但在这种情况下,我得到了一个致命的错误
Fatal error: Uncaught Error: Call to a member function get_links() on null in
如何在wp响应中反映自定义post类型的所有相关自定义字段值?
<#>更新
我忘记提到,在wordpress的顶部,我使用字板和sage,在跟踪rest_prepare_{$post_type}
方法之后,我得到了这一点,这在我的情况下是可行的。
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;
});
发布于 2019-07-11 23:31:17
我真希望你能处理好这件事。如果您不这样做,这种方法对我来说是可行的,因为有一种方法可以注册自定义acf端点,在functions.php
文件中,您必须添加下一段代码:
//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/
发布于 2021-10-08 12:35:42
这个答案激励我找到我的解决方案--我想把它发到这里,以防它对未来的人有帮助:
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类型。
$this->loader->add_filter('rest_prepare_advice_zone', $plugin_public->preparePostAcfData, 'preparePostAcfData', 99, 3);
唯一要注意的是,在请求周期的早期,我已经准备好了所有已定义的$data['acf']
,但是您可以很容易地将数组替换出来,检查是否存在或任何看起来相关的内容。读取正在使用的wordpress筛选器休息_准备_帖子_类型
干杯
https://wordpress.stackexchange.com/questions/315246
复制相似问题