WordPress – Afficher une miniature de la première image de vos billets

Dimanche 2 août 2009

Par défaut sur WordPress, les X derniers billets (nombre déterminé dans la partie « Réglages->Lecture » du panneau d’administration) sont affichés sur la page d’accueil. Ceux qui ne suivent pas mon blog par flux RSS ont peut être remarqué que j’affiche partiellement le dernier article et que seule la première image des articles précédents remonte sous forme de miniature (mise en cache) sur la page d’accueil. Suite à plusieurs demandes, je vais donc détailler ici la mise en place d’un tel système…

1 – Script PHP nécessaire à la génération des miniatures…

Récupérer le script php TimThumb écrit par Tim McDaniels et Darren Hoyt. Mettez le dans un fichier timthumb.php que vous chargerez dans le répertoire /wp-content/themes/votre_theme/ de votre installation WordPress.

A noter que les 3 variables (‘CACHE_SIZE’, ‘CACHE_CLEAR’ et ‘VERSION’) situées au début du script peuvent être modifiées, le script est bien documenté à ce niveau. Prenons les devants en indiquant dès maintenant que ce script va vous permettre (après édition du fichier functions.php) d’utiliser la fonction de génération des miniatures :

Lorsque vous allez appeler cette fonction dans votre fichier de thème (dans le cas présent, index.php), vous pourrez, au besoin, lui « passer » 4 arguments (w, h, zc et q) afin d’obtenir le type de miniature qui vous convient le mieux.

w: largeur de la miniature
h: hauteur de la miniature
zc: zoom crop (0 or 1)
q: qualité de la miniature (compression : 75% par défaut, maxi 100%)

2 – Déclarer à votre thème la fonction qui va permettre l’extraction de la première image de l’article…

Editer (ou créer s’il n’existe pas) le fichier functions.php dans le répertoire de votre thème : /wp-content/themes/votre_theme/functions.php pour y ajouter :

/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;
}
?>

Je n’ai pas jugé utile de commenter la fonction php ci-dessus. En effet elle va simplement « lire » le billet concerné et trouver la première image qui le compose par simple détection de la première balise HTML :

Quand la fonction catch_that_image(); sera appelée (dans le fichier ci-dessous), elle ne fera que remonter le contenu de l’attribut « src » de la balise HTML « img » ; autrement dit l’adresse/url de l’image.

A noter que c’est le fichier image default.jpg qui sera chargé dans le cas où il n’y aurait pas d’image dans le billet concerné. Pensez donc bien à mettre un fichier default.jpg dans le répertoire images de votre thème. Si l’emplacement, le nom ou l’extension du fichier ne vous conviennent pas, vous pouvez toujours modifier la variable $first_img de la fonction.

3 – Modification de la page d’accueil (index.php) pour récupérer les premières images et générer les miniatures

timthumb

Voici à quoi ressemble mon fichier de thème index.php situé dans le répertoire de thème /wp-content/theme/votre_theme/index.php


		 

A noter que j’ai volontairement retiré tous les balisages de mise en forme qui sont assez peu pertinents dans le présent tutorial : juste l’essentiel.

J’affiche volontairement une bonne partie du code afin de vous montrer de quelle manière je compte ($count) les billets afin d’avoir un rendu différent pour mon article le plus récent et pour les 8 qui suivent. En réalité, pour la stricte génération des miniatures, seule la ligne suivante nous intéresse…

Dans l’état actuel des choses, les 8 miniatures générées sur ma page d’accueil mesurent donc 172 pixels de hauteur (h=172 ci-dessus) et 250 pixels de largeur (w=250 ci-dessus). L’argument zc=1 permet justement de recadrer l’image dans le cas où elle ne puisse se redimensionner aux valeurs indiquées sans déformation. L’attribut q n’est pas utilisé, je conserve sa valeur par défaut, à savoir une compression .jpg à 75%.

4 – Mise en cache des miniatures pour un chargement plus rapide (facultatif)

coda chmod

Le script timthumb.php utilisé plus haut permet de conserver (mettre en cache) les miniatures qu’il génère dans un répertoire. Ce répertoire doit s’appeler cache et se situer au même niveau que le fichier timthumb.php. Vous devez bien sûr mettre les droits nécessaires en écriture sur ce répertoire « cache » : CHMOD. Pour déplacer le répertoire cache, vous pouvez éditer la ligne 68 (environ) du fichier timbthumb.php :

$cache_dir = './cache';

Informations complémentaires…

Bien que je déteste utiliser des plugins, les personnes moins « expérimentées » pourront obtenir un résultat relativement proche par le biais du plugin Image Extractor développé par Michele Gobbi. A noter que ce plugin permet uniquement de récupérer la première image d’un billet et non de générer une miniature, etc… Bref c’est l’alternative à-la-rache par rapport à la solution exposée ci-dessus. Si vous avez des remarques (précisions, correction, etc) ou besoin d’aide, le système de commentaires est fait pour vous… :nickel:

  1. Merci Night pour cet excellent article ;-)

  2. Très bel article, j’adore, mais le seul « souci » c’est que je ne gère absolument pas le script de mon blog ! Et heureusement, sinon quel beau bordel ce serait, il ne fonctionnerait pas ! :lol:

    Non, mais par contre il est géré par un pro qui maîtrise grave ^^ Donc je verrais ça avec lui lors du changement de design de mon blog :D

  3. Et béh, merci m’sieur :-) C’est vrai que ton index est vraiment chouette (comme le reste:)

  4. @Jerome : D’ailleurs en parlant de ça, il va falloir qu’on lui fasse un petit refresh à ce design comme tu as reçu ta 370Z :razz:


    @Jerry : J’te refais le même pour pas trop cher parce que j’suis grand prince ! On va s’arranger, t’as juste à me présenter Mademoiselle 3787568279_8551e20262.jpg et je m’occupe du reste ; de tout le reste ! :lol:

  5. Bonjour, je trouve cette astuce génial pour les billets, mais y’a t’il moyen de faire la même chose avec la première photo d’une page générée par nextgen par exemlpe. Merci et bravo pour tout.

    J’aimerais faire un site photo avec wordpress.

  6. @kyastef : Cette méthode n’est utile que pour récupérer la première image d’un billet. Lorsque le cas devient un peu plus complexe, j’utilise les Custom Fields (Champs personnalisés). Sous ta zone d’édition tu nommes un champ personnalisé « test » par exemple et à côté (comme valeur) tu mets l’adresse de l’image que tu souhaites lui associer. Tu pourras assigner une valeur (donc une adresse) différente à ce champ dans chaque billet. Il est bien sûr possible d’avoir plusieurs champs personnalisés par billet. Après le tout sera d’appeler ce champ dans ton fichier de thème. Que penses-tu de ce principe ?

  7. faudra que je teste, merci pour la réponse

  8. bonjour,

    superbe article, très clair et très pédagogique … bravo.

    dans mon cas, après avoir respecté scrupuleusement chaque étape, j’ai une erreur :
    Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

    sur cette ligne :

    $output = preg_match_all(‘//i’, $post->post_content, $matches);

    merci d’avance pour votre aide :)

  9. suite ;)

    à priori l’erreur disparait avec ce code :

    $output = preg_match_all('//i', $post->post_content, $matches);

    mais les images n’apparaissent pas dans la boucle :/

  10. ni avec :
    $output = preg_match_all('//i', $post->post_content, $matches);

  11. @fred G : La ligne de code qui était donnée dans l’article était mauvaise ! WordPress avait du interpréter une partie de mon code ou je ne sais pas quoi :evil: Bref, je viens de modifier l’article pour procéder à la rectification. Merci beaucoup de me l’avoir signalé et voici la nouvelle ligne :

    $output = preg_match_all('//i', $post->post_content, $matches);

  12. Hello msieur !
    Merci beaucoup pour ce tuto tres interessant…
    Mais pour les galeriens qui ont le meme souci que moi, j’ai trouve la solution apres beaucoup de galere.
    En effet la miniature ne s’affichait que pour l image par defaut.
    il faut en effet enlever un tout petit slash dans le code d’appel de l image car sinon il met deux slashs dans l’URL au lieu d’1.
    sur ma version de WP cela empechait le fonctionnement sur les URL Globales mais pas locales (ce qui explique que les miniatures par defaut s’affichent correctement et pas les autres)

    Mauvais code :
    src=/&h=172&w=250&zc=1″>

    Bon code
    src=&h=150&w=150&zc=1″>

  13. Merci beaucoup cela va m’être fort utile !!!!!
    Même remarque que JohnNada la petit / est en trop.
    bonne continuation, je regarde les autres tutos !!!!

  14. Salut !

    J’ai optimisé un poil la fonction catch_that_image et ça donne :

    function catch_that_image() {
    $first_img =  »;
    ob_start();
    ob_end_clean();
    if ($output = preg_match_all(‘//i’, get_the_content(), $matches))
    $first_img = $matches[1][0];
    else
    $first_img = « /images/default.jpg »;
    return $first_img;
    }

    J’obtenais autrement une erreur si pas d’image dans le content….

  15. Salut a tous !
    Tout d’abord, merci pour ce tuto, c’est exactement ce que je cherchais pour mon site :eek2:

    Une petite question :
    « Prenons les devants en indiquant dès maintenant que ce script va vous permettre (après édition du fichier functions.php) d’utiliser la fonction de génération des miniatures :
     »
    Je n’ai pas compris cette partie, j’en fais quoi de l’appel de la fonction ?

    Par ailleurs, mon apache me renvoie une erreur ligne 560 du script timthumb.php (Warning PHP : Parse error [...] Unable to parse URL)

    Si quelqu’un a une idée de l’origine du problème, je suis preneur !
    Pour l’instant, les images ne s’affichent pas :cry:

Laisser un commentaire