/**
* Implementação de Critical CSS e otimização de carregamento
* Parte do projeto de otimização do template N10 News Portal
*/
if (!defined('ABSPATH')) {
exit;
}
/**
* Classe para gerenciamento de Critical CSS e otimização de recursos
*/
class N10_Resource_Optimizer {
/**
* Construtor
*/
public function __construct() {
// Hooks para otimização de recursos
add_action('wp_enqueue_scripts', array($this, 'optimize_css_loading'), 999);
add_action('wp_enqueue_scripts', array($this, 'optimize_js_loading'), 999);
add_action('wp_head', array($this, 'add_preload_resources'), 1);
add_action('wp_head', array($this, 'add_resource_hints'), 1);
add_filter('script_loader_tag', array($this, 'add_async_defer_attributes'), 10, 3);
add_action('wp_footer', array($this, 'add_font_optimization'), 999);
}
/**
* Otimiza o carregamento de CSS
*/
public function optimize_css_loading() {
global $wp_styles;
if (is_admin()) {
return;
}
// Lista de estilos para carregar de forma assíncrona
$async_styles = array(
'n10-style',
'n10-header-overrides',
'n10-sidebar-home',
'n10-footer-overrides',
'n10-archive-style',
'n10-author',
'n10-author-box',
'n10-template-home-css',
'n10-home2-css',
'n10-cta-overrides',
'n10-tudo-sobre',
'n10-sidebar-interno',
'n10-sidebar-widgets',
'n10-single-overrides',
'n10-suggestion-overrides',
);
// Adicionar atributo de carregamento assíncrono
foreach ($async_styles as $handle) {
if (isset($wp_styles->registered[$handle])) {
$wp_styles->registered[$handle]->extra['after'] = array(
'media="print" onload="this.media=\'all\'"'
);
}
}
}
/**
* Otimiza o carregamento de JavaScript
*/
public function optimize_js_loading() {
if (is_admin()) {
return;
}
// Mover jQuery para o rodapé para usuários não logados
if (!is_user_logged_in()) {
wp_scripts()->add_data('jquery', 'group', 1);
wp_scripts()->add_data('jquery-core', 'group', 1);
wp_scripts()->add_data('jquery-migrate', 'group', 1);
}
}
/**
* Adiciona atributos async/defer para scripts
*/
public function add_async_defer_attributes($tag, $handle, $src) {
// Scripts que devem carregar com defer
$defer_scripts = array(
'n10-main',
'n10-home2-js',
'n10-lazy-loading',
'n10-push-module',
'n10-profile-suggestion',
'n10-profile-share',
);
// Scripts que devem carregar com async
$async_scripts = array(
'google-identity',
);
// Adicionar atributo defer
if (in_array($handle, $defer_scripts, true)) {
return str_replace(' src', ' defer src', $tag);
}
// Adicionar atributo async
if (in_array($handle, $async_scripts, true)) {
return str_replace(' src', ' async src', $tag);
}
return $tag;
}
/**
* Adiciona preload para recursos críticos
*/
public function add_preload_resources() {
if (is_admin()) {
return;
}
// Preload do CSS crítico
echo '' . "\n";
// Preload de fontes locais
$fonts_dir = get_template_directory() . '/assets/fonts';
if (is_dir($fonts_dir)) {
$files = scandir($fonts_dir);
foreach ($files as $file) {
if (preg_match('/\.woff2$/i', $file)) {
$url = get_template_directory_uri() . '/assets/fonts/' . $file;
echo '' . "\n";
}
}
}
}
/**
* Adiciona resource hints para melhorar performance
*/
public function add_resource_hints() {
if (is_admin()) {
return;
}
// DNS prefetch para domínios externos comuns
$dns_prefetch = array(
'https://fonts.googleapis.com',
'https://fonts.gstatic.com',
'https://www.google-analytics.com',
'https://www.googletagmanager.com',
'https://connect.facebook.net',
);
foreach ($dns_prefetch as $domain) {
echo '' . "\n";
}
// Preconnect para domínios críticos
$preconnect = array(
'https://fonts.googleapis.com',
'https://fonts.gstatic.com',
);
foreach ($preconnect as $domain) {
echo '' . "\n";
}
}
/**
* Otimiza o carregamento de fontes
*/
public function add_font_optimization() {
if (is_admin()) {
return;
}
// Font Display Swap para melhor performance
echo '';
// Font Loading API para controle de carregamento
echo '';
}
}
// Inicializar a classe
$n10_resource_optimizer = new N10_Resource_Optimizer();