Cambiar el nombre de archivo de un adjunto
¿Existe alguna función que me permita cambiar el nombre de archivo de un adjunto, basándome en el ID del adjunto que tengo?
¡Gracias! Dennis

Esto te permitirá renombrar un archivo adjunto tan pronto como se suba:
add_action('add_attachment', 'rename_attachment');
function rename_attachment($post_ID){
$file = get_attached_file($post_ID);
$path = pathinfo($file);
//dirname = Ruta del archivo
//basename = NombreArchivo.Extensión
//extension = Extensión
//filename = Nombre del archivo
$newfilename = "NUEVO NOMBRE DE ARCHIVO AQUÍ";
$newfile = $path['dirname']."/".$newfilename.".".$path['extension'];
rename($file, $newfile);
update_attached_file( $post_ID, $newfile );
}

Hay un error tipográfico aquí. La función debería llamarse rename_attachment
.

Creo que para mayor claridad sería mejor nombrar $post_ID como $attach_ID o algo similar, porque podría confundirse con el ID del post padre, cuando en realidad está destinado a ser el ID del adjunto. Buena respuesta :)

Ten en cuenta que esto no cambia el guid del adjunto, por lo que el código que depende del guid para obtener la fuente de la imagen, por ejemplo, no funcionará. Aunque en términos generales no deberías cambiar el guid de un post, en esta situación podría ser prudente actualizar también el guid.

Casos de Uso
La función funciona para
- Agregar archivos
- Actualizar archivos (sí, también para archivos que ya están presentes)
- Múltiples archivos
Casos de No Uso
Se aborta para trabajos de guardado automático, realizados automáticamente por WordPress o si los tipos de archivo o tipos mime objetivo no coinciden.Extras
Puedes establecer el nombre del archivo, los tipos de archivo y los tipos mime que deseas cambiar dentro de la función antes del bucle foreach
. El archivo obtiene el ID de la publicación y luego el ID del adjunto, por lo que puedes subir y cambiar varios archivos de forma segura. Esto también se encarga de ordenar los archivos por (primero) ID de publicación y (segundo) ID de adjunto.
function wpse30313_update_attachment_names($post_ID)
{
// Abortar si WordPress hace un guardado automático
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return;
# >>>> CONFIGURAR
// Nuevo nombre de archivo:
$new_file_name = "___";
// Lo mejor sería tomar el nombre de la publicación como nombre de archivo en lugar de un título personalizado:
# $post_data = get_post( $post_ID );
# $new_file_name = $post_data->post_name;
// Los tipos de archivo que queremos cambiar:
$allowed_types = array(
'image'
);
// Los tipos mime que queremos cambiar:
$allowed_ext = array(
'jpg'
,'jpeg'
,'gif'
,'png'
);
# <<<< CONFIGURAR
// Añadir ID de publicación para evitar colisiones
$new_file_name = "{$new_file_name}-{$post_ID}";
// Obtener todos los archivos adjuntos
$attachments = get_children( array(
'post_type' => 'attachment'
,'post_parent' => $post_ID
) );
// Actualización masiva de nombres de archivos adjuntos
foreach ( $attachments as $att )
{
$att_ID = $att->ID;
// Añadir ID de adjunto (evita colisiones)
// También permite ordenar archivos por publicación y luego por ID de adjunto
$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];
// Saltar tipos de archivo que no queremos cambiar
if ( ! in_array( $file_type, $allowed_types ) )
continue;
// Saltar tipos mime que no queremos cambiar
if ( ! in_array( $mime_type, $allowed_ext ) )
continue;
// Obtener información del archivo actual
$file_path = get_attached_file( $att->ID );
$path = pathinfo( $file_path );
$dir = trailingslashit( $path['dirname'] );
$ext = $path['extension'];
// Construir nombre final
$final = "{$dir}{$new_name}.{$ext}";
// Saltar si la ruta ya fue cambiada al subir
// Si no establecemos esto, la función no funcionaría para archivos antiguos
if ( $file_path == $final )
continue;
// Actualizar metainformación del adjunto para el archivo
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 función debe agregarse a tu archivo functions.php o (mejor) como un pequeño plugin separado. Solo agrega un comentario de plugin en la parte superior, súbelo a la carpeta de plugins y actívalo.

Yo usaría la función rename
de PHP y la ruta del archivo proporcionada por get_attached_file
.
function rename_file( $post_id, $newname ) {
$file = get_attached_file( $post_id );
rename($file,dirname($file).$newname)
}
NOTA: Esto no ha sido probado y debes tener extrema precaución cuando trabajes con archivos. Probablemente necesite cambios para que funcione, pero puede ser un buen punto de partida. Espero que esto ayude.
Déjame saber si te sirve y cambiaré el código al que realmente funcione.

add_action('add_attachment', 'renombrar_archivo');
function renombrar_archivo($post_ID){
$post = get_post($post_ID);
$archivo = get_attached_file($post_ID);
$ruta = pathinfo($archivo);
$nuevo_nombre = "minuevonombredearchivo";
$nuevo_archivo = $ruta['dirname']."/".$nuevo_nombre.".".$ruta['extension'];
rename($archivo, $nuevo_archivo);
update_attached_file($post_ID, $nuevo_archivo);
}
Referencia http://codex.wordpress.org/Function_Reference/update_attached_file http://wordpress.org/tags/add_attachment
