Atualizar metadados CPT usando a API REST

Estou tentando atualizar os metadados de uma CPT usando a API REST. Posso atualizar um elemento de metadados numéricos usando um POST como este:

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

Este método é baseado em uma solução encontrada aqui: WP REST API “rest_no_route” ao tentar atualizar o meta

Posso também atualizar os metadados usando uma publicação aqui: example.com/wp-json/wp/v2/posts/73/meta/229

com este JSON no corpo:

{"value":"2"} 

O campo que EU PRECISO atualizar contém uma matriz serializada de dados, no entanto. Quando tento atualizar o campo usando o segundo método (corpo JSON), recebo esse erro:

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

Também tentei enviar meus dados como uma matriz serializada (que é como ela é armazenada no MySql).

Quando envio:

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

Eu recebo:

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

Notas: Este metadata é um campo que faz parte de um complemento do WooCommerce: https://woocommerce.com/products/product-documents/

Eu tenho esse plugin instalado para expor meus tipos de postagem personalizados para a API (e eu sou capaz de RECUPERAR os dados): wordpress.org/plugins/wp-rest-api-controller/

Eu também tenho esse plugin instalado para permitir o access aos meta-pontos finais: wordpress.org/plugins/rest-api-meta-endpoints/

Meu objective final aqui é preencher novos dados no database MySql para este campo personalizado. Estou aprendendo que a API WP REST ainda é muito indocumentada e bastante fraca quando se trata de metadados, especialmente (1) para tipos de postagem personalizados e (2) para tipos de dados não-string / numeric.

Eu estou pensando em escrever uma página básica do PHP que levará um ID de produto, encontre o meta-registro correto usando uma function do WordPress e atualize os dados transformando o JSON publicado em uma matriz serializada, mas não estou familiarizado com o PHP para fazer isso, e eu também tenho que levar em consideração algumas coisas de segurança. Não há exemplos ou ideias sobre como começar isso, ou se há uma maneira melhor de atualizar meus metadados?

Solutions Collecting From Web of "Atualizar metadados CPT usando a API REST"

Nos problemas iniciais, você está certo de que o plugin está registrando os campos a serem disponibilizados para a api? O register_meta precisa show_in_rest => true .

Além disso, o CPT precisa custom-fields em sua matriz de suportes, 'supports' => array('title','editor','thumbnail','custom-fields') para que seja disponibilizado ao acessar o ponto final api do CPTs.

Eu cobrei isso (com links, etc.) nesta resposta para uma pergunta diferente: https://wordpress.stackexchange.com/a/266277/118366

Se algum desses valores estiver faltando, você poderia se encheckboxr para adicioná-los ou mesmo replace completamente as funções. Apenas um pensamento.

Eu estou pensando em escrever uma página básica do PHP que levará um ID de produto, encontre o meta-registro correto usando uma function do WordPress e atualize os dados transformando o JSON publicado em uma matriz serializada, mas não estou familiarizado com o PHP para fazer esta

Para isso, veja json_decode e json_encode. Você pode definir o argumento assoc como verdadeiro com json_decode e obter uma matriz ao invés de um object.

Uma function de exemplo rápido (não testada) de recuperar algum json e definir os resultados decodificados em uma variável:

 $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']; } } 

Não há exemplos ou ideias sobre como começar isso, ou se há uma maneira melhor de atualizar meus metadados?

Uma rota personalizada e um ponto final podem ser a maneira mais eficaz de fazer isso (assumindo que não é apenas o plugin que não expôs esses itens à api, como mencionado acima). Você ainda precisará levar em consideração as verificações e outras possíveis autenticações, dependendo da forma como você está usando os pontos finais. Rotas e pontos finais e pontos finais personalizados são o que você procura na documentação do api; Provavelmente Classes de Controladores , também.

Novamente, eu verificaria o plugin para ver se ele tem os meta-campos registrados para o api, como mencionado inicialmente.