Alterar nome do arquivo do anexo


11

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

Obrigado! Dennis

Respostas:


22

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

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

}

1
muito explicado precisamente :)
booota

uhm, eu recebo este rename (): http invólucro não suporta renomeação
Bakaburg

Há um erro de digitação aqui. A função deve ser chamada rename_attachment.
Avishai

Penso que, para maior clareza, é melhor se você nomear $ post_ID como $ attach_ID ou algo semelhante, porque pode ser confundido com o ID da postagem pai, enquanto deve ser o ID do anexo. Bom anwser :)
Armando

Observe que isso não altera o guia de anexo, portanto, o código que depende do guia para obter a fonte da imagem, por exemplo, não funcionará. Embora, de um modo geral, você não deva alterar um pós-guia, nessa situação pode ser aconselhável atualizar o guia também.
Armando

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 é interrompido para trabalhos de salvamento automático, executados automaticamente pelo wordpress ou se os tipos de arquivo ou mime alvo não forem atendidos.

Guloseimas

Você pode definir o nome do arquivo, os tipos de arquivo e os tipos MIME que deseja alterar dentro da função antes do foreachloop. O arquivo obtém o ID da postagem e o ID do anexo anexado, para que você possa fazer upload 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 de plug-in na parte superior, enviá-lo para a pasta de plug-ins e ativar.


obrigado pela resposta detalhada, executei o código e ele parecia ser executado, mas não tenho certeza se ele mudou alguma coisa. Ele deve alterar o post_name ou o guid do objeto de anexo?
Robert Sinclair

3

Eu usaria PHP renamee o caminho para o arquivo fornecido 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 extrema precaução ao trabalhar com arquivos. Provavelmente precisa mudar para funcionar, mas pode ser um bom ponto de partida. Espero que isto ajude.

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


1
Isso quebra o link do WordPress para o arquivo, pois o WordPress não entende que uma renomeação aconteceu.
Annika Backstrom

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.