Définir l’image à la une automatiquement à partir de la première image envoyée sous WordPress

Le module Image à la une de WordPress, qui permet de définir une miniature pour vos contenus, est très utile à condition de l’avoir utilisé dès l’origine. Cette astuce vous permettra de définir cette fameuse miniature en allant chercher la première image envoyée dans votre article ou custom post type.

Dernièrement, j’ai eu affaire un projet personnel nécessitant le recours aux images à la une. Le problème était que j’avais récupéré une base de données n’utilisant pas ce principe… Il me fallait donc trouver un bout de code capable de redéfinir de façon entièrement automatisée cette miniature et notamment parce qu’il existait une centaine d’article.

Or, il se trouve que 9 cas sur 10, la première image que l’on envoie dans l’éditeur est généralement celle que l’on souhaite utiliser comme image à la une.

Pour ce faire, envoyez le code suivant dans fichier functions.php présent dans le dossier /wp-content/themes/NOM_DU_THEME/ de votre installation WordPress :

function autoset_featured() {
          global $post;
          $already_has_thumb = has_post_thumbnail($post->ID);
              if (!$already_has_thumb)  {
              $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                          if ($attached_image) {
                                foreach ($attached_image as $attachment_id => $attachment) {
                                set_post_thumbnail($post->ID, $attachment_id);
                                }
                           }
                        }
      }  //end function
add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
add_action('future_to_publish', 'autoset_featured');

Ce code n’est pas le mien ! Voici la source anglophone qui m’a aidé à obtenir le résultat recherché.

D’autres tutoriels intéressants à propos des images à la une de WordPress ont déjà été publiés sur ce site et sont marqués du tag Miniatures.

Crédits photo : ddesign

30 commentaires

    1. Aurélien Denis auteur de l’article

      En fait, j’ai retesté et même un code à partir d’un commentaire de Julio de BAW laissé sur la source indiquée dans l’article. Si je ne garde que le hook :
      add_action(‘save_post’, ‘autoset_featured’);

      Cela ne fonctionne pas si l’article est déjà publié. Il faut alors garder :

      add_action(‘the_post’, ‘autoset_featured’);

      Du coup, je pense que les autres hooks sont aussi utiles ou pourront l’être. A voir !

  1. Noann

    A mon avis il faut sélectionner un des add_action selon ce qu’on veut faire :

    save_post pour ajouter à la publication de l’article
    the_post pour ajout à l’affichage
    draft_to_publish à la prévisualisation

    Les autres je ne sais pas trop l’effet

    Mais de toute évidence, certains add_actions sont en trop et on risque d’avoir deux fois ou trois fois la fonction appelée (ce qui ne se voit pas forcément.

    Perso je mettrais seulement save_post, car ce que je souhaite c’est d’avoir l’image à la une ajoutée automatiquement, si j’oublie de la définir. Après chacun fait ce qu’il veut

  2. Noann

    Après vérification je ne trouve pas les trois derniers hooks sur le site officiel

    http://codex.wordpress.org/Plugin_API/Action_Reference

    Méfiance donc. On ne sait pas d’où ça vient. Peut-être certains hooks étaient actifs dans de vieilles versions de WP mais ne sont plus supportés

    J’ai des doutes aussi sur :
    post_type=attachment&post_mime_type=image&numberposts=1
    Mais peut-être parce que je n’ai pas bien compris le principe

    A tester en tout cas, en se souvenant qu’en cas de plantage, c’est tout le site qui peut coincer. Donc faire une copie du fichier pour pouvoir le restaurer par ftp

    1. Aurélien Denis auteur de l’article

      Tu peux lire mon commentaire en réponse à GeekPress.

      post_type=attachment&post_mime_type=image&numberposts=1

      Cette ligne est simple, elle récupère le premier média attaché à l’article et vérifie qu’il s’agit d’une image.

      Oui, en cas de plantage, il suffit de supprimer les lignes de code.

      1. Noann

        Oui en cas de plantage on supprime les lignes de code… Sauf qu’un plantage peut aussi bloquer l’admin ! Donc prudence si on le modifie dans l’éditeur intégré

  3. GeekPress

    save_post fonctionne dans tous les cas (publication, broullion, etc…). Il fonctionne quand on « sauvegarde » un article.

    J’ai fait un plugin avec cette astuce il y a quelques mois et ça fonctionne parfaitement avec juste avec save_post

  4. Noann

    Un truc me turlupine

    Pourquoi une boucle foreach ?

    Cette boucle désigne chaque image de l’article comme image à la une. Mais on ne peut avoir qu’une seule image à la une, il me semble.

    J’ai essayé cette fonction avec un article qui possède deux images. c’est la dernière qui est gardée comme image à la une. Du coup je ne vois pas l’intérêt d’un foreach. Suis-je bête ou ai-je pas tout à fait tort ?

  5. Noann

    Oui il y a une limitation à une image « à la une » par article dans WP, donc il ne me semble pas utile de boucler sur chaque image. Remarque, la solution que tu donnes ici marche parfaitement. Je ne dis pas que c’est mal écrit. Mais on peu rationaliser un rien

    Ma solution :

    function autoset_featured() {
    global $post;
    $already_has_thumb = has_post_thumbnail($post->ID);
    if (!$already_has_thumb) { // sauter si l’image à la une existe déjà
    $attached_image = get_children( « post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1 » );
    if ($attached_image) {
    set_post_thumbnail($post->ID, key($attached_image) );
    }
    }
    }
    add_action …

    En faisant comme ça, l’image à la une est la dernière chargée dans l’article.

    Dans l’array, la première valeur est la première image du catalogue « media » (cfr tableau de bord -> media), et donc la dernière chargée, peu importe la position de l’image dans l’article

    Je l’ai testée sur 3 articles avec plusieurs images, et ça semble bon… On obtient le même résultat final, mais on économise un peu de temps de calcul… Pas négligeable si la fonction doit être appelée à chaque affichage, entre autres

    Merci quand même pour l’article , c’est ce que je cherchais.

  6. Nico

    Et vous n’auriez pas un script pour récupérer la première image d’un article (mais non la première « uploadée ») pour la « transformer » en image à la une ?
    J’utilise depuis un moment le plugin The attached image pour faire ça… Mais si je pouvais transformer l’image obtenue via ce plugin en image à la une, cela m’arrangerait bien pour évoluer vers un thème qui utilise cette fonction

  7. Nico

    Merci pour ta réponse mais j’avais déjà lu cet article. Malheureusement, je n’ai pas assez de compétence en développement pour en faire quelque chose.
    C’est dommage… Il faudrait pouvoir mixer 2 plugins : The attached image qui permet d' »extraire » une image que l’on choisit (par exemple la 1ere image d’un article et non pas la 1ere image attachée ou uploadée) et « refiler le résultat » à un générateur d’image à la une… qui transformera donc cette image en image à la une. Je pense que cela rendrait bien service aux anciens blogueurs qui n’utilisaient pas cette fonctionnalité et qui veulent changer de thème. D’ailleurs presque, voire tous les themes premium utilisent cette fonctionnalité.
    Personne pour s’y coller ?

  8. Nore

    Bonjour,
    serait-ce possible de creer un custom field pour mettre l’image a la une?
    mon site est gérer par xmlrpc et je n’ai pas de moyen de mettre l’image a la une,
    merci d’avance

  9. Nore

    Ok je vais jeter un coup d’oeil au tuto, on passe par filemaker en fait, c’est une assez grosse base de donnée et tout marche mais pas l’image a la une,
    Merci Aurelien et très bon site,
    Bonne journée

  10. Lucie

    Bonjour,
    Merci pour ce code.
    Je n’arrive pas à comprendre que les images uploadés sont redéfinies en miniatures dans le serveur, mais pas dans la bibliothèque.
    J’aurais aimé donc mettre une taille défini à ce code ou pouvoir prendre les miniatures qui se trouvent bien sur le serveur.
    Mais peut être suis je hors sujet ?

  11. Delphine

    Bonjour Aurélien,

    Merci pour cette astuce qui m’a bien aidée jusque là !
    Depuis WordPress 3.5 (enfin je crois ^^) il semble que cela ne fonctionne plus
    Des idées pour y remédier ?

  12. Camille

    Bonjour Arélien et merci pour ce script !

    J’utilise WordPress 3.5.1 chez Online.net et quand je crée un nouveau post dans l’admin j’ai :

    – 3 errors in functions.php : “Notice: Trying to get property of non-object in ” au niveau de ces lignes :

    1/ $already_has_thumb = has_post_thumbnail($post->ID);

    2/ $attached_image = get_children( « post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1 » );

    3/ set_post_thumbnail($post->ID, $attachment_id);

    – et une autre erreur « Notice: Trying to get property of non-object in wp-includes/post-template.php on line 29

    => Line 29 : function get_the_ID() {return get_post()->ID;}

    Et je ne comprends pas pourquoi ? C’est bizarre D’autant plus que le script marche 1 fois sur 4

    Des idées pour me faire avancer ?

    Camille.

  13. seb59rx

    Je cherche a faire quelque chose de ressemblant; RETIRER l’image à la une des posts après soit un certain temps, soit un nombre de post ajoutés ….. Je sèche,
    Petite précision, je ne veux pas supprimer l’image de la bibliothèque.

    Avez vous une idée ?
    Merci d’avance

Laisser un commentaire