web-dev-qa-db-ja.com

を使用してCPTメタデータを更新する REST API

REST AP​​Iを使用してCPT投稿のメタデータを更新しようとしています。このようなPOSTを使用して数値メタデータ要素を更新できます。

example.com/wp-json/wp/v2/posts/73/meta/229?value=2

このメソッドはここで見つけられる回避策に基づいています: WP RESTメタを更新しようとするときのAPI "rest_no_route" /

こちらの投稿を使ってメタデータを更新することもできます:example.com/wp-json/wp/v2/posts/73/meta/229

このJSONを本文に含めると、

{"value":"2"}

ただし、更新が必要なフィールドには、直列化されたデータ配列が含まれています。 2番目の方法(JSON本体)を使用してフィールドを更新しようとすると、このエラーが発生します。

{"value": [
{
  "name": "Related Documents",
  "default": true,
  "documents": [
    {
      "label": "RFA - Revit File",
      "file_location": "http://example.com/wp-content/uploads/2017/03/file.pdf"
    }
  ]
}
]
}

データをシリアル化された配列として送信することも試みました(これがMySqlに格納される方法です)。

私が送るとき:

{"value": "{a:0}"}

私は得ます:

{
"code": "rest_post_invalid_action",
"message": "Invalid existing meta data for action.",
"data": {
"status": 400
}
}

注:このメタデータはWooCommerceプラグインの一部であるフィールドです。 https://woocommerce.com/products/product-documents/ /

私のカスタム投稿タイプをAPIに公開するためにこのプラグインをインストールしました(そしてデータを取得することができます): wordpress.org/plugins/wp-rest-api-controller/

私はまた、メタエンドポイントへのアクセスを許可するためにこのプラグインをインストールしています: wordpress.org/plugins/rest-api-meta-endpoints/ /

ここでの私の最終目標は、このカスタムフィールド用に新しいデータをMySqlデータベースに入れることです。私はWP REST AP​​Iがまだメタデータに関してはまだ非常に文書化されておらず、かなり弱いことを学んでいます。特に、(1)カスタム投稿タイプの場合、(2)非投稿の場合文字列/数値データ型。

基本的なPHPページを作成して製品IDを取得し、WordPress関数を使用して正しいメタレコードを見つけ、投稿されたJSONを直列化された配列に変換してデータを更新することを検討しています。これを行うにはPHPに精通している必要があります。また、セキュリティについても考慮する必要があります。ただし、これを開始する方法に関する例やアイデアはありますか。それとも、私のメタデータを更新するためのより良い方法があるのでしょうか。

6
Chet at C2IT

最初の問題で、あなたはプラグインがAPIに利用可能にされるべきフィールドを登録していることに積極的ですか? register_metaにはshow_in_rest => trueを割り当てる必要があります。

また、CPTはそのサポート配列にcustom-fields、それがCPTs apiエンドポイントにアクセスするときに利用できるようにするための'supports' => array('title','editor','thumbnail','custom-fields')を必要とします。

私は別の質問へのこの答えで(リンクなどで)それをカバーします: https://wordpress.stackexchange.com/a/266277/118366

これらの値のどちらかが欠けている場合は、フックして追加したり、関数を完全に上書きしたりする可能性があります。ちょっとした考え。

基本的なPHPページを作成して製品IDを取得し、WordPress関数を使用して正しいメタレコードを見つけ、投稿されたJSONを直列化された配列に変換してデータを更新することを検討しています。これを行うにはPHPに精通している必要があります。

これについては、json_decodeとjson_encodeを調べてください。 json_decodeを使用してassoc引数をtrueに設定し、オブジェクトではなく配列を取得できます。

いくつかのJSONを取得し、デコードされた結果を変数に設定する(テストされていない)簡単な関数例:

$json = file_get_contents('PATH/TO/FILE.json');
function the_json_contents($json_to_get){

            $json_in_array = json_decode($json_to_get, true); //json string to array

            return $json_in_array;
        }
function do_stuff_do_json() {
    $json_array = the_json_contents($json);
    foreach($json_array['id'] as $js) { //assuming we have an 'id' key
        $somevariable  = $js['someKey'];
        $somevariable2 = $js['someOtherKey'];
    } 

}

ただし、これを開始する方法に関する例やアイデアはありますか。それとも、私のメタデータを更新するためのより良い方法があるのでしょうか。

カスタムルートとエンドポイントがこれを行うための最も効果的な方法かもしれません(冒頭で述べたように、それが単にそれらのアイテムをAPIに公開していないことを前提としています)。エンドポイントの使用方法によっては、ノンスチェックやその他の認証方法を考慮する必要があります。 ルートとエンドポイント および カスタムエンドポイント は、apiの資料で探しているものです。おそらく コントローラクラス .

繰り返しますが、プラグインをチェックして、最初に述べたようにAPIにメタフィールドが登録されているかどうかを確認します。

4
hwl