Obtenha a primeira imagem em um post

10

Estou usando esse código diretamente do códice .

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 como este echo_first_image ($post->ID);

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

Eu tenho uma imagem na postagem 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?

    
por byronyasgur 31.07.2012 / 04:20

5 respostas

21

Se você quiser que exiba uma imagem inserida em seu conteúdo (uma imagem de hotlink, por exemplo), você deve usar 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 você deseja exibir a imagem.

Observação: uma imagem de link especial que acabou de ser colocada no seu conteúdo não pode ser definida como Imagem em destaque, um recurso completo do WordPress.

    
por Diana 31.07.2012 / 08:26
3

Eu sugiro duas maneiras:

Usando um Plugin

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 texto 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 de uma imagem inserida.

Criando 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 inserir essas duas funções no arquivo functions.php 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; ?>
    
por vmassuchetto 31.07.2012 / 13:37
2

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

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

Como alternativa, elimine o conteúdo da postagem com um regex para imagens.

    
por pcarvalho 31.07.2012 / 04:41
1

Eu 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 é uma expressão regular.

Podemos usar o DOM em seu lugar.

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, já que você pode fazer mais do que apenas obter a primeira imagem e é a maneira correta de analisar o html.

Eu gostaria de poder responder usando as funções do wordpress (funções do CODEX e do core) 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 este código porque a postagem pode conter qualquer tamanho de imagem.

    
por Victor 28.04.2018 / 16:40
0

Esse 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;
    }
}
    
por Mario62RUS 24.09.2018 / 16:45