Tout savoir sur WordPress
Tutoriel WordPress

Ajouter automatiquement des valeurs par défaut aux médias

Cette astuce permet d’ajouter des champs personnalisés par défaut lors de l’ajout d’un média (image ou autre).

Dans WordPress quand on upload des médias, les champs n’ont ni description, ni titre etc… Il pourrait être interessant de remplir automatiquement et intelligemment ces informations.

Dans cette astuce, nous allons aborder deux types de fichier : une image et un fichier zip. Ensuite, libre à vous de faire ce que bon vous semble selon le type de fichier que vous envoyez.

Pour commencer, voici un exemple où l’on peut automatiquement fermer les ping et les commentaires, puis modifier le titre du média et ajouter en description le type de fichier :

Copier le code ci-dessous dans le fichier functions.php présent à la racine de votre thème :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


function baw_attachment_fields_to_save( $post ) {
   
    // Récupération dans 2 variables du type de mime et sous type de mime.
    list( $mime_type, $mime_subtype ) = explode( '/', $post['post_mime_type'] );
    
    // Affectation directement dans l'objet $post
    $post['post_content'] = sprintf( '%s (%s)', $mime_type, $mime_subtype );
    $post['post_title'] = $post['post_name'];
    $post['comment_status'] = 'closed';
    $post['ping_status'] = 'closed';
    return $post;
}
add_filter('attachment_fields_to_save', 'baw_attachment_fields_to_save' );

[/pastacode]

C’est tout, il m’a suffit d’utiliser le hook attachment_fields_to_save pour toucher l’objet $post et modifier facilement tout ce que je veux.

Voici 2 exemples qui vont vous permettre d’appréhender les capacités de cette astuce :

Exemple d’utilisation avec une image

Amis photographes, je vais maintenant lire les données EXIF des images uploadées pour les insérer dans la description. Beaucoup de sites de photographies affichent ces informations (ouverture de la lentille, focale, flash ou pas etc), mais certains scripts relisent les données EXIF à chaque affichage des images, ce qui n’est évidemment pas optimisé.

Je vais ajouter une condition sur le type de mime en intégrant le code ci-dessous dans le fichier functions.php présent à la racine de notre thème :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


function baw_attachment_fields_to_save( $post, $attachment ) {
   
    // je crée le chemin sur le serveur du fichier et non pas une URL
    $docpath = str_replace( home_url(), $_SERVER['DOCUMENT_ROOT'], $attachment['url'] );
    
    // Comme au dessus, je liste les mimes
    list( $mime_type, $mime_subtype ) = explode( '/', $post['post_mime_type'] );
    
    // Je crée un contenu vide
    $content = '';
    
    // Si le média est une image de type JPEG
    if( $mime_type == 'image' && $mime_subtype == 'jpeg' ) {
        
        // Je peut modifier son excerpt aussi
	$post['post_excerpt'] = sprintf( 'Image %s (%s)', $post['post_name'], $mime_subtype );
        
        // Je lis les données EXIF du fameux $docpath
	$exif = wp_read_image_metadata( $docpath );
        
        // Si il y en a, pour chaque entrée trouvée je vais l'écrire dans la variable $content,
        // petite exception pour "created_timestamp" que je modifie en "Date" pour faire plus propre.
	if( $exif )
	     foreach( $exif as $key => $value )
	          if( $value )
		        if( $key == 'created_timestamp' )
			     $content .= 'Date: ' . date_i18n( get_option( 'date_format') . ' @ ' . get_option( 'time_format' ), $value ) . "n";
			else
			    $content .= ucwords( $key ) . ': ' . $value . "n";
    }
    
    // Puis je modifie le contenu si il n'est pas déjà renseigné
    $post['post_content'] = $post['post_content']!='' ? $post['post_content'] : $content;
    $post['post_title'] = $post['post_title']!='' ? $post['post_title'] : $post['post_name'];
    
    // Libre à vous de laisser ouvert les commentaires
    $post['comment_status'] = 'closed';
    $post['ping_status'] = 'closed';
    return $post;
}
add_filter('attachment_fields_to_save', 'baw_attachment_fields_to_save', 10, 2 );

[/pastacode]

Petite démo avec une image libre de droit que j’ai trouvé dans mes documents :

Exemple d’utilisation avec une archive ZIP

Dans le cas où vous proposez des téléchargements sur vos pages, pourquoi ne pas afficher le contenu du zip ?

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


function baw_attachment_fields_to_save( $post, $attachment ) {
    
    $docpath = str_replace( home_url(), $_SERVER['DOCUMENT_ROOT'], $attachment['url'] );
    list( $mime_type, $mime_subtype ) = explode( '/', $post['post_mime_type'] );
    $content = '';
    
    if( $mime_subtype == 'zip' ) {
        
        // Je crée un objet ZipArchive
	$za = new ZipArchive();
        
        // J'ouvre mon $docpath
	$za->open( $docpath );
        
        // Je récupère l'information du nombre de fichiers du zip
	$content .= 'Nombre de fichiers : ' . $za->numFiles . "n";
        
        // Pour chaque fichier/dossier trouvé, je le liste par son nom
	for( $i=0; $inumFiles; $i++ ){
		$c = $za->statIndex($i);
                // Libre à vous d'afficher le poids, la date ou autre, la doc est ici :
                // http://php.net/manual/en/ziparchive.statindex.php
		$content .= $c['name']."n";
	}
    }
    $post['post_content'] = $post['post_content']!='' ? $post['post_content'] : $content;
    $post['post_title'] = $post['post_title']!='' ? $post['post_title'] : $post['post_name'];
    $post['comment_status'] = 'closed';
    $post['ping_status'] = 'closed';
    return $post;
}
add_filter('attachment_fields_to_save', 'baw_attachment_fields_to_save', 10, 2 );

[/pastacode]

Démonstration avec le .zip du plugin “Widget Saver”:

Cet article a été mis à jour il y a 4545 jours - Il n'est peut être plus à jour !

Article écrit par Julio P.

Fondateur de SecuPress, l’extension de sécurité WordPress, Julio Potier est un Expert WordPress, un Formateur Expérimenté et un Consultant en Sécurité Web.

Il aime partager ses compétences et ses réflexions sur WordPress, donnant des conférences partout dans le monde.

27 Commentaires

  1. Encore une très bonne astuce de ta part !

    Ca va me servir dans peu de temps je pense :)

  2. Bon ben si j’ai bien compris pour des fichiers style vidéo, je prends l’exemple d’utilisation d’une image et je change tout simplement l’extension?

  3. @Bricout Gérard : vérifie une éventuelle erreur de syntaxe dans ton fichier (là où tu mets tes fonctions).

    @Julio Potier : c’est sympa de partager cela. Je cherchais quelque chose de similaire pour l’upload justement. Merci

  4. Vraiment interessant cette astuce, moi qui utilise souvent les medias, je vais me regaler.
    Merci encore

  5. Je viens de me rendre compte que je n’ai pas mentionné swf.

    Merci pour l’astuce en ce qui concerne les autres médias.

  6. @Ouistity : oui et non il ne suffit pas de changer l’extension, non si tu gardes mon code, oui si tu gères le code pour le contenu de ton média. Les données EXIF ou le contenu du ZIP ne fonctionnent bien sur pas avec un SWF ;)

  7. Salut, il est possible de modifier le champ “alt” de l’image ?
    d’après mes tests il est dans $attachment et vu qu’il n’est pas retourné (contrairement a post), le modifier ne sert à rien

  8. et tant qu’a faire, si tu savais comment faire pour remplir automatiquement le titre de l’article par le titre de l’image qu’on vient d’ajouter, si jamais il n’y a pas déjà de titre

  9. ben le title.
    Ce champ est rempli automatiquement par le nom du fichier, et j’aimerais que ce nom de fichier soit aussi rempli sur le nom de l’article (s’il n’a pas encore de nom)

  10. bon je récapitule.
    Quand j’ouvre la page media, que j’insère une image, le champ “titre” de cette image est rempli automatiquement par le nom du fichier.
    Ce que je souhaite faire, c’est copier ce champ titre vers la ligne juste en dessous “alternate text/text alternatif”.
    Deuxième chose, toujours ce même “nom de fichier”, je souhaite le copier vers le nom du brouillon que je suis en train de créer.
    Si le nom de l’article/brouillon est déjà rempli, bien sur je ne l’efface pas !

  11. pour le premier problème càd remplir automatiquement le champ “alt”, j’ai codé un truc en javascript avec greasemonkey qui rempli automatiquement ce champ, mais c’est pas pratique car faut l’installer sur chaque ordinateur qui a besoin de ça.
    Pour le 2eme truc (modifier le titre du brouillon), j’ai pas encore trouvé de solution

  12. Ha, le titre de l’article, tu me dit titre de l’image …
    Donc si tu article est “Bonjour tout le monde !” ça devient “Bonjour tout le monde ! mon-fichier” ? Et si j’upload un autre fichier, ça écrase ? Je pense (et espère) avoir mal compris (encore).

  13. Ok j’ai compris mais c’est moins évident. Je me note ça et je regarde, mais pas demain j’ai piscine.

  14. Bonjour,
    Si le site est dans un sous-répertoire, ça ne marche pas (le sous répertoire passe à la trappe dans docpath)
    Je propose la modification suivante qui récupère le sous-répertoire :
    // je crée le chemin sur le serveur du fichier et non pas une URL
    $arr = explode(“/” , home_url() , 4 );
    $c = count($arr);
    if ($c > 3) {
    $docpath = str_replace( home_url(), $_SERVER[‘DOCUMENT_ROOT’] . “/” . $arr[$c-1] , $attachment[‘url’] );
    }
    else { $docpath = str_replace( home_url(), $_SERVER[‘DOCUMENT_ROOT’] , $attachment[‘url’] ); }

  15. @Julio Potier

    Il me semblait bien que je prenais un raccourci :-)

    Merci pour votre réponse.

  16. Bon encore une fois, astuce tres interessante, mais je rejoins la demande de ragecomic pour le champ alt car pratique pour le seo.
    Mais je ne sais pas si ca va répondre vraiment à ce que je veux, à tester
    @julio, elle dure lgpts ta piscine :)

  17. heureusement, j’ai mis :)
    mais par contre, cela ne se fait qu’à l’insertion du média dans wordpress et non quand on le ratache à un article?

  18. Très intéressant j’était justement à la recherche d’un code de ce genre.
    par contre comme pour la balise title est-il possible d’automatiser alt et caption avec ce type de code svp? j’ai bien essayé mais sans succès …
    pourriez vous m’aiguiller svp?