Obtenha a primeira imagem do conteúdo da postagem (por exemplo: imagens com links)

10

Estou usando esse código diretamente do codex .

function echo_first_image ($postID)
{                   
    $args = array(
    'numberposts' => 1,
    'order'=> 'ASC',
    'post_mime_type' => 'image',
    'post_parent' => $postID,
    'post_status' => null,
    'post_type' => 'attachment'
    );

    $attachments = get_children( $args );

    //print_r($attachments);

    if ($attachments) {
        foreach($attachments as $attachment) {
            $image_attributes = wp_get_attachment_image_src( $attachment->ID, 'thumbnail' )  ? wp_get_attachment_image_src( $attachment->ID, 'thumbnail' ) : wp_get_attachment_image_src( $attachment->ID, 'full' );

            echo '<img src="'.wp_get_attachment_thumb_url( $attachment->ID ).'" class="current">';

        }
    }
}

Eu chamo isso dentro do loop assim echo_first_image ($post->ID);

A função chama, mas nada é gerado ... até onde eu posso ver, não há nada $attachments

Eu tenho uma imagem no post que estou usando. Não é uma imagem em destaque ou em uma galeria, apenas no post.

Estou fazendo algo errado ou há algo errado com o código em primeiro lugar?

byronyasgur
fonte

Respostas:

22

Se você deseja exibir uma imagem inserida no seu conteúdo (uma imagem com hotlink, por exemplo), use uma função como esta (fonte) :

adicione functions.php :

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
  $first_img = $matches [1] [0];

  if(empty($first_img)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

Em seguida, coloque <?php echo catch_that_image() ?>onde deseja exibir a imagem.

Nota: uma imagem com link direto colocada apenas no seu conteúdo não pode ser definida como Imagem em destaque, uma característica do WordPress.

Diana
fonte
Sim, eu vi esse código por aí ... parece um hack, você pensaria que haveria uma maneira "WordPress" ... Gostaria de saber por que preciso usar preg_match quando o códice diz que você pode fazer como eu postei acima. Essa é minha pergunta para ser sincera. O código que eu postei errado? ... mais do que tentar fazê-lo funcionar realmente. Mas obrigado, talvez eu tenha que usar isso. Não entendo o significado de "uma imagem recém-colocada no seu conteúdo não pode ser definida como Imagem em destaque". Isso tem algum impacto nisso? Estou apenas tentando exibir a primeira imagem do post, não a imagem em destaque.
Byronyasgur 31/07/2012
Há uma grande diferença entre colocar um link de imagem dentro do conteúdo da postagem / página e anexar uma imagem. Você pode anexar uma imagem sem exibi-la. O exemplo do Codex é sobre anexar um arquivo à sua postagem / página, não há como colocar uma imagem dentro do link, também hotlinking não é um recurso que o WP tratará sem o regex do PHP.
Diana
Sobre a referência do COdex: como você pode ver, o documento é chamado após o nome da função get_childre, um anexo é publicado por crianças, portanto este exemplo pode funcionar apenas para o conteúdo anexado.
Diana
Sim, eu sei que consigo anexar uma imagem sem inseri-la, isso é claro ... mas não vejo como você pode inserir uma imagem sem anexá-la ... quando pressiono carregar / inserir, carrego um arquivo do meu computador e pressione inserir na postagem e atualizar e, em seguida, vá para a biblioteca da biblioteca de mídia. Diz-me que a imagem que carreguei está "anexada" à postagem? ... ou estamos falando de semântica aqui, porque eu entendo o que você está dizendo sobre esse pedaço de código que funciona apenas para imagens anexadas.
Byronyasgur
11
Você pode vincular um arquivo de imagem em qualquer lugar. Ao clicar em Inserir imagem / mídia, há uma guia "Do URL", onde você informa o URL da imagem, ou seja, o serviço imageshack. O regex poderá obter essa imagem ("como está"), mas o WP não poderá usar essa imagem como imagem em destaque, por exemplo.
Diana
3

Sugiro duas maneiras:

Usando um plug-in

Eu consideraria usar o plug-in Get The Image , para que você pudesse fazer algo como:

$args = array(
    'post_id' => <id>
    'image_scan' => true
);
get_the_image($args);

O acima tentará fazer as coisas nesta ordem:

  1. Procure a miniatura da postagem
  2. Procure a primeira imagem anexada
  3. Digitalize o conteúdo da postagem para uma imagem inserida.

Construindo suporte no seu tema

No entanto, estou usando uma função em um plug - in que implementa os dois primeiros itens da lista acima.

function gpi_find_image_id($post_id) {
    if (!$img_id = get_post_thumbnail_id ($post_id)) {
        $attachments = get_children(array(
            'post_parent' => $post_id,
            'post_type' => 'attachment',
            'numberposts' => 1,
            'post_mime_type' => 'image'
        ));
        if (is_array($attachments)) foreach ($attachments as $a)
            $img_id = $a->ID;
    }
    if ($img_id)
        return $img_id;
    return false;
}

Você pode adaptá-lo para também corresponder ao terceiro item no snippet de Diana:

function find_img_src($post) {
    if (!$img = gpi_find_image_id($post->ID))
        if ($img = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches))
            $img = $matches[1][0];
    if (is_int($img)) {
        $img = wp_get_attachment_image_src($img);
        $img = $img[0];
    }
    return $img;
}

Basta colar essas duas funções no seu functions.phparquivo e usá-las no loop, como:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>
vmassuchetto
fonte
O tema deve estar à venda comercialmente, então não quero dizer ao usuário final que ele deve instalar um plug-in, mas obrigado.
Byronyasgur 31/07/2012
@byronyasgur Editou a resposta para esclarecer que eu lhe dei duas soluções. Você não precisa instalar um plugin para seguir o segundo.
31412 vmassuchetto
2

o código parece perfeitamente seguro. como você disse, você não tem nenhuma imagem anexada à postagem.

Considere ir ao painel de administração de mídia e anexar uma imagem a essa postagem.

Como alternativa, descarte o conteúdo da postagem com uma expressão regular para imagens.

pcarvalho
fonte
Eu tenho um mal-entendido do que "anexado" significa exatamente? .... Eu tenho uma imagem na postagem ... ela não está anexada quando você clica em 'adicionar à postagem'?
byronyasgur
11
da sua pergunta, parecia que você digitou o código html vinculado a uma imagem não necessariamente anexada pelo wp.
Pcarvalho
1

Entendo que essa é uma pergunta muito antiga, mas estou colocando minha resposta aqui, já que a resposta mais votada não é apropriada para pessoas que são novas no PHP.

preg_match não é uma boa abordagem para analisar HTML em PHP, já que preg_match é para expressão regular e HTML não é expressão regular.

Em vez disso, podemos usar o DOM.

function firstImg($html){
  $dom = new DOMDocument;
  $dom->loadHTML($html);
  $images = $dom->getElementsByTagName('img');
  foreach ($images as $image) {
    return $image->getAttribute('src');
  }
  return false;
}

O uso do DOM é muito bom, pois você pode fazer outras coisas além de obter a primeira imagem e é o caminho certo para analisar o html.

Eu gostaria de poder colocar resposta para o uso de funções wordpress (funções do CODEX e do núcleo) para obter a primeira imagem, mas esse também é o problema com o qual estou lidando.

Isso não é resposta para todos os casos!

Considere o caso da otimização do tamanho da imagem. Nesse caso, você não pode simplesmente usar esse código porque a postagem pode conter qualquer tamanho de imagem.


fonte
0

Este código funciona para mim:

function get_first_image( $post_id ) {
    $attach = get_children( array(
        'post_parent'    => $post_id,
        'post_type'      => 'attachment',
        'post_mime_type' => 'image',
        'order'          => 'DESC',
        'numberposts'    => 1
    ) );
    if( is_array( $attach ) && is_object( current( $attach ) ) ) {
        return current( $attach )->guid;
    }
}
Mario62RUS
fonte