Obtenga la primera imagen del contenido de la publicación (por ejemplo: imágenes enlazadas)

10

Estoy usando este código directamente del 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 así echo_first_image ($post->ID);

La función llama pero nada sale ... 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 o en una galería, solo en la publicación.

¿Estoy haciendo algo mal, o hay algo mal con el código en primer lugar?

byronyasgur
fuente

Respuestas:

22

Si desea mostrar una imagen que se inserta en su contenido (una imagen enlazada, 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, coloque <?php echo catch_that_image() ?>donde desea mostrar la imagen.

Nota: una imagen enlazada en caliente que acaba de colocarse en su contenido no se puede establecer como Imagen destacada, una característica de WordPress bultin.

Diana
fuente
Sí, he visto ese código ... parece un truco, pensarías que habría una forma de "WordPress" ... Me pregunto por qué necesito usar preg_match cuando el códice dice que puedes hacerlo como publiqué arriba. Esa es mi pregunta realmente para ser honesto. ¿El código que publiqué es incorrecto? ... más que tratar de que funcione realmente. Pero gracias puedo terminar teniendo que usar esto. No entiendo el significado de "una imagen que se acaba de colocar en su contenido no se puede establecer como Imagen destacada". ¿Eso impacta sobre esto de alguna manera? Solo intento mostrar la primera imagen de la publicación, no la imagen destacada.
byronyasgur
Hay una gran diferencia entre colocar un enlace de imagen dentro del contenido de su publicación / página y adjuntar una imagen. Puede adjuntar una imagen sin mostrarla en absoluto. El ejemplo del Codex se trata de obtener un archivo adjunto a su publicación / página, no hay forma de colocar una imagen dentro mediante la vinculación, también el enlace directo no es una característica con la que WP se ocupará sin PHP regex.
Diana
Acerca de la referencia de COdex: como puede ver, el documento se llama después del nombre de la función get_childre, un archivo adjunto es una publicación secundaria, por lo que este ejemplo solo puede funcionar para el contenido adjunto.
Diana
Sí, sé que puedo adjuntar una imagen sin insertarla, ese bit está claro ... pero no veo cómo puede insertar una imagen sin adjuntarla ... cuando presiono cargar / insertar, cargar un archivo desde mi computadora y presionar Insertar en la publicación y actualizar y luego ir a la biblioteca de la biblioteca de medios me dice que la imagen que cargué está "adjunta" a la publicación. ... o estamos hablando de semántica aquí porque entiendo lo que estás diciendo sobre ese bit de código que solo funciona para imágenes adjuntas.
byronyasgur
1
Puede vincular un archivo de imagen en cualquier lugar. Al hacer clic en Insertar imagen / medios, hay una pestaña "Desde URL", donde se informa una URL de imagen, es decir, el servicio imageshack. La expresión regular podrá obtener esta imagen ("tal cual"), pero WP no podrá utilizar esta imagen como Imagen destacada, por ejemplo.
Diana
3

Sugiero dos maneras:

Usando un complemento

Consideraría usar el complemento Get The Image , para que pueda 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. Busque la primera imagen adjunta
  3. Escanee el contenido de la publicación en busca de una imagen insertada.

Construyendo apoyo en su tema

Sin embargo, estoy usando una función en un complemento 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 también coincida con el tercer elemento dentro del fragmento 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 pegue estas dos funciones en su functions.phparchivo y úselas en el bucle 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
fuente
El tema debe estar a la venta comercialmente, así que no quiero decirle al usuario final que tienen que instalar un complemento, pero gracias.
byronyasgur
@byronyasgur Editó la respuesta para aclarar que le di dos soluciones. No necesita instalar un complemento para seguir el segundo.
vmassuchetto
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.

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

pcarvalho
fuente
¿Tengo un malentendido de lo que significa "adjunto" exactamente? .... SÍ tengo una imagen en la publicación ... ¿no se adjunta cuando haces clic en 'agregar a la publicación'?
byronyasgur
1
de su pregunta, parece que escribió el código html que vincula a una imagen no necesariamente adjunta por wp.
pcarvalho
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 enfoque para analizar HTML en PHP ya que preg_match es para expresión regular y HTML no es 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;
}

Usar DOM es realmente bueno ya que puedes hacer algo más que solo obtener la primera imagen y es la forma correcta de analizar html.

Desearía poder responder para usar 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 lidiando.

¡Esta no es la respuesta para todos los casos!

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


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