web-dev-qa-db-fra.com

Obtenir la première image du contenu du message (par exemple: images hotlinked)

J'utilise ce code directement depuis le 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 ... pour autant que je sache, il n'y a rien dans $attachments

J'ai une image dans le post 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?

10
byronyasgur

Si vous souhaitez afficher une image insérée dans votre contenu (une image avec lien dynamique, 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;
}

Ensuite, placez <?php echo catch_that_image() ?> où vous souhaitez afficher l'image.

Remarque: une image liée directement à un lien dans votre contenu ne peut pas être définie comme Image en vedette, une fonctionnalité WordPress bultin.

21
Diana

Je suggère deux façons:

Utiliser un plugin

J'envisagerais d'utiliser le plug-in Get The Image , afin que vous puissiez 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. Cherchez la première image jointe
  3. Numérisez le contenu de la publication pour rechercher une image insérée.

Construire un support dans votre thème

Cependant, j'utilise une fonction dans plugin 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 pour faire correspondre le troisième élément de l'extrait 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 ceci:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>
3
vmassuchetto

le code semble parfaitement sûr. comme vous l'avez dit, vous n'avez aucune image jointe à la publication.

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

Sinon, supprimez le contenu du message avec une expression régulière pour y afficher des images.

2
pcarvalho

Je comprends que cette question est très ancienne, mais je mets ma réponse ici car la réponse la plus votée ne convient pas aux personnes qui débutent en PHP.

preg_match n'est pas une bonne approche pour analyser le code HTML dans PHP, car preg_match est destiné à une expression régulière et 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;
}

L'utilisation de DOM est vraiment bonne car vous pouvez faire autre chose que de simplement obtenir la première image et c'est une bonne façon d'analyser le langage 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 chaque 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 l'article peut contenir n'importe quelle taille d'image.

1
Victor

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