Aula: Limpeza Automática de Nomes de Arquivos de Imagem – Substituindo o Clean Image Filenames
Objetivo: Substituir o plugin clean-image-filenames por um MU-Plugin que sanitiza automaticamente os nomes dos arquivos de imagem no momento do upload, removendo acentos, espaços, caracteres especiais e convertendo para minúsculas, gerando URLs amigáveis e SEO-friendly.
Contexto: O plugin original é útil, mas é mais um plugin externo que pode ser substituído por um código simples. Quando usuários enviam arquivos com nomes como “Foto do João (final).jpg”, isso resulta em URLs feias e potencialmente problemáticas. Nosso MU-Plugin corrige isso na hora, transformando para “foto-do-joao-final.jpg”.
Funcionalidades implementadas no nosso MU-Plugin
- Sanitização automática de nomes de arquivos de imagem no upload (também funciona para qualquer arquivo de mídia).
- Remove acentos: ç, ã, é, í, etc. → c, a, e, i.
- Substitui espaços e caracteres especiais por hífen (
-). - Converte tudo para minúsculas.
- Remove múltiplos hífens consecutivos.
- Remove pontos extras (mantém apenas a extensão).
- Preserva a extensão original do arquivo.
- Ação ocorre antes do salvamento no servidor, sem perder o original.
Código do MU-Plugin
Crie a pasta wp-content/mu-plugins/neodoor-clean-filenames/ e dentro dela o arquivo neodoor-clean-filenames.php com o conteúdo abaixo:
<?php
/**
* Plugin Name: Neodoor Clean Image Filenames
* Description: Sanitiza automaticamente nomes de arquivos de imagem no upload: remove acentos, espaços e caracteres especiais.
* Version: 1.0
* Author: Reinaldo (Neodoor.neo)
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Neodoor_Clean_Filenames {
private static $instance = null;
public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
add_filter( 'sanitize_file_name', [ $this, 'clean_filename' ], 10, 1 );
}
/**
* Limpa o nome do arquivo: remove acentos, espaços, caracteres especiais.
* @param string $filename Nome original do arquivo
* @return string Nome sanitizado
*/
public function clean_filename( $filename ) {
// Separa nome e extensão
$ext = pathinfo( $filename, PATHINFO_EXTENSION );
$name = pathinfo( $filename, PATHINFO_FILENAME );
// Remove acentos e caracteres especiais (converte para ASCII)
$name = remove_accents( $name );
// Remove qualquer caractere que não seja letra, número, espaço, hífen ou ponto
$name = preg_replace( '/[^a-zA-Z0-9\s\-\.]/', '', $name );
// Substitui espaços e múltiplos hífens por um único hífen
$name = preg_replace( '/[\s\-]+/', '-', $name );
// Remove hífens no início ou fim
$name = trim( $name, '-' );
// Converte para minúsculas
$name = strtolower( $name );
// Se o nome ficou vazio, usa 'arquivo'
if ( empty( $name ) ) {
$name = 'arquivo';
}
// Reconstrói o nome com a extensão
$clean_filename = $name . ( $ext ? '.' . $ext : '' );
return $clean_filename;
}
}
Neodoor_Clean_Filenames::get_instance();
Como testar na prática
- Após criar o MU-Plugin, acesse Mídia → Adicionar novo.
- Envie um arquivo de imagem com um nome contendo acentos, espaços e caracteres especiais, por exemplo:
Foto do João (final) árvore.jpg. - Após o upload, verifique o nome do arquivo na biblioteca de mídia. Ele deve aparecer como
foto-do-joao-final-arvore.jpg. - Teste também com nomes como
Teste_#123!.png→ deve virarteste-123.png.
Exemplo visual
Antes do upload: "Café da manhã (delicioso!).jpg"
Após o upload: "cafe-da-manha-delicioso.jpg"
Antes: "Imagem nº 001.PNG"
Após: "imagem-n-001.png"
Funcionamento técnico
- O filtro
sanitize_file_nameé aplicado pelo WordPress sempre que um arquivo é enviado para a biblioteca de mídia. - A função
remove_accents()é nativa do WordPress (desde a versão 3.0) e converte caracteres acentuados para seus equivalentes ASCII. - Expressões regulares removem tudo que não é letra, número, espaço, hífen ou ponto.
- Espaços e sequências de hífens são substituídos por um único hífen.
- O nome é convertido para minúsculas, garantindo consistência.
Personalizações possíveis
- Manter maiúsculas: Remova a linha
$name = strtolower( $name );. - Usar sublinhado em vez de hífen: Altere o padrão
preg_replace( '/[\s\-]+/', '-', $name );parapreg_replace( '/[\s\-]+/', '_', $name );. - Adicionar um prefixo ou sufixo: Modifique a linha de reconstrução:
$clean_filename = 'img_' . $name . ( $ext ? '.' . $ext : '' );. - Limitar o tamanho do nome: Adicione
$name = substr( $name, 0, 50 );antes da reconstrução. - Manter apenas letras e números (sem hífen): Use
$name = preg_replace( '/[^a-zA-Z0-9]/', '', $name );e depois junte com ponto.
Plugins que este MU-Plugin substitui
clean-image-filenames(o alvo principal)smart-media-rename(parte da renomeação automática)enable-media-replace(para limpeza de nomes, não para substituição)- Qualquer outro plugin que apenas sanitize nomes de arquivos no upload.
Observações e boas práticas
- Funciona para qualquer arquivo de mídia: Imagens, PDFs, vídeos, etc.
- Não afeta arquivos já existentes: A limpeza só ocorre no momento do upload. Para renomear arquivos antigos, você precisaria de um script adicional (não recomendado, pois quebra links).
- Segurança: A função
remove_accents()e os escapes previnem injeção de código. O nome final ainda passa por outras validações do WordPress. - Compatibilidade com Elementor e outros builders: Perfeito, pois a limpeza ocorre antes de qualquer processamento.
- Cuidado com nomes muito curtos: Se o nome original for apenas caracteres especiais (ex: “#$%”), o plugin cairá no fallback “arquivo”. Isso evita nomes vazios.
Possíveis problemas e soluções
- O nome do arquivo não muda: Verifique se o MU-Plugin está carregado corretamente. Adicione um
error_logno início da funçãoclean_filenamepara depurar. - Acentos não são removidos: O WordPress precisa ter a extensão PHP
mbstringhabilitada pararemove_accentsfuncionar plenamente. No LocalWP, ela vem ativada por padrão. - Duplicidade de nomes: O WordPress automaticamente adiciona um sufixo numérico (ex:
imagem-2.jpg) se o nome já existir. Nosso plugin não interfere nesse comportamento nativo.
Registro no caderno
Data:
Funcionalidade: Limpeza automática de nomes de arquivos de mídia no upload
Plugins substituídos: clean-image-filenames, smart-media-rename (parcialmente)
Tempo de implementação: ~5 minutos (criação e testes)
Observação: Este MU-Plugin é leve e não requer configuração; funciona imediatamente após criado.