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”:
27 Commentaires
Encore une très bonne astuce de ta part !
Ca va me servir dans peu de temps je pense :)
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?
Merci ! Si ça sert, je suis content, c’est là pour ça ;)
Bonjour,
J’ai essayé sur mon site,
résultat : plantage!!!
Pour info, j’utilise le thème Calotropis.
:(
@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
J’ai remplacé && par && et
tout va bien
:)
Vraiment interessant cette astuce, moi qui utilise souvent les medias, je vais me regaler.
Merci encore
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.
@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 ;)
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
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
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)
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 !
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
@ragecomic: C’est quoi un titre d’image ?
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).
Ok j’ai compris mais c’est moins évident. Je me note ça et je regarde, mais pas demain j’ai piscine.
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’] ); }
Merci Gérard !
@Julio Potier
Il me semblait bien que je prenais un raccourci :-)
Merci pour votre réponse.
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 :)
Le taf est prio :p
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?
Euh oui evidemment.
je prefere demander lol, bon je vais le tester pour le champ alt
encore merci
http://core.trac.wordpress.org/changeset/22927 bug réglé ? ^^
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?