Rso's Jotter

日々の開発の知見のメモやその他雑記

WordpressのカスタムフィールドをREST API経由で更新する

掲題の対応方法をメモっておきます。 PHPは全然得意ではないのですが、Word Pressが世の中で流行っている以上、 なかなか逃げられず、調査したので、その内容を残しておきます。

課題

カスタムフィールド (今回は Smart Custom Fieldプラグインを使用)を REST API経由で投稿(Create)したい

調査内容

記事投稿なので、エンドポイントは /wp/v2/posts で良さそうです。 アクセストークン周りの認証の方法は以下の記事を参考にさせていただきました。ここでは割愛します。

web.plus-idea.net

これで通常のTitleやらContentは投稿できました。問題はカスタムフィールドです。

いろいろ調査すると、どうやら register_rest_field という関数を使用すると、既存のREST APIを拡張できるようです。

developer.wordpress.org

こいつをfunctions.php内で呼んでやります。

add_action( 'rest_api_init',  function() {
  register_rest_field(
    'post',        // post type
    'post_meta',   // rest-apiに追加するキー
    array(
      'get_callback'  => function(  $object, $field_name, $request  ) {
        ...
      },
        'update_callback' => function(  $value, $post, $field_name) {
        ...
        },
      'schema'          => null,
    )
  );
});

という風にかいてやれば、既存のpostエンドポイントを拡張し、post_meta情報を受け付けるようになるようです。 値の取得、更新はget_callback, update_callbackに処理を記述してやれば良さそうです。

細かい処理は説明すると煩雑になるので、実際にうごいたサンプルを備忘がてら載せておきます。

'get_callback'  => function(  $object, $field_name, $request  ) {
    // 出力したいカスタムフィールドのキーをここで定義
    $meta_fields = array(
      'field1',
      'field2'
    );
    $meta = array();
    foreach ( $meta_fields as $field ) {
        $meta[ $field ] = get_post_meta( $object[ 'id' ], $field, false );
    }
    return $meta;
},
'update_callback' => function(  $value, $post, $field_name) {
  if (!$value) {return;}
  foreach($value as $key => $data){
    if(is_array($data)){
      foreach($data as $record){
        add_post_meta($post->ID, $key, $record);
      }
    }else{
      add_post_meta($post->ID, $key, $data);
    }
  }
}

update_callbackはエラー判定などかなり端折っていますが、Smart Custom Fieldは繰り返し設定ができるので、 その場合配列が渡させるので処理を分けています。

所感

自分だけかもしれませんが、WordpressはREST APIのリファレンスはどうも分かりづらい気がしていて、 なかなかこういった情報が探しづらいなと言う印象を受けました。 あんまりREST API経由で カスタムフィールドを更新したいという要件自体レアかもしれないですが、残しておきました。