Cambiar nombre de archivo adjunto

11

¿Existe una función que me permita cambiar el nombre de archivo de un archivo adjunto, en función de la ID de archivo adjunto que tengo?

¡Gracias! Dennis

FLX
fuente

Respuestas:

22

Esto le permitirá cambiar el nombre de un archivo adjunto tan pronto como se cargue:

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
fuente
1
explicado con mucha precisión :)
booota
uhm, obtengo este cambio de nombre (): el contenedor http no admite el cambio de nombre
Bakaburg
Hay un error tipográfico aquí. La función debe ser llamada rename_attachment.
Avishai
Creo que para mayor claridad es mejor si nombra $ post_ID como $ attach_ID o algo similar, porque podría confundirse con el ID de publicación principal, mientras que está destinado a ser el ID de archivo adjunto. Good anwser :)
Armando
Tenga en cuenta que esto no cambia la guía del archivo adjunto, por lo que el código que se basa en la guía para obtener la fuente de la imagen, por ejemplo, no funcionará. Aunque, en términos generales, no debe cambiar una guía de publicación, en esta situación también podría ser conveniente actualizar la guía.
Armando
4

Casos de uso

La función funciona para

  • Agregar archivos
  • Actualización de archivos (sí, también para archivos que ya están presentes)
  • Archivos múltiples

Casos sin uso

Se cancela para trabajos de autoguardado, realizados por WordPress automáticamente o si no se cumplen los tipos de archivo de destino o los tipos MIME.

Golosinas

Puede establecer el nombre del archivo, los tipos de archivo y los tipos MIME que desea cambiar dentro de la función antes del foreachbucle. El archivo obtiene la ID de publicación y luego la ID de archivo adjunto, para que pueda cargar y cambiar múltiples archivos de forma segura a la vez. Esto también se preocupa por ordenar los archivos por (primer) ID de publicación e (segundo) ID de archivo adjunto.

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 función debe agregarse a su archivo functions.php o (mejor) como un pequeño plugin separado. Simplemente agregue un comentario de complemento en la parte superior, cárguelo en la carpeta de complementos y actívelo.

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

Usaría PHP renamey la ruta al archivo dada por get_attached_file.

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

TENGA EN CUENTA que esto no se ha probado y debe tener extrema precaución al trabajar con archivos. Probablemente necesite cambiar para que funcione, pero puede ser un buen punto de partida. Espero que esto ayude.

Avíseme si ayuda y cambiaré el código al código de trabajo real.

Naoise Golden
fuente
1
Esto rompe el enlace de WordPress al archivo, ya que WordPress no entenderá que ha ocurrido un cambio de nombre.
Annika Backstrom