見出し画像

【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を修正するやり方でいきましょう。


いいなと思ったら応援しよう!