Como obter imagens da galeria?

4

Eu tenho algumas imagens enviadas em postagens do wordpress (por exemplo, post # 1 e post # 2). Agora eu criei um novo post (por exemplo, Post # 3), e neste post eu inseri a galeria do WordPress 3.5, eu não fiz upload de nenhuma imagem no post # 3, em vez disso eu usei as imagens do post # 1 e poste # 2. Agora no post # 3, gostaria de obter os links para as imagens, mas não consigo conseguir. Eu estou usando o seguinte código:

$attachments = get_children( array('post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' =>'image') );
    foreach ( $attachments as $attachment_id => $attachment ) {
            echo wp_get_attachment_image( $attachment_id, 'medium' );
   }

Ele mostrará somente a imagem se eu fizer o upload na postagem, mas não mostrará a imagem se eu adicionar das outras postagens. Então, como posso obter os links para as imagens que são adicionadas na galeria, mas não carregadas.

Obrigado por qualquer ajuda.

    
por jay 17.12.2012 / 12:31

3 respostas

5

Eu tive o mesmo problema - como posso exibir todas as imagens de uma postagem contendo uma galeria em que algumas das imagens não estão anexadas à postagem ou estão anexadas a postagens diferentes?

A nova interface de mídia no WP3.5 permite que você adicione qualquer uma das imagens na biblioteca de mídia a uma galeria, independentemente de estarem "anexadas" ou não. Como você descobriu, a função "get_children" apenas retorna imagens anexadas à postagem. O truque que usei é obter os ids do próprio código de barras da galeria, e não do fato de que eles são anexos. O shortcode inclui todos os IDs da imagem, independentemente de estarem anexados ou não à postagem. Por exemplo. [ids galeria="410,411,412,413,414,415"]. Obviamente, o wordpress pode analisar isso para recuperar todas as imagens e exibi-las em um formato de galeria usando a função "gallery_shortcode" incluída no núcleo do wordpress (in includes / media.php). Para obter os ids de todas as imagens no código curto [gallery], criei uma nova função no arquivo functions.php:

function grab_ids_from_gallery() {

global $post;
$attachment_ids = array();
$pattern = get_shortcode_regex();
$ids = array();

if (preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches ) ) {   //finds the     "gallery" shortcode and puts the image ids in an associative array at $matches[3]
$count=count($matches[3]);      //in case there is more than one gallery in the post.
for ($i = 0; $i < $count; $i++){
    $atts = shortcode_parse_atts( $matches[3][$i] );
    if ( isset( $atts['ids'] ) ){
    $attachment_ids = explode( ',', $atts['ids'] );
    $ids = array_merge($ids, $attachment_ids);
    }
}
}
  return $ids;

 }
add_action( 'wp', 'grab_ids_from_gallery' );

Agora é só usar a função "grab_ids_from_gallery ()" para retornar todos os ids como um array no seu template.

Tenho certeza de que há uma maneira mais elegante de fazer isso - mas isso funciona para mim. A base para este código veio de:

enlace

que discute esta questão.

    
por steveO 31.12.2012 / 02:26
0

Devo admitir que não tive tempo de jogar com as novas galerias de mídia do 3,5 e coisas do gênero, mas trabalhando apenas com o código, sem levar em conta a funcionalidade do Gallery do WP ...

O código que você forneceu usa get_children() com a variável de consulta post_parent definida como get_the_ID() (o ID do objeto de postagem atualmente sendo processado no loop de conteúdo). Como tal, a chamada para get_children() só é capaz de consultar anexos para o post atual, e nenhum outro .

Na terminologia de seu exemplo, seu código, quando executado no contexto do loop durante o processamento de Post # 3 , não pode recuperar os anexos anexados a Post # 1 e Post # 2 porque está especificamente pedindo os anexos que estão anexados a Post # 3 .

Infelizmente, o Wordpress não suporta a passagem de vários valores para o post_parent query var, então, para recuperar os anexos das outras postagens da maneira que você deseja, você deve obter o postar IDs das postagens contendo anexos ( Post # 1 e Post # 2 ) e executar uma chamada para get_children() para cada, substituindo o valor post_parent de " get_the_ID() "com o respectivo ID.

Uma solução mais eficiente (embora teoricamente mais complexa) pode ser possível, fazendo uso inteligente do objeto WP_Query , no entanto eu Acredito que a solução que você está procurando (ou que eu suponho que você está procurando - você nunca fez uma pergunta;)) pareceria algo nos moldes de

$attachmentParentIds = getAttachmentParentIds( get_the_ID() );
foreach( $attachmentParentIds as $attParentId ) {
    $attachments = get_children( array('post_parent' => $attParentId, 'post_type' => 'attachment', 'post_mime_type' =>'image') );
    foreach ( $attachments as $attachment_id => $attachment ) {
        echo wp_get_attachment_image( $attachment_id, 'medium' );
    }
}

que usa uma função como

//Returns an array of post IDs containing attachments that should be displayed
//on the post indicated by the passed post ID.
function getAttachmentParentIds( $intPostId ) {
    $ids = array();

    //Figure out which posts contain attachments that need to be displayed for $intPostID

    //...

    return $ids; //return an array of IDs
}

como espaço reservado para a lógica que determina quais postagens contêm anexos que precisam ser exibidos para o ID de postagem transmitido. Não tenho certeza quanto à extensão da sua implementação nem da sua inscrição e, como tal, não sei quais são os detalhes dessa lógica em relação ao seu projeto.

    
por bosco 29.12.2012 / 01:05
0

A solução real seria a criação de um novo "real" objeto "galeria" com seu próprio ID.

Uma galeria não é mais do que uma matriz de IDs de imagem, mas seria mais fácil de gerenciar:

  • Você pode criá-lo diretamente no Media Manager, na maneira como cria as novas "galerias" agora no WP 3.5.x Em vez de gerar um shortcode assim: [gallery ids="xx, yy, zz"] ele poderia simplesmente criar uma nova "Galeria" com seu próprio id e chamá-la assim: [gallery galley_id="123"]

  • Você pode gerenciar seus objetos "galerias reais" na mídia, em uma nova seção "Galerias"

  • Você teria um conjunto de funções para gerenciar esse objeto. Dessa forma, o problema do OP seria resolvido apenas passando o gallery_id para usar no template attachment.php (ou um novo template gallery.php que poderia ser implementado também) usando a função correspondente.

  • Você poderia misturar fotos anexadas a várias postagens em um objeto de galeria sem se preocupar com a postagem original.

  • Você pode adicionar várias galerias a uma postagem de maneira fácil.

Se você pensar sobre isso, estas são as galerias da NextGen em poucas palavras. Não admira que as pessoas usem muito esse plugin. Infelizmente eu não acho que um recurso tão importante deva ser adiado para um plugin, especialmente um bastante inchado e pesado como o Nextgen, que contém muitos recursos supérfluos.

Nesse sentido, a lógica do novo gerenciador de mídia é um pouco falha, eu acho. Isso meio que sugere que você está "criando" uma nova entidade chamada galeria enquanto ela está na verdade apenas juntando um monte de ids de imagens para você.

Eu entendo que você não verá a falha se estiver usando a tela Carrossel do Jetpack, já que ela não o levará para fora da página atual e você não precisará vincular a imagem a essa galeria específica você "criou".

No entanto, acho que há uma lacuna perigosa entre a interface do usuário do novo gerenciador de mídia e o que ele realmente faz para mostrar uma galeria.

    
por CamilloMiller 07.02.2013 / 12:16