Wordpress の API でカスタムフィールドにアクセスする

Wordpress を利用するにあたっては、何らかのプラグインを導入することが常ではないでしょうか。
プラグインでは、そのプラグインで利用する独自のデータをカスタムフィールドで持つことが多いかと思います。

あるいはまた、標準で用意した項目では足りず、自前で何らかのカスタムフィールドを利用することもあるかと思います。

そういった運用をしている Wordpress サイトに API でアクセスする場合、API でもそれらのカスタムフィールドにアクセスしたいことがあります。 しかし、デフォルトではそれらのカスタムフィールドにアクセスすることはできません。

カスタムフィールドにアクセスするためには、以下のいずれかの対応が必要になります。

register_rest_field する

例えばカスタムフィールドのキーが some_key だったとしたら、次のようになります。

// Wordpress のバージョンによっては違うかも
add_action('rest_api_init', function() {
    register_rest_field(
        'post',
        'some_key',
        array(
            'get_callback' => function($post, $field_name, $request) {
                return get_post_meta($post['id'], $field_name, true);
            },
            'update_callback' => function($value, $post, $field_name) {
                return update_post_meta($post->ID, $field_name, $value);
            },
            'schema' => null,
        )
    );
});
// なお get_callback の方の $post は連想配列で、update_callback の $post は WP_Post オブジェクト
// なぜそのようになっているのかは謎だが、注意が必要


これを function.php に入れておくことで、投稿データに some_key というキーでアクセスできるようになります。


register_meta する

でも実は、カスタムフィールドは投稿のメタデータとして格納されるので、次の register_meta だけでもアクセスできるようになります。

register_meta('post', 'some_key', ['show_in_rest'=>true, 'single'=>true]);


この場合は、投稿データの meta の子供の some_key でアクセスできるようになります。