前提・実現したいこと
最近、WordPressを使ったページ作成を始めた者です。
WordPressもPHPもAPIも完全な初心者ですが、外部からの自動投稿のシステムを作成しております。
その中で、WordPress REST APIを使った投稿には成功したのですが、custom fieldにデータを追加したいのですが、うまくいかず困っています。「Advanced Custom Field」+「ACF to REST API」のプラグインも試したのですが、「internal server error」が生じてその解決法も見当たらないため、function.phpへの関数の追加に踏み切った次第です。
現在はローカルにコピーサイトを作って試験しております。
ローカルの環境は「Local by Flywheel」を使っています。
また、APIとのやり取りは、仕事上慣れもありpythonで行っています。
本当にここ一、二ヶ月の初心者なので、根本的な不理解もあるかもしれませんが、ご助言をいただけますと幸いです。
発生している問題・エラーメッセージ
状況として、子テーマのfunction.phpに下記のコードを追加いたしました。
しかし、PUTでこのcustom fieldを更新しようとしても、うまくいきません。
特に通信上のエラーメッセージは出ていないのですが、更新したはずの投稿の情報をGETしても、custom fieldは空となっております。SQLの中身を見ても「wp_postmeta」に追加された形跡はありません。
おそらくupdate_post_metaがうまく働いていないものと考えております。
該当のソースコード
php
1add_action( 'rest_api_init', 'api_add_fields' ); 2function api_add_fields() { 3 register_rest_field( 'post', 4 'featured_media_from_external_url', 5 array( 6 'get_callback' => function ($post,$field_name, $request){ 7 return get_post_meta( $post['id'], $field_name, true ); 8 }, 9 'update_callback' => function($value, $post, $field_name){ 10 return update_post_meta( $post->ID, $field_name, $value ); 11 }, // 12 'schema' => null, 13 ) 14 ); 15}
pythonでAPIにアクセスしようとしたコード
python
1import base64 2import json 3import urllib.request as request 4from urllib.parse import urljoin 5 6wp_url_api_cf = 'https://test.net/wp-json/wp/v2/posts/' 7post_id = 99 8wp_url_api_cf_post = urljoin(wp_url_api_cf,post_id) 9 10payload_cf = {'featured_media_from_external_url':'https://testgazou/test.jpg'} 11 12wp_user='ユーザー名' 13wp_pass='アプリケーションパスワード' 14basic_user_and_pasword = base64.b64encode('{}:{}'.format(wp_user, wp_pass).encode('utf-8')) 15headers_cf={'Authorization': 'Basic {}'.format(basic_user_and_pasword.decode('utf-8'))} 16 17req_cf = request.Request(wp_url_api_cf_post, 18 json.dumps(payload_cf).encode(), 19 headers_cf, 20 method='PUT') 21 22res_cf=request.urlopen(req_cf) 23
試したこと
色々とサイトを見比べて、コードの書き方を変えてみたりしているのですがうまくいきません。
なお、GETで得られたjsonのkeyに'featured_media_from_external_url'が追加されているのは確認しました。
補足情報(FW/ツールのバージョンなど)
なお、'featured_media_from_external_url'とある通り、該当項目はurl形式の文字列を送信しております。
あなたの回答
tips
プレビュー