http://github.com/jjgrainger/PostTypes/ を使用してカスタム投稿タイプを登録し、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応答では、次のフィルターを追加してグーグルで試した後、カスタムフィールドがありません
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</b>: Uncaught Error: Call to a member function get_links() on null in
カスタム投稿タイプのwp-json応答に関連するすべてのカスタムフィールド値を反映するにはどうすればよいですか?
更新
私はwordpressの上にセージでワードプレートを使用し、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;
});
この問題を管理してくださることを本当に願っています。そうでない場合、カスタム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/