web-dev-qa-db-fra.com

Extraire et afficher la première image REAL associée à un message - étendre the_post_thumbnail ()

J'ai un problème intéressant que je suis sûr que quelqu'un ici peut résoudre. J'ai parcouru de nombreux plug-ins et extraits de code pour rechercher le code idéal pour extraire une image principale à associer à un message .

Si le nouvel WP 3.0 élément d'image en vedette est utilisé, il n'y a bien entendu aucun problème, mais il existe de nombreuses situations dans lesquelles une publication peut ne pas avoir une "image en vedette". Dans ces situations, si vous utilisiez le code standard de:

<?php echo the_post_thumbnail( array(200,200) ); ?>

dans votre modèle ... rien ne va être affiché.

Pour ce type de situation, je cherche la solution parfaite. Ce dont j'ai essentiellement besoin, c’est d’avoir la possibilité d’avoir un type de "basculement" lorsque l’annonce_post_thumbnail n’existe pas, mais il me faut également la possibilité de définir la taille de l’image, comme c’est le cas avec le code de l’adresse_post_thumbnail.

Je pense que ce "basculement" devrait se faire en deux étapes:

  1. Vérifiez la "Galerie multimédia" de ce message et localisez l'image avec l'ordre de tri le plus élevé (ou ajoutez un parent comme indiqué dans le plug-in ci-dessous).
  2. Si aucun ordre de tri n'est défini ou si vide, extrayez la première image du contenu de l'article.

La bonne nouvelle est que, pour les deux points ci-dessus, il semble que j'ai trouvé deux fragments de code distincts qui traitent ces demandes individuellement (copiées ci-dessous pour révision), mais rien qui combine ces trois éléments en un.

Donc, pour récapituler: au lieu de faire une série d’appels si/alors pour vérifier si une vignette de publication existe et de lancer ensuite une vérification du code ci-dessous, j’espérais que quelqu'un pourrait être en mesure de fournir une fonction propre/combinée qui me le permettrait. faire écho à une fonction unique avec des variables de taille qui permettent d'atteindre ces trois objectifs, comme mentionné ci-dessus.

VOICI LES BITS DU CODE MENTIONNÉS CI-DESSUS:


FOR # 1: Obtenez la première image en fonction de la commande dans la galerie multimédia: Ce code fonctionne en recherchant d'abord les pièces jointes dans la table de la base de données wp_posts qui avoir un identifiant "post_parent" qui correspond à la publication en cours et comme seconde étape pour les publications avec plusieurs pièces jointes, en renvoyant la pièce jointe avec son champ "menu_order" réglé sur "1". Si aucune pièce jointe d'image ne correspond à l'identifiant de publication en cours, le plug-in renvoie "false".

// AUTOMATICALLY EXTRACT IMAGES BASED ON ASSOCIATED GALLERY ORDER
// THIS CODE EXTRACTS THE FIRST IMAGE BASED ON THE ORDER IN THE MEDIA GALLERY
// PLUGIN FROM: http://mekosh.org/projects/ordered-thumbnails
   function ordered_thumbnails( $display = 'true', $class='' ) {
    global $post;
    // get all image attachments for this post
    $images = get_children( array( 'post_type' => 'attachment', 'post_parent' => $post->ID, 'post_mime_type' => 'image', order=>"asc" ) );
    // if the post has image attachments
    if( $images !== false ) {
        // find the image in position 1
        foreach($images as $i) {
            if ( $i->menu_order == 1 ) {
                $img_id = $i->ID;
            }
        }
        // if the images were unordered
        if ( $img_id == '' ) {
            $i = array_slice( $images, 0, 1 );
            $img_id = $i[0]->ID;
        }
        // get image data
        $image = wp_get_attachment_image_src( $img_id, 'thumbnail' );
        $result = array(
            'url'       => $image[0],
            'width' => $image[1],
            'height'    => $image[2]
        );
        // should the image be displayed or should data be returned as an array?
        if ( $display == 'true' ) {
            return _e( '<img src="'.$result['url'].'" width="'.$result['width'].'" height="'.$result['height'].'" class="'.$class.'" />' );
        } else {
            return $result;
        }
    } else {
        // post does not have any image attachments
        return (bool) false;
    }
   }
// create template tag "ordered_thumbnails"
   add_action( 'ordered_thumbnails', 'ordered_thumbnails', 2 );

FOR # 2: Extrait la première image du contenu du message

// THIS CODE GETS THE FIRST IMAGE EXTRACTED DIRECTLY FROM THE POST CONTENT

    function bm_extract_string($start, $end, $original) {
    $original = stristr($original, $start);
    $trimmed = stristr($original, $end);
    return substr($original, strlen($start), -strlen($trimmed));
    }
    function getFirstImage() {
    $content = get_the_content();
    $pic_string = bm_extract_string('src="','" ',$content);
    $imagesize = getimagesize($pic_string);
    list($width, $height, $type, $attr) = getimagesize($pic_string);
    $link = get_permalink();
    $title = get_the_title($post->post_title);
    echo '<a href="'.$link.'" style="background:url('.$pic_string.'); display:block; width:'.$width.'px; height:'.$height.'px;" title="'.$title.'"></a>';
    }
2
NetConstructor.com

Voici la solution à mon problème pour quiconque est intéressé.

Incluez ceci dans votre fichier functions.php

require_once('custom/extract-post-thumbnail.php');
    $extract_img = new extract_post_image();
    add_filter( 'post_thumbnail_html', array(&$extract_img, 'get_post_image'),1,5 );

Créez un nouveau fichier et nommez-le "extract-post-thumbnail.php", placez-le dans un dossier nommé "custom" et placez-le dans le même répertoire que votre fichier themes functions.php. Enfin, passez le code ci-dessous dans ce fichier.

<?php
class extract_post_image {
    public $html;
    public $post_id;
    public $post_image_id;
    public $size;
    public $attr;
    public function extract_post_image()  {
    }
    public function get_post_image ($html,$post_id, $post_image_id, $size, $attr) {
$this->html = $html;
        $this->post_id = $post_id;
        $this->post_image_id = $post_image_id;
        $this->size = $size;
        $this->attr = $attr;
    if ($this->html == '') {
         $this->post_image_id = $this->get_post_image_id ();
         if ($this->post_image_id) {
           do_action( 'begin_fetch_post_thumbnail_html', $this->post_id, $this->post_image_id, $this->size ); 
        $this->html = wp_get_attachment_image( $this->post_image_id, $this->size, false, $this->attr );
        do_action( 'end_fetch_post_thumbnail_html', $this->post_id, $this->post_image_id, $this->size );
    } else {
        $this->html = $this->get_image_in_content ();
    }
    }
    return $this->html;
}
public function get_post_image_id () {
    $images = get_children(
    array(
        'post_parent' => $this->post_id,
        'post_status' => 'inherit',
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'numberposts' => 1
        )
    );
    if ($images) {
        foreach ($images as $img) {
        $img_id = $img->ID;
        }
        return $img->ID;
        } else {
           return NULL;
        }
}
public function remote_file_exists($image) {
    if ( @file($image)) {
        return true;
    }
    return false;
}
public function get_image_in_content () {
    $my_post = get_post($this->post_id);
    preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i', $my_post->post_content, $matches );
    if ( isset( $matches ) ) {
            $image = $matches[1][0];
    if ( $matches[1][0] && $this->remote_file_exists($image) ) {
            $altpattern = '/alt=([\'"])?(.*?)\\1/';
            preg_match($altpattern, $matches[0][0], $m);
            $alt = $m[2];
            $default_attr = array(
            'src'   => $image,
            'class' => "attachment-$size",
            'alt'   => $alt
        );
            $this->attr = wp_parse_args($this->attr, $default_attr);
        $attr = array_map( 'esc_attr', $this->attr );
        $attributes = '';
        foreach ( $this->attr as $name => $value ) {
            $attributes .= " $name=" . '"' . $value . '"';
        }
           $imgwh = getimagesize($image);
           $imgsize = image_constrain_size_for_editor($imgwh[0], $imgwh[1], $this->size);
           $wh = image_hwstring($imgsize[0], $imgsize[1]);
           $this->html = ' <img '.$attributes.' '.$wh.' />';
                return $this->html;
        }
        } else {
        return NULL;
        }
}
}
?>
1
NetConstructor.com

Je suggère de vérifier Obtenez le plugin Image . Fondamentalement, il s’agit d’une fonction unique qui agit comme un wrapper flexible et configurable pour extraire des publications d’images par différentes méthodes (champs de méta-publications, images en vedette, images jointes, images dans le corps de la publication).

2
Rarst

Vous pouvez vérifier les extraits de code utiles ici . Je les ai trouvés utiles pour extraire la première image du message.

0
me-too

@ NetConstructor,

Cette fonction ne résoudra pas tous vos problèmes, mais je pensais que cela aiderait. Il obtient la première image jointe à un article et ajoute l'image de taille moyenne à the_content Si aucun ordre de tri n'est défini, il obtiendra l'image avec l'ordre de tri "0". Il n’extrait rien du contenu du message et si l’image est dans le contenu du message, elle sera affichée 2 fois.

Je l'ai utilisé pour un client qui avait du mal à insérer des images dans des publications. Avec cette fonction, il suffit de cliquer sur le bouton "ajouter un média", de télécharger l'image et de cliquer sur Enregistrer sans avoir à "l'insérer".

function the_image($size = 'medium' , $class = ”){
global $post;

//setup the attachment array
$att_array = array(
'post_parent' => $post->ID,
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order_by' => 'menu_order'
);

//get the post attachments
$attachments = get_children($att_array);

//make sure there are attachments
if (is_array($attachments)){
//loop through them
foreach($attachments as $att){
//find the one we want based on its characteristics
if ( $att->menu_order == 0){
$image_src_array = wp_get_attachment_image_src($att->ID, $size);

//get url – 1 and 2 are the x and y dimensions
$url = $image_src_array[0];
$caption = $att->post_excerpt;
$image_html = '<img src="%s" alt="%s" />';

//combine the data
$html = sprintf($image_html,$url,$caption,$class);

//echo the result
echo $html;
}
}
}
}
0
Chris_O