Cambia il nome file dell'allegato


11

Esiste una funzione che mi consente di modificare il nome file di un allegato, in base all'ID allegato che ho?

Grazie! Dennis

Risposte:


22

Ciò ti consentirà di rinominare un allegato non appena caricato:

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 );

}

1
spiegato con precisione :)
booota,

uhm, ottengo questo nome (): il wrapper http non supporta la ridenominazione
Bakaburg

C'è un errore di battitura qui. La funzione dovrebbe essere chiamata rename_attachment.
Avishai,

Penso che per chiarezza sia meglio se si denomina $ post_ID come $ attach_ID o qualcosa di simile, perché potrebbe essere confuso con l'ID del post principale, mentre deve essere l'ID dell'allegato. Buona risposta :)
Armando

Si noti che ciò non modifica la guida degli allegati, quindi il codice che si basa sulla guida per ottenere la sorgente dell'immagine, ad esempio, non funzionerà. Sebbene in generale non si debba cambiare un post guid, in questa situazione potrebbe essere saggio aggiornare anche il guid.
Armando

4

Casi d'uso

La funzione funziona per

  • Aggiunta di file
  • Aggiornamento dei file (sì, anche per i file già presenti)
  • Più file

Casi inutili

Si interrompe per i lavori di salvataggio automatico, eseguiti da wordpress automagicamente o se i tipi di file target o mime non sono soddisfatti.

Gli extra

È possibile impostare il nome del file, i tipi di file e i tipi mime che si desidera modificare all'interno della funzione prima del foreachciclo. Il file ottiene l'ID post e quindi l'ID allegato aggiunto, in modo da poter caricare e modificare in sicurezza più file contemporaneamente. Questo si preoccupa anche di ordinare i file per (primo) ID post e (secondo) ID allegato.

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 funzione dovrebbe essere aggiunta al tuo file Functions.php o (meglio) come un piccolo plugin separato. Basta aggiungere un commento del plugin in alto, caricarlo nella cartella dei plugin e attivare.


grazie per la risposta dettagliata, ho eseguito il codice e sembrava eseguirlo, ma non sono sicuro che abbia cambiato qualcosa. Dovrebbe cambiare il post_name o guid dell'oggetto allegato?
Robert Sinclair,

3

Vorrei usare PHP renamee il percorso del file fornito da get_attached_file.

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

NOTA che questo non è stato testato e dovresti prendere estrema precauzione quando lavori con i file. Probabilmente ha bisogno di modifiche per funzionare, ma potrebbe essere un buon punto di partenza. Spero che questo ti aiuti.

Fammi sapere se aiuta e cambierò il codice con il vero codice di lavoro.


1
Ciò interrompe il collegamento di WordPress al file, dal momento che WordPress non capirà che si è verificata una ridenominazione.
Annika Backstrom,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.