Faça Defer de CSS não crítico no wordpress utilizando esse script para melhorar a performance do seu site wordpress.

Elimine o CSS que bloqueia o carregamento (render-blocking), melhor a velocidade do site e a pontuação no pagespeed.

A ideia é basicamente implementar as boas práticas do site web.dev para CSS de forma automática e sem usar plugin no wordpress.

Snippet PHP defer CSS não crítico

Esse código PHP modifica as tags de estilo do wordpress para mudar a tag para media=“print” e adicionar onload=“this.media=‘all’.

Com isso o carregamento desse CSS é adiado até que a página seja totalmente carregada.

add_filter('style_loader_tag', function (string $html, string $handle): string {
    if (strpos($html, 'style.min.css') !== false) {
        return $html; // Skip this file
    }
    $dom = new \DOMDocument();
    $dom->loadHTML($html);
    $tag = $dom->getElementById($handle . '-css');
    $tag->setAttribute('media', 'print');
    $tag->setAttribute('onload', "this.media='all'");
    $tag->removeAttribute('type');
    $tag->removeAttribute('id');
    $html = $dom->saveHTML($tag);
    return $html;
}, 999, 2);

Explicação do código:

Linha1: adiciona um filtro à tag style que carrega arquivos CSS na página. O filtro é definido como uma função anônima (closure) que recebe dois argumentos: $html que representa a tag atual, e $handle que é um identificador único para o arquivo CSS que está sendo carregado.

Linha2,3 e 4 (if): verifica se o nome do arquivo CSS contém a string 'style.min.css'. Se sim, o filtro simplesmente retorna a tag original sem fazer nenhuma modificação. Isso é útil para ignorar arquivos CSS que não precisam ser modificados.

Linha5 e 6: cria um novo objeto DOMDocument do PHP e carrega o conteúdo HTML da tag atual para dentro dele. Isso permite que o filtro manipule a tag usando métodos da classe DOMDocument.

Linha7: usa o método getElementById do objeto $dom para recuperar a tag style atual. O identificador da tag é baseado no $handle passado para a função de filtro, concatenado com a string '-css'.

Linha8 e 9: modificam os atributos media e onload da tag style. O atributo media é definido como 'print', o que significa que o estilo será aplicado apenas quando a página for impressa. O atributo onload é definido como um script JavaScript que altera o valor do atributo media para 'all', o que significa que o estilo será aplicado em todas as mídias (telas, impressão, etc.) assim que a tag for carregada.

Linha10 e 11: removem os atributos type e id da tag style. O atributo type não é necessário para arquivos CSS e pode ser omitido. O atributo id foi usado anteriormente para recuperar a tag style, mas agora que já foi manipulada, não é mais necessário mantê-lo.

Linha12 e 13: atualiza o conteúdo HTML da tag style com as modificações realizadas e retorna o novo conteúdo HTML para ser usado na página.

Linha14: define os argumentos adicionais da função add_filter. Esses argumentos são opcionais e controlam a ordem de execução do filtro e o número de argumentos que a função de filtro recebe.

Modificar snippet para seu tema

Nesse exemplo acima, o css principal do tema é chamado com o nome “style.min.css” por isso ele não deve ser modificado.

Para fazer defer do estilo principal é preciso carregar o CSS crítico inline.

Para encontrar o CSS crítico do seu site utilize um dos sites gratuitos abaixo, coloquei em ordem de preferência.

https://www.sitelocity.com/critical-path-css-generator
https://jonassebastianohlsson.com/criticalpathcssgenerator/
https://www.corewebvitals.io/tools/critical-css-generator

Com o código gerado copie tudo para dentro desse script abaixo:

function crit_css() {
    ?>
           [inserir o css crítico aqui com as tags <style> e </style>]
    <?php
}
add_action('wp_head', 'crit_css', -1);

Substitua todo o [inserir o css crítico aqui com as tags ] pelo código gerado, esse snippet vai ser executado com prioridade -1, ou seja, bem no topo do site.

Snippet PHP defer CSS não crítico + noscript

Esse script abaixo adiciona no final a tag

add_filter('style_loader_tag', function (string $html, string $handle): string {
    if (strpos($html, 'style.min.css') !== false) {
        return $html; // Skip this file
    }
    $dom = new \DOMDocument();
    $dom->loadHTML($html);
    $tag = $dom->getElementById($handle . '-css');
    $tag->setAttribute('media', 'print');
    $tag->setAttribute('onload', "this.media='all'");
    $tag->removeAttribute('type');
    $tag->removeAttribute('id');     
    $html = $dom->saveHTML($tag);    
    // Adiciona <noscript>
    $noscript = $dom->createElement('noscript');
    $link = $dom->createElement('link');
    $link->setAttribute('rel', 'stylesheet');    
    $min_css_url = str_replace('.css', '.min.css', $tag->getAttribute('href'));
    $min_css_filename = basename($min_css_url);
    if (file_exists(get_template_directory() . "/$min_css_filename")) {
        $link->setAttribute('href', $min_css_url);  
    } else {
        $link->setAttribute('href', $tag->getAttribute('href'));
    }    
    $noscript->appendChild($link);
    $html .= $dom->saveHTML($noscript);
    return $html;
}, 999, 2);