Veja como adicionar defer em todos scripts do wordpress, para melhorar a velocidade de carregamento do site sem utilizar nenhum plugin.
O resultado desse snippet é imediato e o site passa a ter uma performance muito melhor, com um simples código.
Lembrando que com HTTP2 não é necessário mais concatenar scripts, apenas carregue ele corretamente com defer ou async.
Snippet PHP para adicionar defer
Esse snippet verifica arquivos com final .js e adiciona o defer neles, excluindo o arquivo jquery.js que muito provavelmente vai quebrar funções do tema.
O script frontend.js também foi excluído, esse script é do tema desse site, o seu site vai ser preciso excluir outro script.
Adicione esse script no plugin Code Snippets e selecione para carregar apenas no front-end para não quebrar o wp-admin.
Caso o site apresente algum erro, é preciso encontrar qual arquivo .js é preciso excluir, geralmente o principal do tema.
function defer_parsing_of_js($url)
{
if (false === strpos($url, '.js')) return $url;
if (strpos($url, 'jquery.js')) return $url;
if (strpos($url, 'frontend.js')) return $url;
// if (strpos($url, 'outro.js')) return $url;
return str_replace( '></script>', ' defer></script>', $url);
// return str_replace(' src', ' defer src', $url);
}
add_filter('script_loader_tag', 'defer_parsing_of_js', 11);
Explicação do código:
Linha1: define uma função chamada defer_parsing_of_js que recebe um parâmetro $url. Esta função será usada para filtrar as tags <script> no WordPress.
Linha3: verifica se a URL não contém a extensão .js. Se não contiver, a função retorna a URL sem fazer nenhuma alteração.
Linha4: verifica se a URL contém o nome do arquivo jquery.js. Se contiver, a função retorna a URL sem fazer nenhuma alteração. Isso significa que o arquivo jQuery não será carregado com o atributo “defer”.
Linha5: verifica se a URL contém o nome do arquivo frontend.js. Se contiver, a função retorna a URL sem fazer nenhuma alteração. Isso significa que o arquivo frontend.js não será carregado com o atributo “defer”.
Linha6: essa linha está comentada, mas basta retirar “//” para ela funcionar, e adicionar mais scripts que não deve receber defer, isso tem que ser analisado conforme o tema.
Linha7: substitui a tag </script> por defer></script> na URL do arquivo que está sendo carregado. Isso significa que esse arquivo será carregado com o atributo “defer”, que faz com que a execução do script seja adiada até que a página seja totalmente carregada.
Linha8: essa linha está comentada “//” mas é uma alternativa caso ocorra algum erro com a linha 7, nesse caso adicione // na linha 7 e retire o // da linha 8 para que a substituição seja de ’ src’, ’ defer src’.
Linha10: adiciona um filtro para alterar as tags <script> no WordPress, usando a função defer_parsing_of_js definida anteriormente. O número 11 especifica a ordem em que o filtro será executado (em relação a outros filtros que podem estar ativos).
Snippet PHP para adicionar async
Esse snippet é basicamente o mesmo, só que troca defer por async, ele é um pouco mais lento, mas pode ser mais fácil de resolver quebras do tema.
function async_parsing_of_js($url)
{
if (false === strpos($url, '.js')) return $url;
if (strpos($url, 'jquery.js')) return $url;
if (strpos($url, 'frontend.js')) return $url;
// if (strpos($url, 'outro.js')) return $url;
return str_replace( '></script>', ' async></script>', $url);
// return str_replace(' src', ' async src', $url);
}
add_filter('script_loader_tag', 'async_parsing_of_js', 11);
Snippet para forçar apenas 1 arquivo
Esse script pode ser interessante caso apenas 1 arquivo específico case grande degradação de performance, lembrando claro de substituir o “soessearquivo.js”.
function defer_selected_js($url) {
if (strpos($url, 'soessearquivo.js') !== false) {
return str_replace('></script>', ' defer></script>', $url);
}
return $url;
}
add_filter('script_loader_tag', 'defer_selected_js', 10);
Ou com async:
Caso tenha excluído algum script com defer e quer testar apenas ele com async esse vai ser o script, lembrando claro de substituir o “soessearquivo.js”.
function async_selected_js($url) {
if (strpos($url, 'soessearquivo.js') !== false) {
return str_replace('></script>', ' async></script>', $url);
}
return $url;
}
add_filter('script_loader_tag', 'async_selected_js', 10);
