web-dev-qa-db-fra.com

Renommer des fichiers pendant le téléchargement en utilisant des variables

Je voudrais renommer les fichiers pendant le téléchargement et définir leur nom sur le message auquel ils sont attachés, ainsi que des caractères aléatoires (un simple compteur incrémentiel sera tout à fait correct) pour rendre les noms de fichiers différents.

En d'autres termes, si je télécharge/joint des images à l'article dont le slug est "test-page-slug", j'aimerais que les images soient renommées à la volée en test-page-slug-[C].[extension]:

  • test-page-slug-1.jpg
  • test-page-slug-2.jpg
  • etc, peu importe le nom de fichier d'origine.

Il y a ce plugin, Custom Upload Dir :

Avec ce plugin, vous pouvez construire des chemins à partir de variables supplémentaires telles que: titre du post, ID, catégorie, auteur du post, date du post et bien plus encore.

Comment puis-je faire la même chose avec les noms de fichiers?

7
pereyra

Vous voudrez vous connecter au filtre wp_handle_upload_prefilter (sur lequel je ne trouve aucune documentation, mais qui semble assez simple). J'ai essayé ceci localement, et cela semble fonctionner pour moi:

function wpsx_5505_modify_uploaded_file_names($arr) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST['post_id']) ) {
        $post_id = $_REQUEST['post_id'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they're probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post slug
        $post_obj = get_post($post_id); 
        $post_slug = $post_obj->post_name;

        // If we found a slug
        if($post_slug) {

            $random_number = Rand(10000,99999);
            $arr['name'] = $post_slug . '-' . $random_number . '.jpg';

        }

    }

    return $arr;

}
add_filter('wp_handle_upload_prefilter', 'wpsx_5505_modify_uploaded_file_names', 1, 1);

Lors de mes tests, il semble que les publications ne contiennent un slug que si vous avez de jolis permaliens activés. J'ai donc ajouté une vérification pour m'assurer qu'il y a un slug avant de renommer le fichier. Vous voudrez peut-être aussi vérifier le type de fichier, ce que je n’ai pas fait ici. Je suppose que c’est un jpg.

MODIFIER

Comme demandé dans le commentaire, cette fonction supplémentaire modifie certains des attributs de méta pour l'image téléchargée. Cela ne semble toutefois pas vous permettre de définir le texte ALT, et pour une raison quelconque, la valeur que vous définissez comme "légende" est en réalité attribuée à la description. Vous devrez singe avec elle. J'ai trouvé ce filtre dans la fonction wp_read_image_metadata (), située dans wp-admin/includes/image.php. C'est ce sur quoi s'appuient les fonctions de téléchargement de média et wp_generate_attachment_metadata pour extraire les métadonnées de l'image. Vous pouvez y jeter un coup d'œil si vous voulez plus de perspicacité.

function wpsx_5505_modify_uploaded_file_meta($meta, $file, $sourceImageType) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST['post_id']) ) {
        $post_id = $_REQUEST['post_id'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they're probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post title
        $post_title = get_the_title($post_id);

        // If we found a title
        if($post_title) {

            $meta['title'] = $post_title;
            $meta['caption'] = $post_title;

        }

    }

    return $meta;

}
add_filter('wp_read_image_metadata', 'wpsx_5505_modify_uploaded_file_meta', 1, 3);

Édité le 04/04/2012 pour extraire l'ID de publication de l'objet REQUEST au lieu de vérifier successivement les opérations GET et POST. Basé sur des suggestions dans les commentaires.

9
MathSmath