O que acontece durante o upload de um arquivo de mídia?
Quando fazemos upload de um arquivo de mídia o WordPress faz um sanitize do arquivo.
Sanitize = higienizar.
Em outras palavras: todo arquivo, antes de ir para a biblioteca, passa por filtros. Ou seja, o arquivo entra de um jeito e sai de outro jeito. E o WordPress pode ou não, por padrão, renomear o arquivo que é enviado para a biblioteca.
Quando o WordPress renomeia o arquivo de mídia?
- Se o nome do arquivo possui caracteres especiais, eles são apagados;
- Qualquer ocorrência de espaço vazio ou traços consecutivos é substituída por um único traço;
- Qualquer ocorrência de ponto, underline ou traço, que esteja no final ou no começo do arquivo, é apagada.
Caracteres especiais em questão:
? [ ] / \\ = < > : ; , ' " \ & $ # * ( ) | ~ ` ! { } % +
E a propósito, é possível definir quais serão os caracteres especiais, utilizando o filtro: sanitize_file_name_chars.
Exemplo de higienização/sanitize de arquivo
Veja o exemplo abaixo e note, na prática, como o WordPress “higieniza” os arquivos de mídia:
Customizando o processo de higienização/sanitize de arquivo
Depois dessa instrodução, vejamos, então, como renomear os arquivos de mídia automaticamente, mas de forma customizada.
Perceba, através da imagem acima, que a higienização padrão mantém maiúsculas e acentos.
O trecho de código abaixo faz tudo o que a higienização padrão faz e ainda remove maiúsculas e acentos. Você pode colocar o código no arquivo functions.php.
<?php
/**
* Rename file name while doing upload.
*
* @param string $filename The name of the file being uploaded
*
* @return string The sanitized string
*/
function my_custom_file_name( $filename ) {
$info = pathinfo( $filename );
$ext = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
$name = basename( $filename, $ext );
if ( isset( $_REQUEST['post_id'] ) && is_numeric( $_REQUEST['post_id'] ) ) {
$postObj = get_post( $_REQUEST['post_id'] );
$postSlug = sanitize_title( $postObj->post_title );
}
if ( isset( $postSlug ) && ! empty( $postSlug ) && $postSlug != 'rascunho-automatico' ) {
$finalFileName = $postSlug;
} // File name will be the same as the post slug.
else {
$finalFileName = sanitize_title( $name );
} // File name will be the same as the image file name, but sanitized.
return $finalFileName . $ext;
}
add_filter( 'sanitize_file_name', 'my_custom_file_name', 100 );
Utilizando o código acima, o resultado da higienização seria o seguinte:
Além disso, utilizando o snippet acima, o nome do arquivo de mídia será igual ao nome do slug de seu post pai. MAS, NOTE:
- O upload do arquivo de mídia deve ser feito dentro do próprio post (página, post ou qualquer outro tipo personalizado);
- Caso o upload do arquivo seja feito através da biblioteca do WordPress, então, apenas acontecerá a higienização;
- Além disso, para que o arquivo seja renomeado com o nome do slug do post, é necessário que o título do post não esteja vazio.
Caso NÃO queira que seus arquivos de mídia tenham o mesmo nome que o slug do post, mas ainda queira fazer a higienização completa/personalizada (removendo acentos e maiúsculas), basta utilizar o código abaixo:
/**
* Rename file name while doing upload.
*
* @param string $filename The name of the file being uploaded
*
* @return string The sanitized string
*/
function my_custom_file_name( $filename ) {
$info = pathinfo( $filename );
$ext = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
$name = basename( $filename, $ext );
$finalFileName = sanitize_title( $name ); // File name will be the same as the image file name, but sanitized.
return $finalFileName . $ext;
}
add_filter( 'sanitize_file_name', 'my_custom_file_name', 100 );
Lembre-se, esses códigos podem ser utilizados dentro do arquivo functions.php.
Por que higienizar os arquivos de mídia?
- Primeiro, porque é fácil e é automático;
- Mantém os nomes de seus arquivos (que provavelmente são em sua maioria imagens) muito mais organizados;
- Ajuda com fatores relacionados a SEO;
- Te livra de problemas com futuras migrações entre servidores diferentes.