Trabalhando com mídias no WordPress: post-type attachment
Trabalhando com WordPress há algum tempo, eu já tive de “enfrentar” algumas situações que me ajudaram a entender bastante como ele funciona. Uma “névoa” na cabeça de muitos, é como funciona a relação de inserção de mídias ( anexos ) para o WordPress. Problemas comuns são como inserir e exibir todas as mídias do post ( sem precisar ficar anexando elas dentro do conteúdo/texto do post).
Problematização
É comum querer separar todas as imagens, documentos, áudios, em galerias. Só que, onde o WordPress, esse sistema mágico, guarda as informações de mídias e posts? Como que são feitas essas relações? É possível pegar todas as mídias de um post ( anexadas )? É possível filtrar as mídias por tipo? É possível fazer com que o WP me traga todas essa lista, e eu possa manipular ela como eu quiser? Se foi com uma dessas perguntas que você chegou até aqui, fique feliz, a resposta é sim!
Para entender melhor essas questões, abaixo estão imagens do site do Coletivo 288, que precisa que as imagens pertençam à um post, mas que não estejam anexadas no meio deste. As imagens aparecem ao lado do conteúdo do post ( e não inseridas nele ), também para funcionarem como galeria.

Armazenamento de informações: Como se relacionam as tabelas do WordPress
O WordPress tem uma forma curiosa ( leia-se: estranha ) de armazenar as informações. Na verdade, hoje, eu gosto bastante da forma em que foi pensada as tabelas do MySQL para o WP, pois vocês vão notar, que há uma extrema economia de uso de tabelas, relações entre elas e coisas do tipo, apesar de no início do meu processo de aprendizado, foi um tanto quanto estranho para entender.
Acontece que tudo para o sistema, em termos de inserção do usuário, é um post. Quando eu digo tudo, me refiro toda parte “editorial” digamos assim, para você ter uma idéia, são cadastrados na tabela de posts: Posts, Páginas, Revisões, Anexos.
Nas tabelas do WordPress no seu MySQL você procura pela tabela _posts, que você poderá entender melhor como funciona essa relação e todo o conteúdo possível de ser inserido ( que é muita coisa ) nessa tabela. Nós vamos nos concentrar na área de post_type, para saber se é uma mídia/anexo ( post_type = attachment ), e na post_mime_type para sabermos o tipo do arquivo.
Mas como é feita a relação entre o anexo/mídia e o post? Bem, é comum para nós, entendermos o conceito que uma sub-categoria é filha da categoria mãe, certo? A mesma coisa acontece com esses posts, eles possuem childs e parents
Como vamos fazer
Bem, das forma que eu costumo fazer, eu não uso o the_loop que você deve estar acostumado a fazer, mas para quem conhece PHP e o foreach será muito fácil de entender.
Vamos por, primeiramente, de forma literal o que nós queremos:
Eu quero separar todos os posts, do tipo attachment, cujo mime type seja de imagem, e que sejam filhos do post que eu estiver. Vamos salvar isso numa variável para facilitar nossa vida
Em código, diriamos da seguinte forma:
$consulta_filhos = &get_children('post_type=attachment&post_mime_type=image&post_parent=' . $post->ID );
Nesta consulta eu usei o get_children() do WordPress. Pois bem, agora que você já vai ter estes dados, o que fazer com eles? Literalmente, vamos explicar o que nos queremos: Queremos pegar cada resultado desta consulta para poder extrair o “ID” do attachment e usá-lo em uma função do WordPress. Sendo assim temos:
foreach($consulta_filhos AS $imagens_do_post) {
$img_do_post[] = $imagens_do_post;
Agora que temos essa array com os elementos, ela ira retornar todos os valores que se pode ter de um post, cada um dentro de um item. O que precisamos agora, para exibir a listagem destas imagens é muito fácil, vamos usar a função do WordPress wp_get_attachment_image(). O parâmetros a ser passado para esta função é o ID do anexo ( não confundir com o ID do post ), então, ainda dentro daquele foreach que criamos, vamos colocar o seguinte:
echo wp_get_attachment_image($img_do_post->ID);
Note que é preciso dar echo em todas as funções que pussuirem o “get” no meio, pois funções assim só guardam os valores, não os exibem sem ordem. Lembrando também que nada servirá essa função se estiver fora do foreach, e claro, não esqueça de fechá-lo ( } ).
“Put them all together and what have we got?”
Bingo! Para facilitar a sua vida vou colocar todo o código que foi passado passo-a-passo para você poder ter uma visão geral do todo
// roda a consulta e armazena numa variável
$consulta_filhos = &get_children('post_type=attachment&post_mime_type=image&post_parent=' . $post->ID );
foreach($consulta_filhos AS $imagens_do_post) {
// salva cada resultado em um array
$img_do_post[] = $imagens_do_post;
// exibe a imagem a cada loop do forech baseado no ID da mídia
echo wp_get_attachment_image($img_do_post->ID);
}
Dicas Finais
Eu particularmente acho legal trabalhar com HTML no meio do código, portanto dentro do foreach, você pode fechar a tag do php ( ?> ) e inserir o seu código HTML livremente, claro, lembrando de voltar com a tag do PHP para dar o echo na imagem, e depois fechar a as chaves. Também sugiro que você leia a documentação da função wp_get_attachment_image() e use, depois do primeiro parâmetro, algum parâmetro referente a tamanho, como por exemplo thumbnail, medium ou large, todos estes configuráveis pelo painel do WordPress, ou criar tamanhos novos no functions e usá-los. Isso é legal quando se quer exibir uma galeria, lightbox ou como eu fiz alí na imagem acima, e todas as imagens terem o mesmo tamanho, ajuda bastante na construção de layouts.
A forma de subir imagens no post ou anexá-las via galeria de mídia, continua a mesma, só que o usuário não precisa clicar no botão “Inserir no post” ao final ( o que jogaria a imagem dentro do the_content() ).

Realmente é muito fácil trabalhar com mídias, inclusive o seu post me ajudou na criação de uma galeria de imagens, que o prazo não era nada agradável LOL.
#win
Parabéns.
Nunca vi um post explicando tão bem como trabalhar com mídias no wp.
Parabéns pelo post cara! Sua explicação é muito clara e objetiva. Aliás gostei do site todo, me ajudou muito, está nos meus favoritos!!!! Sucesso!!!!!