Modificare il nome del file di un allegato
Esiste una funzione che mi permette di modificare il nome del file di un allegato, basandomi sull'ID dell'allegato che ho?
Grazie! Dennis

Questo ti permetterà di rinominare un allegato non appena viene caricato:
add_action('add_attachment', 'rename_attachment');
function rename_attachment($post_ID){
$file = get_attached_file($post_ID);
$path = pathinfo($file);
//dirname = Percorso del file
//basename = NomeFile.Estensione
//extension = Estensione
//filename = Nome file
$newfilename = "NUOVO NOME FILE QUI";
$newfile = $path['dirname']."/".$newfilename.".".$path['extension'];
rename($file, $newfile);
update_attached_file( $post_ID, $newfile );
}

uhm, ricevo questo errore da rename(): il wrapper http non supporta il rinominare

C'è un errore di battitura qui. La funzione dovrebbe chiamarsi rename_attachment
.

Penso che per chiarezza sia meglio se chiami $post_ID come $attach_ID o qualcosa di simile, perché potrebbe essere confuso con l'ID del post genitore, mentre è pensato per essere l'ID dell'allegato. Buona risposta :)

Nota che questo non cambia il guid dell'allegato, quindi il codice che si basa sul guid per ottenere la sorgente dell'immagine ad esempio non funzionerà. Sebbene in generale non dovresti cambiare il guid di un post, in questa situazione potrebbe essere saggio aggiornare anche il guid.

Casi d'Uso
La funzione è utile per:
- Aggiungere file
- Aggiornare file (sì, anche per file già presenti)
- Gestire più file contemporaneamente
Casi in cui Non Funziona
Interrompe l'operazione per i salvataggi automatici eseguiti automaticamente da WordPress o se i tipi di file o i mime type specificati non corrispondono.Funzionalità Aggiuntive
Puoi impostare il nome del file, i tipi di file e i mime type che desideri modificare all'interno della funzione prima del ciclo foreach
. Il file otterrà l'ID del post e poi l'ID dell'allegato aggiunti, così puoi caricare e modificare più file in sicurezza. Questo sistema si occupa anche di ordinare i file prima per ID del post e poi per ID dell'allegato.
function wpse30313_update_attachment_names($post_ID)
{
// Interrompe se WordPress sta eseguendo un salvataggio automatico
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return;
# >>>> IMPOSTAZIONI
// Nuovo nome del file:
$new_file_name = "___";
// Sarebbe meglio usare il nome del post come nome del file invece di un titolo personalizzato:
# $post_data = get_post( $post_ID );
# $new_file_name = $post_data->post_name;
// Tipi di file che vogliamo modificare:
$allowed_types = array(
'image'
);
// Mime type che vogliamo modificare:
$allowed_ext = array(
'jpg'
,'jpeg'
,'gif'
,'png'
);
# <<<< IMPOSTAZIONI
// Aggiunge l'ID del post per evitare conflitti
$new_file_name = "{$new_file_name}-{$post_ID}";
// Ottiene tutti gli allegati
$attachments = get_children( array(
'post_type' => 'attachment'
,'post_parent' => $post_ID
) );
// Aggiornamento massivo dei nomi dei file allegati
foreach ( $attachments as $att )
{
$att_ID = $att->ID;
// Aggiunge l'ID dell'allegato (per evitare conflitti)
// Permette anche di ordinare i file prima per post e poi per ID allegato
$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];
// Salta i tipi di file che non vogliamo modificare
if ( ! in_array( $file_type, $allowed_types ) )
continue;
// Salta i mime type che non vogliamo modificare
if ( ! in_array( $mime_type, $allowed_ext ) )
continue;
// Ottiene le informazioni attuali del file
$file_path = get_attached_file( $att->ID );
$path = pathinfo( $file_path );
$dir = trailingslashit( $path['dirname'] );
$ext = $path['extension'];
// Costruisce il nome finale
$final = "{$dir}{$new_name}.{$ext}";
// Salta se il percorso è già stato modificato durante il caricamento
// Senza questa condizione, la funzione non funzionerebbe per file più vecchi
if ( $file_path == $final )
continue;
// Aggiorna i meta dati dell'allegato per il 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 di plugin all'inizio, caricarlo nella cartella dei plugin e attivarlo.

Userei la funzione PHP rename
e 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 codice non è stato testato e dovresti usare estrema cautela quando lavori con i file. Probabilmente ha bisogno di modifiche per funzionare correttamente, ma può essere un buon punto di partenza. Spero che sia utile.
Fammi sapere se ti è stato d'aiuto e modificherò il codice con la versione effettivamente funzionante.

add_action('add_attachment', 'rinomina');
function rinomina($post_ID){
$post = get_post($post_ID);
$file = get_attached_file($post_ID);
$path = pathinfo($file);
$newfilename = "mionuovonomefile";
$newfile = $path['dirname']."/".$newfilename.".".$path['extension'];
rename($file, $newfile);
update_attached_file( $post_ID, $newfile );
}
Riferimenti http://codex.wordpress.org/Function_Reference/update_attached_file http://wordpress.org/tags/add_attachment
