# Como corrigir a remoção de query strings que não funciona no Perfmatters

A remoção de query strings do Perfmatters falha quando a opção continua desativada, o cache não foi limpo após ativar, ou os assets que ainda exibem o ?ver= são externos ou enfileirados fora dos filtros style_loader_src e script_loader_src que o Perfmatters intercepta.

## O que é query strings que o Perfmatters não remove?

Query strings são o trecho de versão que o WordPress acrescenta ao fim das URLs de CSS e JS estáticos, no formato ?ver=6.5. Ele serve para invalidar o cache do navegador quando o arquivo muda, mas alguns proxies, CDNs e ferramentas de auditoria como o GTmetrix antigo recomendavam removê-lo porque tratavam URLs com query string como não cacheáveis. A opção Remove Query Strings do Perfmatters existe justamente para tirar esse ?ver= dos recursos estáticos do seu site.

O Perfmatters faz isso filtrando as URLs que passam pelos hooks style_loader_src e script_loader_src do WordPress, removendo o parâmetro ver dos assets locais. O problema aparece quando você ativa a opção e o ?ver= continua na fonte da página: na prática o Perfmatters só consegue limpar os recursos que ele enxerga por esses filtros, então assets externos, scripts enfileirados de forma incorreta ou HTML servido de um cache antigo escapam da limpeza e mantêm a query string.

## Como identificar

- No código-fonte da página, arquivos como style.min.css?ver=6.5 e jquery.min.js?ver=3.7.1 continuam com o ?ver= mesmo após ativar a opção Remove Query Strings.
- A auditoria do GTmetrix ou de outra ferramenta segue apontando 'Remove query strings from static resources' depois de salvar as configurações do Perfmatters.
- Somente alguns arquivos perderam o ?ver=: os assets do tema e do core ficaram limpos, mas os de plugins ou de um CDN ainda mostram a query string.
- A query string sumiu ao testar em uma aba anônima, mas continua aparecendo na navegação normal porque o navegador ou um plugin de cache serve a versão antiga do HTML.
- Recursos de terceiros, como Google Fonts ou um pixel externo, mantêm parâmetros na URL e seguem listados na auditoria mesmo com a opção ativa.

**Antes de começar:** Antes de editar o functions.php, criar um mu-plugin ou desativar funções de outro plugin de cache em produção, faça um backup dos arquivos e do banco de dados ou aplique a mudança primeiro em um ambiente de staging, para reverter caso algum asset deixe de carregar.

## Como prevenir

- Centralize a remoção de query strings em um único plugin de performance e nunca ative a mesma função no Perfmatters e no WP Rocket ao mesmo tempo, evitando conflito na ordem dos filtros.
- Hospede recursos de terceiros localmente quando possível, como as fontes do Google pela própria opção Local Google Fonts do Perfmatters, para que esses assets passem a ser tratados como locais.
- Adote o hábito de limpar o cache do plugin e da CDN sempre que alterar qualquer configuração de otimização, para que o HTML servido reflita a mudança na hora.
- Audite a página em aba anônima após cada ajuste de performance, conferindo a fonte para garantir que os assets locais saem sem o ?ver= e que nada de essencial parou de carregar.

Erros relacionados

- [Como corrigir funcionalidades quebradas pelo Perfmatters](https://full.services/wp-fixer/corrigir-funcionalidades-quebradas-perfmatters/)
- [Como corrigir o conflito de otimização entre Perfmatters e WP Rocket](https://full.services/wp-fixer/corrigir-conflito-perfmatters-wp-rocket/)
- [Como corrigir o CDN Rewrite que não altera URLs no Perfmatters](https://full.services/wp-fixer/corrigir-cdn-rewrite-perfmatters/)

## Causa

- A opção Remove Query Strings está desmarcada em Perfmatters, Options, aba General, ou as alterações foram feitas mas o botão Save Changes não foi clicado, então o filtro nunca chegou a rodar.
- Um plugin de cache de página, como o WP Rocket, ou o cache da CDN está servindo um HTML gerado antes de você ativar a opção, então a página entregue ainda contém o ?ver= antigo até o cache ser limpo.
- Os arquivos que ainda exibem a query string são externos ao site (Google Fonts, um pixel ou um script de CDN de terceiros): o Perfmatters atua nos filtros style_loader_src e script_loader_src de assets locais e não reescreve URLs de domínios externos.
- Um plugin ou tema imprime o CSS ou o JS direto no HTML com a tag escrita à mão, sem passar pela fila do wp_enqueue_style e wp_enqueue_script, de modo que a URL nunca atravessa o filtro que o Perfmatters usa para remover o ver.
- Outro plugin de performance reaplica a versão ao asset depois do Perfmatters, ou a opção Remove Query Strings do próprio WP Rocket está ativa em paralelo, gerando comportamento conflitante na ordem dos filtros.

## Como resolver

1. Confirme que a opção está ativa e salva: Abra as configurações do Perfmatters e garanta que a opção Remove Query Strings esteja marcada na aba General, depois clique em Save Changes. Sem salvar, o filtro que remove o ver não é registrado e nada muda na fonte da página.

```
Painel WP -> Settings -> Perfmatters -> Options -> General
Marque a opção 'Remove Query Strings'
Clique em 'Save Changes' no rodapé da aba
```

2. Limpe todo o cache e teste em aba anônima: Limpe o cache do seu plugin de cache, da CDN e do navegador, pois o HTML servido pode ter sido gerado antes da mudança e ainda conter o ?ver=. Em seguida abra a página em uma aba anônima e veja o código-fonte para confirmar se a query string saiu.

```
Limpe o cache do plugin de página (ex.: WP Rocket -> Clear Cache)
Faça purge do cache da CDN (ex.: Cloudflare -> Purge Everything)
Abra a página em aba anônima e use Ctrl+U para ver a fonte
```

3. Separe assets locais de assets externos: Olhe na fonte da página quais URLs ainda têm ?ver= e veja o domínio de cada uma. Se forem de domínios externos como fonts.googleapis.com ou de uma CDN de terceiros, o Perfmatters não reescreve essas URLs por design: a limpeza vale para os recursos locais que passam pelos filtros de enfileiramento do WordPress.

```
No código-fonte, identifique as URLs que ainda têm '?ver='
Compare o domínio: local (seu site) ou externo (terceiros)
Para os externos, trate a fonte (ex.: hospedar fontes localmente) em vez de esperar a limpeza
```

4. Verifique conflito com outro plugin de performance: Se o WP Rocket ou outro plugin de otimização também tiver a remoção de query strings ou a versão de assets ativa, desligue a função duplicada em um deles para evitar que um reaplique o ver depois do outro. Centralize a remoção em um único plugin e recarregue a página para testar.

```
Painel WP -> WP Rocket -> File Optimization (ou plugin equivalente)
Desative a remoção de query strings duplicada em um dos plugins
Limpe o cache e recarregue a página para confirmar
```

5. Force a remoção via filtro para assets teimosos: Para os recursos locais que ainda escapam, adicione um filtro próprio nos hooks style_loader_src e script_loader_src para remover o parâmetro ver, complementando o Perfmatters. Coloque o código em um plugin de site específico ou no functions.php do tema filho.

```
Edite o functions.php do tema filho ou um mu-plugin
Adicione o filtro de remoção do parâmetro 'ver' (ver bloco de código abaixo)
Salve, limpe o cache e confira a fonte da página
```


## Código

```php
<?php
/**
 * Remove o parametro ?ver= dos assets locais que escapam do Perfmatters.
 * Cole em um mu-plugin ou no functions.php do tema filho.
 */
add_filter( 'style_loader_src', 'full_remove_query_strings', 15 );
add_filter( 'script_loader_src', 'full_remove_query_strings', 15 );
function full_remove_query_strings( $src ) {
    if ( ! $src ) {
        return $src;
    }
    // So mexe em URLs do proprio site: assets externos ficam intactos.
    if ( strpos( $src, home_url() ) !== false && strpos( $src, '?ver=' ) !== false ) {
        $src = remove_query_arg( 'ver', $src );
    }
    return $src;
}
```

## Perguntas frequentes

### Ativei a opção mas o ?ver= continua aparecendo, por quê

Quase sempre é cache. O HTML entregue foi gerado antes de você ativar a opção e ainda traz o ?ver= antigo. Limpe o cache do plugin de página, da CDN e do navegador, depois confira a fonte em uma aba anônima para ver o resultado real.

### Por que só alguns arquivos perderam a query string

O Perfmatters remove o ver dos assets locais que passam pelos filtros style_loader_src e script_loader_src do WordPress. Arquivos externos, de uma CDN de terceiros ou impressos direto no HTML sem enfileiramento não atravessam esse filtro e mantêm a query string.

### O Perfmatters remove query strings de recursos externos como Google Fonts

Não. A limpeza vale para recursos locais do seu site. Para fontes do Google, o caminho é hospedá-las localmente usando a opção Local Google Fonts do Perfmatters, que passa a servir o arquivo do seu domínio sem os parâmetros externos.

### Remover query strings melhora mesmo a velocidade do site

O ganho hoje é pequeno. A recomendação vem de ferramentas antigas que tratavam URLs com query string como não cacheáveis, mas CDNs modernas cacheiam essas URLs normalmente. Vale mais para zerar o aviso da auditoria do que por impacto real de carregamento.

### Onde fica a opção Remove Query Strings no Perfmatters

Em Settings, Perfmatters, Options, na aba General. Marque a caixa Remove Query Strings e clique em Save Changes no rodapé. Sem salvar, o filtro não é registrado e a query string permanece na fonte da página.

### Posso usar Remove Query Strings no Perfmatters e no WP Rocket juntos

Não é recomendado. Ativar a mesma função nos dois pode fazer um plugin reaplicar a versão depois do outro, gerando comportamento inconsistente. Escolha um único plugin para essa tarefa e desative a opção duplicada no outro.

### Como remover o ?ver= de um asset que continua teimoso

Se for um recurso local que escapa do Perfmatters, adicione um filtro próprio nos hooks style_loader_src e script_loader_src para tirar o parâmetro ver, num mu-plugin ou no functions.php do tema filho. Depois limpe o cache e confira a fonte.

**Fonte:** [Perfmatters — Documentação oficial](https://perfmatters.io/docs/)
