Skip to content

Tudo para WordPress, desenvolvimento web — e não só

🚫 Como desativar seletivamente plugins do WordPress em páginas e artigos específicos

🚫 Como desativar seletivamente plugins do WordPress em páginas e artigos específicos

Todos os plugins do WordPress adicionam código PHP que é executado no carregamento da página, carregam scripts e estilos e, por vezes, fazem consultas adicionais à base de dados. Quantos mais plugins tiver, mais pesadas ficam as suas páginas. Mas o problema não é apenas a quantidade: mesmo um único plugin «conversador», como o Contact Form 7, carrega os seus ficheiros .css e .js em todas as páginas por predefinição, incluindo páginas onde não existe qualquer formulário.

Os programadores do CF7 reconhecem abertamente que o plugin carrega recursos em todo o lado porque o shortcode pode aparecer em qualquer sítio. Esta lógica não é exclusiva do CF7; a maioria dos plugins funciona da mesma forma. O resultado: a página inicial do seu blogue carrega scripts para um slider de galeria que nunca esteve lá.

A boa notícia: o WordPress permite desativar seletivamente o carregamento de plugins apenas nas páginas onde são realmente necessários. Vamos abordar ambas as abordagens: a programática (usando um mu-plugin com o filtro option_active_plugins) e a baseada em plugins (Plugin Organizer, Perfmatters, Plugin Load Filter). No final, mediremos os resultados usando o monitor de rede do navegador.

💡 Visão geral rápida:

  • Escolha plugins com base em três critérios: reputação do programador, desempenho sob carga e necessidade real
  • Abordagem programática: escreva um snippet PHP que use get_option('active_plugins') para obter a lista de plugins ativos e os filtre pelo URL da página
  • Mu-plugin: coloque o filtro em /wp-content/mu-plugins/ para que seja executado ANTES de todos os plugins regulares, desativando os desnecessários em tempo real
  • Abordagem com plugins: o Plugin Organizer e o Perfmatters fornecem uma interface visual para as mesmas tarefas, sem escrever uma única linha de código
  • Meça o efeito usando as DevTools do Chrome/Firefox: após a filtragem, os pedidos HTTP diminuem e o tempo de carregamento reduz-se visivelmente

Três regras para escolher plugins

Antes de filtrar o carregamento de plugins, certifique-se de que os plugins no seu site merecem realmente um lugar na wp_options. Três regras que lhe poupam dores de cabeça e recursos do servidor.

Instale apenas plugins verificados de programadores com historial comprovado. Abra a página do plugin no WordPress.org e verifique: número de instalações ativas, classificação, data da última atualização e número de tickets de suporte resolvidos. Um plugin com mais de 100 000 instalações, classificação superior a 4,5 e uma atualização nos últimos 3 meses é uma escolha segura.

Página do plugin no directório do WordPress

Prefira plugins escaláveis. Dois plugins com funcionalidades idênticas podem afetar a velocidade de forma diferente. Compare os candidatos usando o inspetor do navegador (separador Rede) ou serviços online como o Google PageSpeed Insights, Pingdom e GTmetrix; meça o tempo de carregamento e o número de pedidos HTTP antes e depois da instalação.

Não mantenha peso morto. Cada plugin não utilizado significa código PHP extra em cada pedido. Audite periodicamente a sua lista de plugins ativos e remova aqueles sem os quais o seu site pode viver. Se um plugin «pode vir a dar jeito daqui a seis meses», desative-o e elimine-o, e depois instale uma versão nova daqui a seis meses.

Exemplo real: Contact Form 7

O Contact Form 7 é o objeto de teste perfeito. Ele adiciona a todas as páginas:

  • style.css para os estilos do formulário
  • scripts.js para a lógica de validação e submissão

Mesmo que uma página não tenha o shortcode [contact-form-7], ambos os ficheiros são carregados fielmente. A captura de ecrã abaixo mostra o painel Rede das DevTools do Chrome, que não mente:

Painel de rede a mostrar os recursos do plugin Contact Form 7

A solução: modificar a lógica de carregamento dentro do plugin (o que se quebrará numa atualização) ou desativar seletivamente o plugin para todas as páginas, exceto a que precisa. A segunda abordagem é mais fiável, por isso vamos concentrar-nos nela.

Passo 1. Obter a lista de plugins ativos via PHP

Antes de filtrar, precisa de perceber onde o WordPress guarda a lista de plugins ativos. Estão todos na tabela wp_options, na linha com a chave active_plugins. Pode obter o array com uma única função get_option.

Adicione este código ao plugin Code Snippets ou ao seu próprio ficheiro de plugin (não se esqueça do cabeçalho do plugin no topo):

1<?php
2/**
3 * Plugin Name: Active Plugins Lister
4 */
5
6add_shortcode( 'activeplugins', function() {
7 $active_plugins = get_option( 'active_plugins' );
8 $plugins = "";
9 if ( count( $active_plugins ) > 0 ) {
10 $plugins = "<ul>";
11 foreach ( $active_plugins as $plugin ) {
12 $plugins .= "<li>" . $plugin . "</li>";
13 }
14 $plugins .= "</ul>";
15 }
16 return $plugins;
17} );

Guarde o ficheiro como active-plugins.php e carregue-o para /wp-content/plugins/. Crie uma página de teste, insira o shortcode [activeplugins] e obterá uma lista numerada de todos os plugins ativos no formato folder/file.php.

Tabela wp_options com plugins ativos

Eis o aspeto do resultado após inserir o shortcode numa página:

Lista de plugins ativos via shortcode

Passo 2. O filtro option_active_plugins: a sua ferramenta principal

Agora a ferramenta principal: o filtro option_active_plugins. Pertence à família de filtros option_$option_name e é executado sempre que o WordPress obtém um valor de opção da base de dados. Como os plugins ativos são armazenados como a opção active_plugins, este filtro permite-lhe modificar o array em tempo real: remover plugins indesejados ou adicionar novos.

Eis um exemplo mínimo que ativa programaticamente o Advanced Custom Fields (assumindo que o plugin já está instalado):

1add_filter( 'option_active_plugins', function( $plugins ) {
2 $myplugin = "advanced-custom-fields/acf.php";
3 if ( ! in_array( $myplugin, $plugins ) ) {
4 $plugins[] = $myplugin;
5 }
6 return $plugins;
7} );

Este código adiciona o ACF à lista de plugins ativos em todas as páginas. Não é particularmente prático, mas o princípio é claro: pode modificar o array $plugins como desejar.

Nota importante: o filtro deve ser executado antes dos plugins normais, caso contrário o WordPress lerá primeiro a lista não filtrada. É para isso que servem os mu-plugins.

Passo 3. Criar um mu-plugin para desativação seletiva

Os must-use plugins residem em /wp-content/mu-plugins/ e são executados antes de todos os plugins normais. É exatamente disso que precisamos: o nosso filtro assume o controlo primeiro.

Há um senão: as tags condicionais do WordPress (is_page(), is_single() e outras) não funcionam nos mu-plugins porque o pedido ainda não foi analisado, pelo que todas retornam false. Tem de analisar o URL manualmente através de $_SERVER['REQUEST_URI'].

Eis um mu-plugin pronto a usar que desativa o Contact Form 7 em todas as páginas exceto /contact/:

1$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
2$is_admin = strpos( $request_uri, '/wp-admin/' );
3
4if ( false === $is_admin ) {
5 add_filter( 'option_active_plugins', function( $plugins ) {
6 global $request_uri;
7
8 $is_contact_page = strpos( $request_uri, '/contact/' );
9 $myplugin = "contact-form-7/wp-contact-form-7.php";
10 $k = array_search( $myplugin, $plugins );
11
12 if ( false !== $k && false === $is_contact_page ) {
13 unset( $plugins[ $k ] );
14 }
15
16 return $plugins;
17 } );
18}

Vamos analisá-lo linha a linha:

  • parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) extrai o caminho do pedido (por exemplo, /blog/kak-otkljuchit-plaginy/)
  • strpos( $request_uri, '/wp-admin/' ) verifica se estamos na área de administração; se sim, o filtro não se aplica, mantendo as páginas de configurações dos plugins acessíveis
  • array_search( $myplugin, $plugins ) encontra o CF7 no array de plugins ativos
  • unset( $plugins[ $k ] ) remove o plugin da lista se NÃO estivermos na página de contacto

Guarde o ficheiro, carregue-o para /wp-content/mu-plugins/ e limpe a cache. Agora o shortcode [activeplugins] deverá mostrar o Contact Form 7 apenas na página /contact/.

Eis o aspeto do mesmo princípio para vários plugins em simultâneo. Em vez de array_search com um único plugin, utilize um array e array_diff:

1$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
2$is_admin = strpos( $request_uri, '/wp-admin/' );
3
4if ( false === $is_admin ) {
5 add_filter( 'option_active_plugins', function( $plugins ) {
6 global $request_uri;
7
8 $is_contact_page = strpos( $request_uri, '/contact/' );
9 $myplugins = array(
10 "contact-form-7/wp-contact-form-7.php",
11 "code-snippets/code-snippets.php",
12 "query-monitor/query-monitor.php",
13 "autoptimize/autoptimize.php"
14 );
15
16 if ( false === $is_contact_page ) {
17 $plugins = array_diff( $plugins, $myplugins );
18 }
19
20 return $plugins;
21 } );
22}

A função array_diff devolve os valores do primeiro array que não estão no segundo, exatamente o que precisa para a desativação em massa.

O resultado é imediatamente visível no painel Rede: o ficheiro script.js do Contact Form 7 desaparece da lista de recursos em todas as páginas exceto na página de contacto.

Lista de recursos da página sem o script do Contact Form 7

A abordagem programática é flexível, mas requer alterações de código para cada novo plugin. Para quem prefere uma interface visual, existem plugins de filtro prontos a usar.

Abordagem baseada em plugins: filtragem sem código

Plugin Load Filter

O Plugin Load Filter é uma ferramenta gratuita para filtrar plugins com base em várias condições. Suporta:

  • filtragem por tipo de conteúdo (artigos, páginas, tipos de conteúdo personalizados)
  • filtragem por formato de artigo
  • exceções para módulos do Jetpack
  • filtragem de URL para pedidos REST API, Heartbeat, AJAX e AMP
Interface do Plugin Load Filter

Configurações para ativar o filtro por tipo de página:

Definições de página do plugin load filter

Após a ativação, o administrador configura a que páginas o filtro se aplica através do separador «Filter Activation by Page Type». Minimalista e direto.

Plugin Organizer

O Plugin Organizer é um veterano entre os plugins de filtragem, com uma classificação de 5 estrelas. Oferece-lhe controlo total sobre o carregamento:

  • desativação seletiva de plugins por URL da página
  • desativação por função de utilizador
  • grupos de plugins (ativar/desativar um lote de uma só vez)
  • alteração da ordem de carregamento dos plugins
Página de definições globais do Plugin Organizer

Na página «Global Plugins», pode arrastar e largar para desativar globalmente um plugin em todo o site e reativá-lo seletivamente em páginas específicas através de uma metabox no editor de artigos. Na imagem abaixo, o Contact Form 7 está desativado globalmente:

Contact Form 7 desativado globalmente no Plugin Organizer

E aqui está essa mesma metabox no ecrã de edição da página de contactos, que substitui as configurações globais:

Metabox do Plugin Organizer na página de contacto

O Plugin Organizer também mostra informações de depuração: que plugins foram realmente carregados em cada página e porquê. A documentação está disponível no site do programador.

Perfmatters

O Perfmatters é uma ferramenta premium da equipa de desenvolvimento da Kinsta. A sua principal funcionalidade, o Script Manager, agrupa todos os scripts e estilos por nome de plugin ou tema.

Gestor de Scripts do Perfmatters

Pode desativar um plugin por completo ou remover seletivamente ficheiros CSS/JS individuais dentro dele. Para sites com estruturas de URL complexas, existe a desativação de scripts através de expressões regulares.

Três cenários em que o Perfmatters proporciona ganhos imediatos:

  • Plugins de redes sociais (botões de partilha): desativados em todo o lado, exceto nos artigos do blogue
  • Contact Form 7: desativado em todo o lado, exceto na página do formulário
  • Estilos do editor de blocos Gutenberg (block-library/style.min.css e theme.min.css): removidos para sites que usam o editor clássico

Num teste independente no woorkup.com, a desativação de scripts desnecessários através do Perfmatters reduziu o tempo total de carregamento em 20,2%, os pedidos HTTP na página inicial de 46 para 30 e o tamanho da página de 506,3 KB para 451,6 KB.

Resultados do teste de velocidade com o Perfmatters

O Perfmatters é um plugin pago, e justifica-se para sites onde a velocidade tem impacto direto na conversão. Para um blogue pequeno, o Plugin Organizer ou um mu-plugin programático serão suficientes.

Medir os resultados com o monitor de rede do navegador

Otimização sem medição é um tiro no escuro. As DevTools do navegador dão-lhe uma imagem precisa do antes e depois, sem serviços de terceiros. Qualquer navegador moderno funciona:

Numa instalação de teste do WordPress com 18 plugins ativos, medimos a velocidade da página antes da filtragem (cache vazia, Monitor de Rede do Firefox):

Análise de desempenho no Firefox antes da otimização

Resultado: 255,19 KB, tempo de carregamento 1,24 segundos, 12 pedidos.

Após instalar o Plugin Organizer e desativar globalmente o Contact Form 7, o gráfico circular mudou:

Análise de desempenho no Firefox após desativar o CF7

Métricas: 104,21 KB, tempo de carregamento 0,80 segundos, 8 pedidos.

Por fim, desativámos todos os plugins não utilizados:

Análise de desempenho no Firefox após otimização completa

Resultado final: 101,98 KB, tempo de carregamento 0,46 segundos, 8 pedidos.

Comparando os extremos: o tamanho dos recursos caiu para menos de metade (de 255 para 102 KB), o tempo de carregamento desceu de 1,24 para 0,46 segundos e os pedidos HTTP passaram de 12 para 8. Os números falam por si: a desativação seletiva de plugins proporciona ganhos de velocidade notáveis, mesmo num site pequeno, e a degradação do TTFB e do LCP afeta diretamente os rankings de pesquisa.

⁉️🤔 Perguntas frequentes

Um mu-plugin é obrigatório ou posso deixar o código num plugin normal?

Pode usar um plugin normal, mas a ordem de carregamento pode estragar tudo. Se o seu filtro option_active_plugins for executado depois de o WordPress já ter lido a lista de plugins ativos, não funcionará. Um mu-plugin é a única forma de garantir que o seu filtro assume o controlo antes de todos os outros plugins. Num plugin normal, depende da ordem alfabética ou de hooks que podem mudar após qualquer atualização de outro plugin.

E se eu não conseguir criar a pasta mu-plugins no meu alojamento?

Pode criar a pasta /wp-content/mu-plugins/ via FTP, através do gestor de ficheiros do seu alojamento ou com o WP-CLI usando o comando wp scaffold mu-plugin. Se não tiver qualquer acesso ao sistema de ficheiros, utilize o Plugin Organizer: faz o mesmo através do seu próprio mecanismo de filtragem e não requer a edição de ficheiros do servidor. A maioria dos fornecedores de alojamento dá acesso à pasta wp-content através de um gestor de ficheiros no painel de controlo. Permissões da pasta: 0755.

Desativar um plugin através do filtro afeta as suas configurações?

Não, as configurações do plugin são guardadas na base de dados (tabela wp_options) e permanecem intactas. Está apenas a impedir que o WordPress carregue o código do plugin ao processar um pedido específico. Todas as configurações se mantêm no lugar e, no próximo pedido em que o plugin não for filtrado, ele carrega com todas as funcionalidades. A desativação via option_active_plugins bloqueia especificamente o carregamento de código em tempo real, não é uma desativação definitiva. Na área de administração, o plugin permanece ativo, as suas configurações não são alteradas e as tarefas agendadas (WP-Cron) continuam a funcionar.

Como posso verificar se o filtro está realmente a funcionar?

O método mais visual é o painel Rede (Network) nas Ferramentas de Programador do Chrome (F12 → Rede). Abra-o numa página onde o plugin deva estar desativado, atualize com a tecla Ctrl premida (para limpar a cache) e procure o nome do plugin ou o seu ficheiro CSS/JS. Se não houver pedidos, o filtro está a funcionar. Plugins como o Query Monitor também mostram a lista de componentes carregados e o seu tempo de execução. Para o Contact Form 7, escreva contact-form-7 na pesquisa do painel Rede; se o filtro funcionou, não verá o style.css nem o scripts.js do CF7 na lista de recursos carregados.

Vale a pena desativar plugins num site muito pequeno, com apenas 5 a 7 plugins?

Se todos os 5 plugins forem genuinamente necessários em todas as páginas, não. Mas mesmo num site pequeno, há frequentemente um ou dois plugins que só funcionam numa página: um formulário de contacto, uma galeria de portfólio, um slider na página inicial. Desativar esse par nas outras páginas reduz visivelmente os pedidos HTTP e acelera o carregamento. Como vimos acima na instalação de teste, mesmo um único plugin filtrado elimina dezenas de milissegundos. Para um site com mais de 1.000 visitantes diários, esses milissegundos somam uma diferença notória, tanto para o utilizador como para as Core Web Vitals.

Código, plugin ou Perfmatters: o que escolher para a sua tarefa

Se o seu site tem 5 plugins e todos eles são genuinamente necessários em todas as páginas, este guia não é para si. Mas um site WordPress típico carrega 15 a 25 plugins ativos, dos quais apenas 5 a 7 funcionam realmente numa determinada página. Os restantes apenas consomem tempo de servidor e tornam o carregamento mais lento.

Um mu-plugin programático é uma abordagem gratuita, leve e totalmente controlável, mas exige atenção a cada novo plugin. O Plugin Organizer é o ponto de equilíbrio: interface visual, flexibilidade e gratuito. O Perfmatters é a escolha para projetos comerciais onde cada décimo de segundo no tempo de carregamento se converte em dinheiro.

Se acumulou mais plugins do que aqueles de que precisa, comece com uma auditoria e uma limpeza dos que não são usados e, em seguida, assuma o controlo do carregamento dos que permanecem. Escolha a sua abordagem com base no nível de conforto e na carga do site, e verá a diferença logo na sua primeira medição no painel Rede. Não espere que os plugins devorem o seu TTFB.