Alterar nome do arquivo do anexo

9

Existe uma função que me permite alterar o nome do arquivo de um anexo, com base no ID de anexo que tenho?

Obrigado! Dennis

    
por FLX 05.10.2011 / 10:50

4 respostas

20

Isso permitirá que você renomeie um anexo assim que ele for enviado:

add_action('add_attachment', 'rename_attacment');
function rename_attacment($post_ID){

    $post = get_post($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 );

}
    
por Ijaas 11.10.2011 / 06:35
4

Casos de Uso

A função funciona para

  • Adicionando arquivos
  • Atualizando arquivos (sim, também para arquivos que já estão presentes)
  • Vários arquivos

Casos sem uso

Ele aborta para trabalhos de salvamento automático, executados pelo wordpress automaticamente ou se os tipos de arquivos de destino ou tipos mime não forem atendidos.

Guloseimas

Você pode definir o nome do arquivo, os tipos de arquivo & tipos mime que você deseja alterar dentro do função antes do loop foreach . O arquivo obtém o ID do post e, em seguida, o ID do anexo anexado, para que você possa carregar e alterar com segurança vários arquivos por vez. Isso também se preocupa em solicitar os arquivos por (primeiro) ID de postagem e (segundo) ID de anexo.

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

A função deve ser adicionada ao seu arquivo functions.php ou (melhor) como um pequeno plugin separado. Basta adicionar um comentário no plug-in, enviá-lo para a pasta de plug-ins e ativar.

    
por kaiser 17.10.2011 / 14:16
3

Eu usaria o rename do PHP e o caminho para o arquivo dado por get_attached_file .

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

Observe que isso não foi testado e você deve tomar precauções extremas ao trabalhar com arquivos. Provavelmente precisa mudar para que funcione, mas pode ser um bom ponto de partida. Espero que isso ajude.

Deixe-me saber se isso ajuda e alterarei o código para o código de trabalho real.

    
por Naoise Golden 10.10.2011 / 17:12
3
add_action('add_attachment', 'rename');
function rename($post_ID){

    $post = get_post($post_ID);
    $file = get_attached_file($post_ID);
    $path = pathinfo($file);
    $newfilename = "mynewfilename";
    $newfile = $path['dirname']."/".$newfilename.".".$path['extension'];

    rename($file, $newfile);    
    update_attached_file( $post_ID, $newfile );

}

Referência enlace enlace

    
por Mohit Bumb 15.10.2011 / 11:14