Obtener la primera imagen en una publicación

10

Estoy utilizando este código directamente desde el 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">';

        }
    }
}

Lo llamo dentro del bucle como este echo_first_image ($post->ID);

La función hace una llamada pero no sale nada ... por lo que puedo ver, no hay nada en $attachments

Tengo una imagen en la publicación que estoy usando. No es una imagen destacada ni en una galería, solo en la publicación.

¿Estoy haciendo algo mal o hay algún problema con el código en primer lugar?

    
pregunta byronyasgur 31.07.2012 - 04:20

5 respuestas

21

Si desea mostrar una imagen que se inserta en su contenido (una imagen de enlace directo, por ejemplo), debe usar una función como esta (fuente) :

agregar en 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;
}

Luego, coloca <?php echo catch_that_image() ?> donde quieras mostrar la imagen.

Nota: una imagen de enlace activo que se acaba de colocar en tu contenido no se puede configurar como Imagen destacada, una característica de WordPress mejorada.

    
respondido por el Diana 31.07.2012 - 08:26
3

Sugiero dos maneras:

Usando un complemento

Consideraría usar el complemento Get The Image , por lo que podría hacer algo como:

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

Lo anterior intentará hacer las cosas en este orden:

  1. Busca la miniatura de la publicación
  2. Busca la primera imagen adjunta
  3. Escanee el contenido de la publicación para una imagen insertada.

Creando soporte en tu tema

Sin embargo, estoy usando una función en un plugin que implementa los dos primeros elementos de la lista anterior.

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;
}

Puede adaptarlo para que coincida también con el tercer elemento del fragmento de código 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;
}

Simplemente coloque estas dos funciones en su archivo functions.php y utilícelas en el ciclo 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; ?>
    
respondido por el vmassuchetto 31.07.2012 - 13:37
2

el código parece perfectamente seguro. como dijiste, no tienes ninguna imagen adjunta a la publicación.

Considere ir al panel de administración de medios y adjunte una imagen a esa publicación.

Como alternativa, elimine el contenido de la publicación con una expresión regular para las imágenes que contiene.

    
respondido por el pcarvalho 31.07.2012 - 04:41
1

Entiendo que esta es una pregunta muy antigua, pero estoy poniendo mi respuesta aquí ya que la respuesta más votada no es apropiada para las personas que son nuevas en PHP.

preg_match no es un buen método para analizar HTML en PHP ya que preg_match es para expresiones regulares y HTML no es una expresión regular.

Podemos usar DOM en su lugar.

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

El uso de DOM es realmente bueno, ya que puedes hacer otra cosa que no sea solo obtener la primera imagen y es la forma correcta de analizar HTML.

Desearía poder responder por el uso de las funciones de wordpress (funciones de CODEX y core) para obtener la primera imagen, pero ese es también el problema con el que estoy tratando.

  

¡Esto no es una respuesta para todos los casos!

     

Considere el caso de la optimización del tamaño de la imagen. En ese caso, no puedes usar este código simplemente porque la publicación puede contener cualquier tamaño de imagen.

    
respondido por el Victor 28.04.2018 - 16:40
0

Este código me funciona:

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

Lea otras preguntas en las etiquetas