Obtenir la première image d'un message

10

J'utilise ce code directement à partir du 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">';

        }
    }
}

Je l'appelle dans la boucle comme ceci echo_first_image ($post->ID);

La fonction appelle mais rien ne sort en sortie ... autant que je sache, rien dans $attachments

J'ai une image dans le message que j'utilise. Ce n'est pas une image en vedette ou dans une galerie, juste dans le post.

Est-ce que je fais quelque chose de mal, ou y a-t-il quelque chose de mal avec le code en premier lieu?

    
posée byronyasgur 31.07.2012 - 04:20

5 réponses

21

Si vous souhaitez afficher une image insérée dans votre contenu (une image liée par un lien direct, par exemple), vous devez utiliser une fonction telle que celle-ci (source) :

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

Placez ensuite <?php echo catch_that_image() ?> à l'endroit où vous souhaitez afficher l'image.

Remarque: une image créée par un lien hypertexte qui vient d'être placée dans votre contenu ne peut pas être définie comme Image en vedette, une fonctionnalité WordPress complète.

    
réponse donnée Diana 31.07.2012 - 08:26
3

Je suggère deux manières:

Utilisation d'un plugin

J'envisagerais d'utiliser le plug-in Get The Image pour pouvoir faire quelque chose comme: <

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

Ce qui précède va essayer de faire les choses dans cet ordre:

  1. Recherchez la vignette du message
  2. Recherchez la première image jointe
  3. Analysez le contenu du message pour rechercher une image insérée.

Création d'un support dans votre thème

Cependant, j'utilise une fonction dans un plug-in qui implémente les deux premiers éléments de la liste ci-dessus.

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

Vous pouvez l'adapter également au troisième élément de l'extrait de code 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;
}

Il suffit de coller ces deux fonctions dans votre fichier functions.php et de les utiliser dans la boucle comme suit:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>
    
réponse donnée vmassuchetto 31.07.2012 - 13:37
2

le code semble parfaitement sûr. comme vous l'avez dit, vous n'avez aucune image jointe au message.

Envisagez de vous rendre sur le panneau d'administration des médias et de joindre une image à ce message.

Vous pouvez également supprimer le contenu de la publication avec une expression régulière pour les images qu'il contient.

    
réponse donnée pcarvalho 31.07.2012 - 04:41
1

Je comprends que cette question est très ancienne, mais je mets ma réponse ici car la réponse la plus votée n’est pas appropriée pour les personnes novices en PHP.

preg_match n’est pas une bonne approche pour l’analyse HTML en PHP, étant donné que preg_match est une expression régulière et que HTML n’est pas une expression régulière.

Nous pouvons utiliser DOM à la place.

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

Utiliser DOM est vraiment bien, car vous pouvez faire autre chose que simplement obtenir la première image et que c'est un bon moyen d'analyser le code HTML.

Je souhaite pouvoir mettre en place une réponse pour utiliser les fonctions wordpress (fonctions de CODEX et de base) afin d’obtenir une première image, mais c’est aussi le problème que je traite.

  

Ce n'est pas une réponse pour tous les cas!

     

Prenons le cas de l'optimisation de la taille de l'image. Dans ce cas, vous ne pouvez pas simplement utiliser ce code car le message peut contenir n’importe quelle taille d’image.

    
réponse donnée Victor 28.04.2018 - 16:40
0

Ce code fonctionne pour moi:

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;
    }
}
    
réponse donnée Mario62RUS 24.09.2018 - 16:45

Lire d'autres questions sur les étiquettes