WordPress : Afficher toutes les tailles d’une image à partir de l’url d’origine

En ce moment, je réalise pour l’exercice un thème wordpress qui utilise le plugin Custom Field Suite (CFS) ainsi que le framework NHP Options. Le premier sert à rajouter une série d’images multiples à un post, le second à fournir des options à mon thème, comme par exemple une image par défaut pour les posts qui n’en ont pas. Seulement lorsque je sélectionne une image dans l’un ou l’autre, je n’ai pas forcément accès aux différentes tailles pour cette image, je ne peux qu’insérer l’originale. Voici un moyen de retrouver les différentes tailles d’une image, personnalisées ou par défaut, à partir de son URL.

La méthode habituelle

En principe, lorsque l’on manipule les images sur wordpress, nous disposons de fonctions détaillées dans le codex :

  • wp_get_attachment_image : A utiliser dans la boucle wordpress, prends parmi ses paramètres l’ID du fichier attaché au post courant ainsi que l’identifiant de la taille d’affichage
  • the_post_thumbnail : Affiche l’image à la une d’un post. A utiliser dans la boucle wordpress, prends parmi ses paramètres l’identifiant de la taille d’affichage

Bon, c’est bien beau tout ça, mais ça fonctionne mieux dans une boucle. Et puis le problème c’est aussi que manifestement CFS ne gère pas les images comme des fichiers attachés au post. Tout ce que l’on stocke c’est ‘url de l’image ajoutée et non son ID. Par ailleurs, pour les options du thème, je ne lie pas mon fichier à un post ou une page, mais à… et bien à rien fait !

Les tailles d’image dans wordpress

On a parlé plus haut « d’identifiant de la taille d’image ». Kezako ? Dans wordpress, les tailles sont gérées par association identifiant => couple larger+hauteur. Par défaut :

  • Thumbnail : identifiant ‘thumbnail’, taille par défaut 150px x 150px max
  • Medium : identifiant ‘medium’, taille par défaut 300px x 300px max
  • Large : identifiant ‘large’, taille par défaut 640px x 640px max
  • Original : identifiant ‘full’, taille par défaut originale non modifiée

Ces tailles sont bien, mais si vous voulez optimiser les tailles d’images pour votre thème (responsive, fiche produit, …) vous pouvez avoir envie d’avoir des tailles rien qu’à vous.

Pour ce faire rien de plus simple, utilisez la fonction add_image_size à votre fichier functions.php. Elle prend en paramètre :

  • l’identifiant
  • la largeur
  • la hauteur
  • est-ce qu’on découpe ou non l’image si les proportions ne collent pas

Par exemple : add_image_size( ‘homepage-thumb’, 220, 180, true );

Ok, mais quel rapport avec la choucroute ?

Tout ça pour dire que on peut jouer avec les tailles d’image sans problème dans wordpress. On trouve toujours un moyen d’arriver au but 🙂

Je suis tombé au fil de mes recherches sur une fonction qui permet de retrouver l’id d’une image à partir de son url. Sauf que ça ne m’intéressait pas vraiment, je voulais l’image en elle-même. je l’ai donc enrichie un tout petit peu en lui ajoutant comme paramètre la taille souhaitée, lui faisant retourner l’image associée, et en la rajoutant aux actions wordpress pour un accès simplifié dans mon thème. De cette façon :

function pn_get_attachment_id_from_url( $attachment_url = '', $size) {
	global $wpdb;
	$attachment_id = false;
	// Si pas d'url, on sort.
	if ( '' == $attachment_url )
		return;
	// Obtenir le chemin du répertoire d'upload des médias
	$upload_dir_paths = wp_upload_dir();
	// S'assurer que le chemin du répertoire d'upload est présent dans l'URL, pour vérifier qu'on a bien à faire à la librairie de médias
	if ( false !== strpos( $attachment_url, $upload_dir_paths['baseurl'] ) ) {
		// Si c'est l'URL d'une miniature auto-générée, obtenir l'URL de l'originale
		$attachment_url = preg_replace( '/-d+xd+(?=.(jpg|jpeg|png|gif)$)/i', '', $attachment_url );
		// Enlever le chemin du répertoire d'upload de l'URL
		$attachment_url = str_replace( $upload_dir_paths['baseurl'] . '/', '', $attachment_url );
		// Enfin, faire une query custom dans la base de données pour obtenir l'ID de l'image depuis l'URL modifiée
		$attachment_id = $wpdb->get_var( $wpdb->prepare( "SELECT wposts.ID FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = '_wp_attached_file' AND wpostmeta.meta_value = '%s' AND wposts.post_type = 'attachment'", $attachment_url ) );
	}
 	//Retourner l'image à partir de son id et dans la taille désirée
	return wp_get_attachment_image($attachment_id, $size);
}
//Ajout de cette fonction aux actions wordpress
add_action('getImageSizeFromURL', 'function pn_get_attachment_id_from_url');

Maintenant, dans mon thème, je n’ai plus qu’à appeler l’action getImageSizeFromURL avec en paramètre l’url de mon image, ainsi que la taille désirée. Par exemple :

<?php getImageSizeFromURL($cfs->get('monimage'), 'thumbnail-fichedetail'); ?>
<?php getImageSizeFromURL($NHP_Options->get('monlogo'), 'logo-home'); ?>

Voilà, vous savez tout. Si ce n’est pas clair, si j’ai dit des bêtises ou si vous avez des suggestions, n’hésitez pas à contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *