Changer le nom du fichier joint

11

Existe-t-il une fonction qui me permet de modifier le nom de fichier d'une pièce jointe, en fonction de l'ID de pièce jointe que j'ai?

Merci! Dennis

FLX
la source

Réponses:

22

Cela vous permettra de renommer une pièce jointe dès qu'elle sera téléchargée:

add_action('add_attachment', 'rename_attachment');
function rename_attachment($post_ID){

    $file = get_attached_file($post_ID);
    $path = pathinfo($file);
        //dirname   = File Path
        //basename  = Filename.Extension
        //extension = Extension
        //filename  = Filename

    $newfilename = "NEW FILE NAME HERE";
    $newfile = $path['dirname']."/".$newfilename.".".$path['extension'];

    rename($file, $newfile);    
    update_attached_file( $post_ID, $newfile );

}
Ijaas
la source
1
très précisément expliqué :)
booota
euh, j'obtiens ce rename (): le wrapper http ne prend pas en charge le renommage
Bakaburg
Il y a une faute de frappe ici. La fonction doit être appelée rename_attachment.
Avishai
Je pense que pour plus de clarté, c'est mieux si vous nommez $ post_ID en tant que $ attach_ID ou quelque chose de similaire, car il pourrait être confondu avec l'ID de publication parent, alors qu'il est censé être l'ID de pièce jointe. Bonne réponse :)
Armando
Veuillez noter que cela ne change pas le guide des pièces jointes, donc le code s'appuyant sur le guide pour obtenir la source d'image par exemple ne fonctionnera pas. Bien que, de manière générale, vous ne devriez pas modifier un guide de publication, dans cette situation, il peut être judicieux de mettre à jour le guide également.
Armando
4

Cas d'utilisation

La fonction fonctionne pour

  • Ajout de fichiers
  • Mise à jour des fichiers (oui, également pour les fichiers déjà présents)
  • Fichiers multiples

Cas de non-utilisation

Il s'interrompt pour les travaux d'enregistrement automatique, effectués par wordpress automatiquement ou si les types de fichiers ou mimes ciblés ne sont pas respectés.

Des goodies

Vous pouvez définir le nom de fichier, les types de fichiers et les types MIME que vous souhaitez modifier à l'intérieur de la fonction avant la foreachboucle. Le fichier obtient l'ID de publication, puis l'ID de pièce jointe en annexe, afin que vous puissiez télécharger et modifier en toute sécurité plusieurs fichiers à la fois. Cela se soucie également de la commande des fichiers par (premier) ID de publication et (deuxième) ID de pièce jointe.

function wpse30313_update_attachment_names($post_ID)
{
    // Abort if WP does an autosave 
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
        return;

    # >>>> SET
        // New file name:
        $new_file_name = "___";

        // Best would be to take the post name as file name instead of a custom title:
        # $post_data = get_post( $post_ID );
        # $new_file_name = $post_data->post_name;

        // The file types we want be changed:
        $allowed_types = array(
            'image'
        );

        // The mime types we want to be changed:
        $allowed_ext = array(
             'jpg'
            ,'jpeg'
            ,'gif'
            ,'png'
        );
    # <<<< SET

    // Appended by post ID for collision safety
    $new_file_name = "{$new_file_name}-{$post_ID}";

    // get all attached files
    $attachments = get_children( array( 
         'post_type'    => 'attachment'
        ,'post_parent'  => $post_ID
    ) );

    // Bulk updating attached file names
    foreach ( $attachments as $att )
    {
        $att_ID     = $att->ID;
        // Append attachment ID (collision safety)
        // Also allows sorting files by post & then attchment ID
        $new_name   = "{$new_file_name}-{$att_ID}";

        $mime_type  = explode( "/", get_post_mime_type( $att->ID ) );
        $file_type  = $mime_type[0];
        $mime_type  = $mime_type[1];

        // Skip file types we don't want to change
        if ( ! in_array( $file_type, $allowed_types ) )
            continue;
        // Skip mime types we don't want to change
        if ( ! in_array( $mime_type, $allowed_ext ) )
            continue;

        // Get current file info
        $file_path = get_attached_file( $att->ID );
        $path   = pathinfo( $file_path );
        $dir    = trailingslashit( $path['dirname'] );
        $ext    = $path['extension'];

        // Build final name
        $final  = "{$dir}{$new_name}.{$ext}";

        // Skip if the path was already changed on upload
        // If we don't set this, the function wouldn't work for older files
        if ( $file_path == $final )
            continue;

        // Update attachment-post meta info for file
        rename( $file_path, $final );
        update_attached_file( $att_ID, $final );
    }

    return;
}
add_action( 'add_attachment', 'wpse30313_update_attachment_names' );
add_action( 'edit_attachment', 'wpse30313_update_attachment_names' );

La fonction doit être ajoutée à votre fichier functions.php ou (mieux) en tant que petit plugin séparé. Ajoutez simplement un commentaire de plugin en haut, téléchargez-le dans le dossier des plugins et activez.

kaiser
la source
merci pour la réponse détaillée, j'ai exécuté le code et il a semblé s'exécuter, mais je ne sais pas si cela a changé quoi que ce soit. Doit-il changer le post_name ou le guid de l'objet attaché?
Robert Sinclair
3

J'utiliserais PHP renameet le chemin d'accès au fichier donné par get_attached_file.

function rename_file( $post_id, $newname ) {
    $file = get_attached_file( $post_id );
    rename($file,dirname($file).$newname)
}

REMARQUE: cela n'a pas été testé et vous devez être extrêmement prudent lorsque vous travaillez avec des fichiers. Il a probablement besoin d'être modifié pour que cela fonctionne, mais peut être un bon point de départ. J'espère que cela t'aides.

Faites-moi savoir si cela aide et je changerai le code en code de travail réel.

Naoise Golden
la source
1
Cela rompt le lien de WordPress vers le fichier, car WordPress ne comprendra pas qu'un changement de nom s'est produit.
Annika Backstrom
3
add_action('add_attachment', 'rename');
function rename($post_ID){

    $post = get_post($post_ID);
    $file = get_attached_file($post_ID);
    $path = pathinfo($file);
    $newfilename = "mynewfilename";
    $newfile = $path['dirname']."/".$newfilename.".".$path['extension'];

    rename($file, $newfile);    
    update_attached_file( $post_ID, $newfile );

}

Référence http://codex.wordpress.org/Function_Reference/update_attached_file http://wordpress.org/tags/add_attachment

Mohit Bumb
la source