web-dev-qa-db-ja.com

REST AP​​IのACFを使用したカスタム投稿タイプ、これらの値を取得するにはどうすればよいですか?

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;
});
1
fefe

この問題を管理してくださることを本当に願っています。そうでない場合、カスタム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/

1
Adrian Barbosa