Fala, pessoal! Estou enfrentando uma dificuldade ao tentar enviar os campos de metadados do formulário para o meu banco de dados. Já explorei bastante o banco de dados do WordPress, mas não consegui encontrar a tabela onde esses campos e valores são armazenados. Pode ser que eu esteja deixando passar algo simples. Alguém consegue me ajudar?
Olá @Nicolas, tudo bem? Seja bem vindo ao nosso fórum!
O assunto é longo e talvez possa ficar mais claro se você explicar em mais detalhes o que está tentando fazer. O Tainacan tem uma API própria que por sua vez estende a API do WordPress. Se você quer construir alguma interface alternativa que alimente dados de metadados Tainacan, talvez valha dar uma explorada na nossa API REST, visto que a própria interface do painel administrativo e dos blocos foi construída consumindo e interagindo com ela:
Mas sim, em último caso ela é uma camada de abstração em cima do banco de dados do WordPress. Para compreender um pouco sobre essa abstração, talvez valha dar uma lida aqui:
O importante é saber que Coleções, Itens, Taxonomias, Metadados, todos são post types do WordPress, o que significa que você vai encontrá-los na tabela wp_posts
. Porém posts do WordPress só possuem título e descrição, não possuem os campos extras que nós chamamos de metadados. Estes em si ficam guardados na forma de post meta, portanto estarão na tabela wp_postmeta
Para encontrar o valor de um metadado de um item você precisa de uma tupla: o id do item , que será o post_id
e o id do metadado, que será o meta_key
.
Porém, como eu disse, há várias camadas de abstração aí que a API te ajuda a “ingorar”. Por exemplo, metadados multivalorados, metadados compostos… e as taxonomias são particularmente complexas, visto que guardamos IDs de termos cujo rótulo você só vai encontrar em outra tabela, que guarda os relacionamentos com as Taxonomias. Não é bem tranquilo sair recriando um formulário por exemplo. Por isso queria ver mais detalhes do que precisa para entendermos qual melhor caminho ok?
E aí, Mateus, tudo bem? E contigo?
Criei um repositório para armazenar e expor TCCs da faculdade onde trabalho. Como os dados serão públicos, decidimos registrar logs com nome do acadêmico, data, título e dois checkboxes de termos (outros metadados são gerados, mas só queremos esses). Não consegui enviar os dados do formulário de submissão para um banco de dados, então criei meu próprio formulário em HTML e estou tentando usar a API para criar itens no acervo. Testei no Postman, mas tenho problemas: ao usar “/collection/{collection_id}/items/submission” com o body, recebo o id_submission; ao publicar, o item é criado com campos em branco, exceto os padrões (title e description). Há outra forma de passar os metadados? Usei um item existente como referência, mas o campo value também fica em branco.
No Postman, envio assim:
"metadata": {
"nome": {
"name": "NOME",
"id": {id do item},
"value": {valor do item (que quando enviado fica em branco)},
"value_as_html": {valor do item},
"value_as_string": {valor do item},
"semantic_uri": "",
"multiple": "no",
"mapping": [ ]
},
// outros metadados
}
estou enviados as taxo deste modo: “terms”: [{id_taxonomia}],
Se tiver dicas ou um norte, agradeço! Valeu, Mateusão! Se precisar de mais informações, estou disponível.
E por quê o próprio Formulário de Submissão não resolveu neste caso? Vocês podem usar o próprio Registro de Atividades se quiserem acompanhar isso, não?
Por quê não conseguiu? Os dados do formulário de submissão viram metadados nos itens, qual seria o impeditivo? Não consigo imaginar algo que seja mais complexo do que criar um formulário do zero hehehe
Mas ok, supondo que você realmente precise ir por aí, minha dica é criar um Bloco de Submissão de Itens e usando o inspetor do navegador dar uma olhada nas requisições que são feitas no painel “network” pra entender como as coisas devem ser feitas. Por exemplo, você precisa tanto do endpoint /submission
quanto do /finish
. E no caso dos metadados, eles são enviados de uma forma bem diferente da que são retornados, porque o retorno envolve coisas processadas (como o value_as_html
). Faça uns testes que você vai ver, é na forma de um array com metadatum_id
e value
. Os termos mesmo são um array de IDs apenas.
Fala aí! Valeu mesmo pela explicação, deu super certo fazer o envio dos dados pelo formulário que criei.
A única coisa que ainda estou empacado é no envio de arquivos .pdf/imagens. Pelo que vi aqui no fórum, parece que não dá pra mandar o arquivo direto pelo formulário, né? Preciso subir primeiro na biblioteca de mídia do WP e depois anexar ao item?
Tu consegue me confirmar isso?
Tem algum endpoint específico que preciso usar? Tentei com o PATCH /items/{item_id}
, mas não saquei direito quais referências preciso passar.
Ah, e perdão pela demora em responder o post.
Salve @Nicolas!
Que bom que está dando certo!
Mas continuo curioso com isso aqui!
De qualquer forma,
Dá sim. Neste caso, novamente usando o inspecionador de requisições network, dê uma olhada no fluxo de “Adição em massa”. Vá na página de itens de uma coleção, no dropdown de Adicionar e clique em “Adicionar itens em massa”:
A tela a seguir terá um input de arquivos. Veja o que acontece quando você enviar arquivos para este input:
Temos:
- Um POST para
/wp-json/tainacan/v2/collection/<id-colecao>/items
, que cria o item para termos o ID dele; - Um POST para
/wp-json/wp/v2/media
passando o ID do item comopost
para anexar ao item a mídia criada. Dê uma olhada na documentação da API REST do WordPress porque este endpoint é o que substitui a galeria de mídias neste caso e você vai precisar passar o arquivo por ela; - Um PUT
/wp-json/tainacan/v2/collection/<id-colecao>/items/<id-do-item>
para atualizar o documento ou anexo do item com o ID da mídia retornada pelo último post.
É este fluxo que você vai precisar implementar no seu formulário.
Mas se eu uso esse endpoint /wp-json/tainacan/v2/collection//items/ e utilizar o parâmetro document {passando o id da midia do wordpress}, ele altera apenas o documento. Eu não consegui encontrar onde ele altera os anexos dos itens. Eu vi algo referente ao Ajax, mas eu não encontrei o endpoint do anexo, apenas do documento. Li na documentação que existe apenas um o endpoint do GET attachment (pq não existe um de post também?).
Mas referente ao documento e a thumbnail(miniatura) ta tudo 100%, é só essa questão do anexo
Boa pergunta. Se não estou enganado, para que o arquivo seja um “anexo” do item, basta o POST descrito no passo 2. Quando você passa o ID do seu item no atributo post
, você está dizendo que aquela mídia que vai ser gerada está anexada à ele. O último passo é preciso apenas para o documento, onde você diz qual dos anexos é o documento principal. Vale dar uma lida aqui:
Já o GET do /attachment do Tainacan é apenas uma maneira mais direta de se acessar os anexos. Eles também poderiam ser obtidos por um GET para o /media do WordPress, filtrando pelo post associado com o ID do item.
Cara deu boa, agradeço todo o suporte. Tmj sucesso, nois que voa kkk