Files
site-mv/functions.php
T
rodrigo 6904171303 fix performance and new mobile menu
Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
2026-02-22 16:46:43 -03:00

183 lines
5.5 KiB
PHP

<?php
/**
* Functions and definitions
*
* @package MartinsEVieira
*/
// Constantes de versão para cache busting
define('THEME_VERSION', '1.0.5');
/**
* Theme setup
*/
function martinsevieira_setup() {
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
register_nav_menus(array(
'primary' => 'Menu Principal',
));
add_theme_support('html5', array(
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
));
// Adicionar tamanhos de imagem
add_image_size('post-thumb', 400, 250, true);
}
add_action('after_setup_theme', 'martinsevieira_setup');
/**
* Enqueue scripts and styles
*/
function martinsevieira_scripts() {
// Styles
wp_enqueue_style('martinsevieira-style', get_stylesheet_uri(), array(), THEME_VERSION);
wp_enqueue_style('font-awesome', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css', array(), '6.4.0', 'all');
wp_style_add_data('font-awesome', 'display', 'swap');
// Scripts com defer para melhor performance
wp_enqueue_script('martinsevieira-script', get_template_directory_uri() . '/js/main.js', array(), THEME_VERSION, true);
wp_script_add_data('martinsevieira-script', 'defer', true);
// Localizar script para AJAX
wp_localize_script('martinsevieira-script', 'ajaxData', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('load_more_posts_nonce')
));
}
add_action('wp_enqueue_scripts', 'martinsevieira_scripts');
/**
* Adicionar atributos async/defer aos scripts
*/
function add_defer_attribute($tag, $handle) {
if ('martinsevieira-script' === $handle) {
return str_replace(' src', ' defer src', $tag);
}
return $tag;
}
add_filter('script_loader_tag', 'add_defer_attribute', 10, 2);
/**
* Otimizar carregamento de fontes
*/
function add_font_preconnect() {
echo '<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>';
echo '<link rel="dns-prefetch" href="https://cdnjs.cloudflare.com">';
}
add_action('wp_head', 'add_font_preconnect', 1);
/**
* Remover jQuery Migrate para melhor performance
*/
function remove_jquery_migrate($scripts) {
if (!is_admin() && isset($scripts->registered['jquery'])) {
$script = $scripts->registered['jquery'];
if ($script->deps) {
$script->deps = array_diff($script->deps, array('jquery-migrate'));
}
}
}
add_action('wp_default_scripts', 'remove_jquery_migrate');
/**
* Desabilitar emojis do WordPress para melhor performance
*/
function disable_emojis() {
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
}
add_action('init', 'disable_emojis');
/**
* Register widget areas
*/
function martinsevieira_widgets_init() {
register_sidebar(array(
'name' => 'Sidebar Principal',
'id' => 'sidebar-1',
'description' => 'Sidebar principal do site',
'before_widget' => '<div class="widget">',
'after_widget' => '</div>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>',
));
}
add_action('widgets_init', 'martinsevieira_widgets_init');
/**
* AJAX - Carregar mais posts
*/
function load_more_posts_ajax() {
check_ajax_referer('load_more_posts_nonce', 'nonce');
$page = isset($_POST['page']) ? absint($_POST['page']) : 1;
$posts_per_page = 3;
// Cache key único para esta página
$cache_key = 'load_more_posts_' . $page;
$cached_data = get_transient($cache_key);
if (false !== $cached_data) {
wp_send_json_success($cached_data);
return;
}
$args = array(
'post_type' => 'post',
'posts_per_page' => $posts_per_page,
'paged' => $page,
'orderby' => 'date',
'order' => 'DESC',
'no_found_rows' => false, // Necessário para max_num_pages
);
$query = new WP_Query($args);
if ($query->have_posts()) :
ob_start();
while ($query->have_posts()) : $query->the_post();
get_template_part('template-parts/content', 'card');
endwhile;
$posts_html = ob_get_clean();
wp_reset_postdata();
$response = array(
'posts' => $posts_html,
'max_pages' => $query->max_num_pages
);
// Cachear por 1 hora
set_transient($cache_key, $response, HOUR_IN_SECONDS);
wp_send_json_success($response);
else :
wp_send_json_error(array('message' => 'Não há mais posts.'));
endif;
}
add_action('wp_ajax_load_more_posts', 'load_more_posts_ajax');
add_action('wp_ajax_nopriv_load_more_posts', 'load_more_posts_ajax');
/**
* Limpar cache ao publicar/atualizar posts
*/
function clear_posts_cache($post_id) {
if (get_post_type($post_id) === 'post') {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_load_more_posts_%'");
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_load_more_posts_%'");
}
}
add_action('save_post', 'clear_posts_cache');
add_action('delete_post', 'clear_posts_cache');