質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

736閲覧

WordPress REST APIにCustom fieldを追加したいが、更新がうまくいかない

ryots

総合スコア0

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/04/29 09:56

編集2021/04/30 10:51

前提・実現したいこと

最近、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形式の文字列を送信しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tabuu

2021/04/30 00:00

update_callbackの引数の$value, $post, $field_nameがそれぞれどのような値になっているか質問文に追記してください。 (それがそのまま回答になるとは思いますが)
ryots

2021/04/30 10:58 編集

ご指摘ありがとうございます。取り急ぎ、pythonでAPIに情報を送信したときのコードの部分を追記いたしました。 「$value, $post, $field_nameがそれぞれどのような値になっているか」についてですが、php・WordPressともに初心者でこの部分がよく理解できていないのですが、phpのコード内でこの変数にどのように値を受け渡ししているのかが理解できていない部分があります。 WordPressの公式ページ( https://ja.wp-api.org/extending/modifying/ )を見て、これらの値はregister_rest_fieldを呼び出した時点で自動的に代入されるのかと理解していたのですが、これらの変数を取得するコードの追記が必要でしょうか? 頓珍漢なご質問となっておりましたら申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問