/** * 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();