Wordpress

mu-plugins no WordPress: onde colocar snippets em vez do functions.php

Você cola um snippet no fim do functions.php, funciona, e três semanas depois o tema atualiza e o código sumiu junto. Ou pior: faltou um ponto e vírgula e o site inteiro ficou branco, painel incluído. O lugar desse tipo de código é wp-content/mu-plugins, a pasta dos must-use plugins.

Um arquivo com cabeçalho de plugin

A pasta não vem pronta na instalação. Crie ela já com o dono certo, senão o passo seguinte esbarra em permissão:

sudo -u www-data mkdir -p /var/www/seusite/html/wp-content/mu-plugins
sudo -u www-data nano /var/www/seusite/html/wp-content/mu-plugins/00-ajustes.php
<?php
/**
 * Plugin Name: Ajustes do site
 * Description: Snippets que não podem sumir na atualização do tema.
 */if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_filter( 'xmlrpc_enabled', '__return_false' );

add_filter( 'wp_robots', function ( $robots ) {
    $robots['max-image-preview'] = 'large';
    return $robots;
} );

O wp_get_mu_plugins() lê a pasta apontada por WPMU_PLUGIN_DIR, ordena os nomes com sort() e o wp-settings.php dá include_once em cada .php — antes dos plugins comuns e bem antes do tema. Não existe botão de desativar na lista do painel, o arquivo sobrevive a atualização de tema e continua valendo se alguém trocar o tema inteiro amanhã.

O que muda em relação a um plugin normal

  • Só entra arquivo .php na raiz da pasta; subpasta é ignorada, a não ser que um arquivo da raiz faça o require.
  • A ordem de carregamento é alfabética, por causa daquele sort(). É para isso que serve o prefixo 00- no nome.
  • register_activation_hook() nunca dispara aqui: ele só pendura o callback na ação activate_{plugin}, e esse evento não existe para must-use. Nada de criar tabela ou gravar opção de instalação nesse arquivo.

Para conferir se o WordPress enxergou, rode sudo -u www-data wp plugin list --status=must-use. E não se iluda com a proteção: erro de sintaxe aqui derruba o site igual, com o agravante de você não poder desativar pelo painel. Passe um php -l 00-ajustes.php antes de sair da tela.

Post Recentes

preg_replace_callback no PHP: substituir cada match com uma função

Quando o valor novo depende do que a regex achou, preg_replace não resolve. Exemplo real aplicando 10% de desconto em…

1 dia atrás

Cron do Magento 2 não roda: status missed e pending no cron_schedule

Pedido que não fatura e e-mail que não sai porque todo job fica missed: como ler a cron_schedule, conferir o…

2 dias atrás

Gerar slug de URL em PHP: acento, espaço e símbolo fora do endereço

Uma função curta em PHP 8.3 que transforma Camiseta Preta Tamanho GG em camiseta-preta-tamanho-gg, sem depender do locale do servidor.

3 dias atrás

Log de consentimento LGPD: a tabela MySQL que guarda a prova do aceite

O banner registra o clique só no navegador e some. Veja a tabela MySQL e o endpoint que gravam a…

3 dias atrás

Comando CLI Magento 2: criar a classe e registrar no di.xml

A classe do comando existe e o bin/magento list ignora ela. Falta o registro no di.xml: aqui vai a classe…

4 dias atrás

Traduzir o pt_BR.csv do Magento 2 em lote sem perder a coluna de origem

Como traduzir duas mil linhas do pt_BR.csv do Magento 2 lendo com fgetcsv e regravando com fputcsv, sem encostar na…

5 dias atrás