Obtenez la première image du contenu de la publication (par exemple: images liées à chaud)

10

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 ça echo_first_image ($post->ID);

La fonction appelle mais rien ne sort ... autant que je sache, il n'y a 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.

Suis-je en train de faire quelque chose de mal, ou y a-t-il quelque chose de mal avec le code en premier lieu?

byronyasgur
la source

Réponses:

22

Si vous souhaitez afficher une image qui est insérée dans votre contenu (une image hotlinked, par exemple), vous devez utiliser une fonction comme 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 l'endroit <?php echo catch_that_image() ?>où vous souhaitez afficher l'image.

Remarque: une image liée par un lien direct qui vient d'être placée dans votre contenu ne peut pas être définie comme Image vedette, une fonctionnalité bultin WordPress.

Diane
la source
Oui, j'ai vu ce code autour ... semble être un peu un hack, on pourrait penser qu'il y aurait un moyen "WordPress" ... Je me demande pourquoi j'ai besoin d'utiliser preg_match quand le codex dit que vous pouvez le faire comme je l'ai posté ci-dessus. C'est vraiment ma question pour être honnête. Le code que j'ai publié est-il incorrect? ... plus que d'essayer de le faire fonctionner vraiment. Mais merci, je vais peut-être devoir utiliser cela. Je ne comprends pas la signification d'une "image qui vient d'être placée dans votre contenu ne peut pas être définie comme image sélectionnée". Cela a-t-il un impact sur cela d'une certaine manière? J'essaie simplement d'afficher la première image du post, pas l'image sélectionnée.
byronyasgur
Il y a une grande différence entre placer un lien d'image dans le contenu de votre article / page et joindre une image. Vous pouvez joindre une image sans l'afficher du tout. L'exemple du Codex consiste à attacher un fichier à votre publication / page, il n'y a aucun moyen d'obtenir une image placée à l'intérieur par un lien, également le hotlinking n'est pas une fonctionnalité que WP traitera sans regex PHP.
Diana
À propos de la référence COdex: comme vous pouvez le voir, le document est appelé après le nom de la fonction get_childre, une pièce jointe est une publication enfant, donc cet exemple ne peut fonctionner que pour le contenu joint.
Diana
Oui, je sais que je peux joindre une image sans l'insérer, ce bit est clair ... mais je ne vois pas comment vous pouvez insérer une image sans la joindre ... lorsque j'appuie sur télécharger / insérer, télécharger un fichier depuis mon ordinateur et appuyez sur insérer dans le post et mettez à jour puis allez dans la bibliothèque de la médiathèque, il me dit que l'image que j'ai téléchargée est "attachée" au post? ... ou parlons-nous de sémantique ici parce que je comprends ce que vous dites à propos de ce morceau de code qui ne fonctionne que pour les images jointes.
byronyasgur
1
Vous pouvez créer un lien hypertexte avec un fichier image n'importe où. Lorsque vous cliquez sur Insérer une image / un média, il y a un onglet "De l'URL", où vous informez une URL d'image, c'est-à-dire le service imageshack. Le regex pourra obtenir cette image ("en l'état"), mais WP ne pourra pas utiliser cette image comme Image vedette, par exemple.
Diana
3

Je suggère deux façons:

Utiliser un plugin

J'envisagerais d'utiliser le plugin 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 miniature du message
  2. Recherchez la première image jointe
  3. Scannez le contenu du post pour une image insérée.

Renforcer le soutien dans votre thème

Cependant, j'utilise une fonction dans un 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 correspondre également au 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 functions.phpfichier et de les utiliser dans la boucle comme:

<?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
la source
Le thème doit être commercialisé, donc je ne veux pas dire à l'utilisateur final qu'il doit installer un plugin, mais merci.
byronyasgur
@byronyasgur Modifié la réponse pour préciser que je vous ai donné deux solutions. Vous n'avez pas besoin d'installer un plugin pour suivre le second.
vmassuchetto
2

le code semble parfaitement sûr. comme vous l'avez dit, vous n'avez aucune image attachée au post.

Pensez à accéder au panneau d'administration multimédia et à joindre une image à ce message.

Alternativement, supprimez le contenu du message avec une expression régulière pour les images qu'il contient.

pcarvalho
la source
Dois-je mal comprendre ce que signifie «attaché» exactement? .... J'ai une image dans le message ... n'est-elle pas jointe lorsque vous cliquez sur "ajouter au message"?
byronyasgur
1
d'après votre question, il semble que vous ayez tapé le code html liant à une image pas forcément attachée par wp.
pcarvalho
1

Je comprends que c'est une très vieille question, mais je mets ma réponse ici car la plupart des réponses votées ne conviennent pas aux personnes qui découvrent PHP.

preg_match n'est pas une bonne approche pour analyser HTML en PHP car preg_match est pour l'expression régulière et HTML n'est pas l'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 simplement obtenir la première image et c'est la bonne façon d'analyser le html.

J'aimerais pouvoir répondre à l'utilisation des fonctions wordpress (fonctions de CODEX et de base) pour obtenir la 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 la publication peut contenir n'importe quelle taille d'image.


la source
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;
    }
}
Mario62RUS
la source