【Wordpress】REST API v2による投稿メタ/カスタムフィールド(postmeta)更新
REST APIとは
Wordpressが4.7から標準機能として提供しているREST API 。
何ができるのかというと、https通信によるAPIアクセスで、記事を取得したり、記事を更新したりすることができます。
※ 記事の更新には、Wordpress管理画面にてアプリケーションパスワードを設定し、API実行時に認証する必要があります。
REST APIでカスタムフィールドを扱う
しかしこの便利なREST API、そのままではカスタムフィールドの取得や更新ができません。
functions.phpに追記してカスタムフィールド(投稿メタ)情報を扱えるようにする必要があります。色々調べたのですが、取得の設定は結構やり方が出てきますが、更新の設定については書かれているTipsがほとんどなかったです。なのでこの記事でまとめておこうとおもいます。
functions.phpの編集
REST APIでカスタムフィールドを扱うために、functions.phpに以下の記述を加えてください。
/* functions.php */
//REST API の初期化フック
add_action( 'rest_api_init', 'create_api_posts_meta_field' );
function create_api_posts_meta_field()
{
register_rest_field(
'post', //投稿タイプ
'meta_field', //これは任意のキー名
array(
'get_callback' => 'get_post_meta_for_api',
'update_callback' => 'update_post_meta_for_api',
'schema' => null,
)
);
}
//取得(GET)時のオブジェクトにpostのメタをすべて追加
function get_post_meta_for_api( $object ){
$post_id = $object['id'];
return get_post_meta( $post_id );
}
//投稿(POST)時のオブジェクトからメタを更新する
function update_post_meta_for_api($value, $object, $fieldName){
foreach($value as $key => $val){
$rtn = update_post_meta($object->ID, $key, $val);
if (!$rtn){
return false;
}
}
return $rtn;
}
この例では、特定のメタ項目ではなく、投稿タイプPOSTに関連するすべてのメタ項目をオブジェクトに設定します。見られたくない項目がある場合は個別に設定してください。
ポイントは register_rest_field に「'update_callback'」を設定することです。
記事の取得
それでは、GET取得したメタ項目がどのように表示されるか見てみましょう。
例)ブラウザで https://example.com/blog/wp-json/wp/v2/posts/4672/ にアクセスした想定です
{
"id": 4672,
"date": "2022-02-09T21:37:33",
"date_gmt": "2022-02-09T12:37:33",
"guid": {
"rendered": "https://example.com/blog/?p=4672"
},
<<・・・略・・・>>
"meta_field": {
"customfield_sample_1": [
"1644410468"
],
"customfield_sample_2": [
"https://note.com/suzuki_reiko/n/nf023328d6297"
]
},
<<・・・略・・・>>
}
"meta_field"にカスタムフィールド値が配列で格納されています。
記事の投稿
次に投稿(POST)する際にはどうするかですが、
ここではPythonでの例を示します。
※ 参考:PythonでWordPressに投稿するサンプル【REST APIを利用】
import requests
import json
import base64
MY_URL: str = "https://example.com/blog"
MY_USER: str = "user_name"
MY_APP_PASSWORD: str = "uuuu vvvv wwww xxxx yyyy zzzz"
def wp_create_post():
credentials = MY_USER + ':' + MY_APP_PASSWORD
token = base64.b64encode(credentials.encode())
headers = {'Authorization': 'Basic ' + token.decode('utf-8')}
post = {
'title': 'テスト',
'status': 'draft',
'content': 'RESTのお勉強をしました',
"meta_field":{
"customfield_sample_1": '1239283993',
"customfield_sample_2": 'https://note.com'
},
}
res = requests.post(f"{MY_URL}/wp-json/wp/v2/posts/", headers=headers, json=post)
if res.ok:
print(f"投稿成功 code:{res.status_code}")
return json.loads(res.text)
else:
print(f"投稿の追加 失敗 code:{res.status_code} reason:{res.reason} msg:{res.text}")
return {}
ret = wp_create_post()
GETで得たjsonと同様の構造で値を渡すことで、メタ項目(カスタムフィールド)を更新できました。
Advanced Custom Fields プラグインの場合は
ACFプラグインを使ってカスタムフィールドを作成している場合はもっと簡単です。
ACFのVer.5.11より、作成したフィールドをRESTで使用する/しないを設定できるようになりました。チェックをオンにしておけば、取得も更新も可能になります。「acf」というキー名で配列に追加されます。更新は先ほどのPythonの例と同じ形で可能です。
{
"id": 4672,
"date": "2022-02-09T21:37:33",
"date_gmt": "2022-02-09T12:37:33",
"guid": {
"rendered": "https://example.com/blog/?p=4672"
},
<<・・・略・・・>>
"acf": {
"customfield_sample_1": [
"1644410468"
],
"customfield_sample_2": [
"https://note.com/suzuki_reiko/n/nf023328d6297"
]
},
<<・・・略・・・>>
}
操作したい投稿メタがACFだけならいいのですが、他の様々便利なプラグイン(SEO系とかサムネイル系etc…)で使っているメタ項目を取得/更新したい場合は、functions.phpを修正するやり方でいきましょう。