Cambiar el nombre de archivo de un adjunto

5 oct 2011, 11:50:51
Vistas: 15.9K
Votos: 12

¿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

0
Todas las respuestas a la pregunta 4
6
25

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

}
11 oct 2011 07:35:38
Comentarios

explicado con mucha precisión :)

Assad Nazar Assad Nazar
11 oct 2011 08:01:40

uhm, me sale este rename(): el wrapper http no soporta renombrado

Bakaburg Bakaburg
6 sept 2013 00:51:38

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

Avishai Avishai
18 dic 2016 00:41:39

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

Way Too Simple Way Too Simple
17 may 2019 17:50:26

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.

Way Too Simple Way Too Simple
17 may 2019 22:10:14

Asegúrate también de ejecutar wp_generate_attachment_metadata() después para que todas las miniaturas se regeneren correctamente.

KittMedia KittMedia
13 abr 2022 16:09:20
Mostrar los 1 comentarios restantes
1

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.

17 oct 2011 15:16:37
Comentarios

gracias por la respuesta detallada, ejecuté el código y pareció ejecutarse, pero no estoy seguro de si cambió algo. ¿Debería cambiar el post_name o el guid del objeto adjunto?

Robert Sinclair Robert Sinclair
1 feb 2017 06:54:57
1

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.

10 oct 2011 18:12:52
Comentarios

Esto rompe el enlace de WordPress al archivo, ya que WordPress no entenderá que ha ocurrido un cambio de nombre.

User User
17 oct 2011 16:04:06
1
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

15 oct 2011 12:14:25
Comentarios

Esto rompe las miniaturas de vista previa en el panel de control de WordPress.

Drew Baker Drew Baker
23 nov 2020 18:22:04