Wordpress

Defer nos scripts do WordPress 6.9 sem plugin, com wp_enqueue_script

O Lighthouse aponta Eliminate render-blocking resources e lista três arquivos .js do seu próprio tema. Não instale plugin de otimização só por causa disso: desde o WordPress 6.3 o wp_enqueue_script() aceita um quinto parâmetro em array com a estratégia de carregamento.

add_action( 'wp_enqueue_scripts', function () {
    wp_enqueue_script(
        'meutema-app',
        get_stylesheet_directory_uri() . '/assets/app.js',
        array(),
        '1.4.0',
        array(
            'strategy'  => 'defer',
            'in_footer' => true,
        )
    );
} );

Esse quinto argumento era o velho booleano $in_footer, e continua aceitando true por compatibilidade. Passando o array, o core imprime o atributo defer na tag e ainda percorre a árvore de dependências antes: se algum script que depende do seu for bloqueante, ele rebaixa a estratégia sozinho para não inverter a ordem de execução.

E o script do plugin de terceiro?

Quando o handle já foi registrado por outro código, você só acrescenta o dado, com prioridade alta o bastante para rodar depois do registro:

add_action( 'wp_enqueue_scripts', function () {
    wp_script_add_data( 'handle-do-plugin', 'strategy', 'defer' );
    wp_script_add_data( 'pixel-analytics', 'strategy', 'async' );
}, 99 );

Guarde o async para script que não depende de ninguém e do qual ninguém depende, tipo pixel de analytics. Ele executa assim que baixa, fora de ordem; no resto use defer.

A regra que faz o defer sumir sem avisar

Handle com script inline anexado na posição after nunca é adiado. Está no filter_eligible_strategies(), dentro de wp-includes/class-wp-scripts.php: se o has_inline_script( $handle, 'after' ) der verdadeiro, o método devolve lista vazia e a tag volta bloqueante, sem nenhum aviso na tela. Como o wp_add_inline_script( 'handle', $js ) usa after por padrão, basta o plugin chamar isso para o seu defer virar pó. A saída é mover aquela configuração para a posição before ou entregá-la via wp_localize_script(), que grava na chave data e não conta como inline.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

Banner de cookie que bloqueia de verdade: script só carrega depois do aceite

O banner aparece, o visitante não clica em nada e o Analytics já gravou cookie. Veja como segurar o script…

1 dia atrás

Revisar git diff com IA antes do commit: script que lê só o staged

Var_dump esquecido e senha de teste passam batido no commit. Um script PHP que lê o git diff --staged e…

1 dia atrás

Cannot query field no GraphQL do Magento 2: o campo existe e some

O campo está no schema.graphqls e a API insiste em Cannot query field. Limpe o cache certo, recompile o generated…

2 dias atrás

Block pattern não aparece no inseridor: registre pelo arquivo em /patterns

Padrão registrado no functions.php que não aparece na aba Padrões. O caminho curto do WordPress 6.9: um arquivo PHP na…

3 dias atrás

Tamanho das tabelas MySQL 8: a query que acha o vilão do disco

Disco lotando por causa do banco? Uma query no information_schema mostra qual tabela cresceu, quanto é dado, quanto é índice…

3 dias atrás

CodeIgniter 3 PHP 8.3: os erros fatais que aparecem logo no boot

Sistema em CodeIgniter 3.1.13 morre no primeiro request depois do upgrade. Os três pontos que quebram no PHP 8.3 e…

4 dias atrás