web-dev-qa-db-fra.com

Récupérer la 1ère image en publication et la définir comme image sélectionnée lorsque la publication est enregistrée/mise à jour

Je dois définir une image pour chaque message que je publie. Ainsi, lorsqu'un article est publié/mis à jour, le script la scanne pour la première image à l'aide d'un script comme celui-ci:

   // Get URL of first image in a post
   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];

   // no image found display default image instead
   if(empty($first_img)){
   $first_img = "/images/default.jpg";
   }
   return $first_img;
   }

Ainsi, il obtiendrait cette image et la définirait comme une image sélectionnée pour ce message. S'il n'y a pas d'image, ne faites rien. J'ai examiné de nombreux scripts et plugins mais aucun ne le fait comme je le demande.

4
Gixty

Cela pourrait fonctionner pour vous aussi. Il balaye le message, puis extrait le jeu d'images comme "en vedette". Si cela n'existe pas, il renvoie la première image jointe à l'article. S'il n'y en a pas, il cherche n'importe quelle image dans le post; si ce n'est pas là, il capture une capture d'écran YouTube. Mettez ceci dans le fichier functions.php de votre thème:

// Note that your theme must support post thumbnails for this function to work. 
// If you are getting an error try adding add_theme_support('post-thumbnails'); to your functions. php file  
function vp_get_thumb_url($text, $size){
    global $post;
    $imageurl="";

    // Check to see which image is set as "Featured Image"
    $featuredimg = get_post_thumbnail_id($post->ID);
    // Get source for featured image
    $img_src = wp_get_attachment_image_src($featuredimg, $size);
    // Set $imageurl to Featured Image
    $imageurl=$img_src[0];

    // If there is no "Featured Image" set, move on and get the first image attached to the post
    if (!$imageurl) {
        // Extract the thumbnail from the first attached imaged
        $allimages =&get_children('post_type=attachment&post_mime_type=image&post_parent=' . $post->ID );

        foreach ($allimages as $img){
            $img_src = wp_get_attachment_image_src($img->ID, $size);
            break;
        }
        // Set $imageurl to first attached image
        $imageurl=$img_src[0];
    }

    // If there is no image attached to the post, look for anything that looks like an image and get that
    if (!$imageurl) {
        preg_match('/<\s*img [^\>]*src\s*=\s*[\""\']?([^\""\'>]*)/i' ,  $text, $matches);
        $imageurl=$matches[1];
    }

    // If there's no image attached or inserted in the post, look for a YouTube video
    if (!$imageurl){
        // look for traditional youtube.com url from address bar
        preg_match("/([a-zA-Z0-9\-\_]+\.|)youtube\.com\/watch(\?v\=|\/v\/)([a-zA-Z0-9\-\_]{11})([^<\s]*)/", $text, $matches2);
        $youtubeurl = $matches2[0];
        $videokey = $matches2[3];
    if (!$youtubeurl) {
        // look for youtu.be 'embed' url
        preg_match("/([a-zA-Z0-9\-\_]+\.|)youtu\.be\/([a-zA-Z0-9\-\_]{11})([^<\s]*)/", $text, $matches2);
        $youtubeurl = $matches2[0];
        $videokey = $matches2[2];
    }
    if ($youtubeurl)
        // Get the thumbnail YouTube automatically generates
        // '0' is the biggest version, use 1 2 or 3 for smaller versions
        $imageurl = "http://i.ytimg.com/vi/{$videokey}/0.jpg";
    }

    // Spit out the image path
    return $imageurl;
}

Pour l'afficher dans vos fichiers de thème, insérez d'abord les éléments suivants:

<?php
if (function_exists('vp_get_thumb_url')) {
                                // Set the desired image size. Swap out 'thumbnail' for 'medium', 'large', or custom size
                                $thumb=vp_get_thumb_url($post->post_content, 'large-feature'); 
                            }
?>

et quelque part après cela, pour afficher l'image réelle, dans ce cas, entourée d'un lien vers le message:

<?php if ($thumb!='') { ?>
                                        <a href="<?php the_permalink() ?>" title="<?php the_title(); ?>" rel="bookmark"><img src="<?php echo $thumb; ?>" alt="<?php get_the_title(); ?>" /></a>
                                    <?php } ?>

Recherchez dans le nom de la fonction vp_get_thumb_url de Google d'autres articles sur la façon de le mettre en œuvre. Bonne chance!

5
Michelle

Utilisez votre fonction avec ces deux fonctions, lisez les commentaires dans le code pour comprendre

/**
 * If the the image is an attachment we just set the id as the post thumbnail,
 * if not then we get the first image from the post content , upload it using media_sideload_image and then we set the thumbnail
 * 
 * @param (int) $post_id post id
 * 
 * @return Void
 */
function set_featured_image_on_save($post_id){
    $attachments = get_posts(array('numberposts' => '1', 'post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC'));
    if(sizeof($attachments) > 0){
        set_post_thumbnail($post_id, $attachments[0]->ID);
    }else{
        // not loaded the we upload it as an attachment
        // required libraries for media_sideload_image
        require_once(ABSPATH . 'wp-admin/includes/file.php');
        require_once(ABSPATH . 'wp-admin/includes/media.php');
        require_once(ABSPATH . 'wp-admin/includes/image.php');

        // load the image
        $img  = catch_that_image();
        if ("/images/default.jpg" != $img){
            $result = media_sideload_image($img, $post_id);
            $attachments = get_posts(array('numberposts' => '1', 'post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC'));
            if(sizeof($attachments) > 0)
                set_post_thumbnail($post_id, $attachments[0]->ID);
        }else{
            //no images found
            return;
        }
    }
}



add_action( 'save_post', 'auto_set_post_image' );

/**
 * runs on post save and check's if we already have a post thumbnail, if not it gets one
 * 
 * @param  (int) $post_id 
 * @return Void
 */
function auto_set_post_image( $post_id ) {
    // verify if this is an auto save routine. 
      // If it is our form has not been submitted, so we dont want to do anything
      if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
          return;

    // Check permissions
    if ( 'page' == $_POST['post_type'] ){
        if ( !current_user_can( 'edit_page', $post_id ) )
        return;
    }else{
        if ( !current_user_can( 'edit_post', $post_id ) )
            return;
    }

    // OK, we're authenticated: we need to find and save the data

    //check if we have a post thumnail set already
    $attch = get_post_meta($post_id,"_thumbnail_id",true);
    if (empty($attch)){
        set_featured_image_on_save($post_id);
    }
}
3
Bainternet