Files
roi-theme/wp-content/plugins/wp-debug/inc/template-tracer.php

254 lines
6.6 KiB
PHP

<?php
/**
* Template Tracer Module
*
* Rastrea qué templates se cargan y en qué orden
*
* @package WP_Debug
* @since 1.0.0
*/
// Exit if accessed directly
if (!defined('ABSPATH')) {
exit;
}
/**
* WP_Debug_Template_Tracer class
*/
class WP_Debug_Template_Tracer {
/**
* Templates loaded
*
* @var array
*/
private static $templates_loaded = array();
/**
* Template parts loaded
*
* @var array
*/
private static $template_parts = array();
/**
* Initialize template tracer
*/
public static function init() {
// Track template loading
add_filter('template_include', array(__CLASS__, 'track_template'), 999);
// Track template parts
add_filter('get_template_part', array(__CLASS__, 'track_template_part'), 10, 3);
// Track template hierarchy
add_filter('template_hierarchy', array(__CLASS__, 'track_template_hierarchy'));
// Record templates on shutdown
add_action('shutdown', array(__CLASS__, 'record_templates'), 999);
}
/**
* Track main template
*
* @param string $template Template path
* @return string Template path
*/
public static function track_template($template) {
$template_info = array(
'path' => $template,
'name' => basename($template),
'type' => self::get_template_type(),
'timestamp' => microtime(true),
'backtrace' => self::get_caller(),
);
self::$templates_loaded[] = $template_info;
// Log template load
if (class_exists('WP_Debug_Logger')) {
WP_Debug_Logger::debug("Template loaded: " . basename($template), array(
'type' => $template_info['type'],
'path' => $template,
));
}
return $template;
}
/**
* Track template part
*
* @param string $slug Template slug
* @param string $name Template name
* @param array $args Template args
*/
public static function track_template_part($slug, $name = null, $args = array()) {
$template_file = $slug;
if ($name) {
$template_file .= '-' . $name;
}
$template_file .= '.php';
$template_path = locate_template($template_file);
$part_info = array(
'slug' => $slug,
'name' => $name,
'file' => $template_file,
'path' => $template_path,
'found' => !empty($template_path),
'args' => $args,
'timestamp' => microtime(true),
);
self::$template_parts[] = $part_info;
// Log if not found
if (!$part_info['found']) {
if (class_exists('WP_Debug_Logger')) {
WP_Debug_Logger::warning("Template part not found: {$template_file}");
}
}
}
/**
* Track template hierarchy
*
* @param array $templates Template hierarchy
* @return array Template hierarchy
*/
public static function track_template_hierarchy($templates) {
if (class_exists('WP_Debug_Logger')) {
WP_Debug_Logger::debug("Template hierarchy", array(
'templates' => $templates,
));
}
return $templates;
}
/**
* Get template type
*
* @return string Template type
*/
private static function get_template_type() {
if (is_404()) return '404';
if (is_search()) return 'search';
if (is_front_page()) return 'front-page';
if (is_home()) return 'home';
if (is_post_type_archive()) return 'archive-' . get_post_type();
if (is_tax()) return 'taxonomy';
if (is_attachment()) return 'attachment';
if (is_single()) return 'single-' . get_post_type();
if (is_page()) return 'page';
if (is_category()) return 'category';
if (is_tag()) return 'tag';
if (is_author()) return 'author';
if (is_date()) return 'date';
if (is_archive()) return 'archive';
return 'index';
}
/**
* Get caller information
*
* @return string Caller info
*/
private static function get_caller() {
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5);
$callers = array();
foreach ($backtrace as $trace) {
if (isset($trace['file']) && isset($trace['line'])) {
$callers[] = basename($trace['file']) . ':' . $trace['line'];
}
}
return implode(' -> ', $callers);
}
/**
* Get loaded templates
*
* @return array Templates
*/
public static function get_templates() {
return self::$templates_loaded;
}
/**
* Get template parts
*
* @return array Template parts
*/
public static function get_template_parts() {
return self::$template_parts;
}
/**
* Get missing template parts
*
* @return array Missing template parts
*/
public static function get_missing_parts() {
return array_filter(self::$template_parts, function($part) {
return !$part['found'];
});
}
/**
* Record templates on shutdown
*/
public static function record_templates() {
$templates_count = count(self::$templates_loaded);
$parts_count = count(self::$template_parts);
$missing_count = count(self::get_missing_parts());
// Log summary
if (class_exists('WP_Debug_Logger')) {
WP_Debug_Logger::info("Templates loaded", array(
'templates' => $templates_count,
'parts' => $parts_count,
'missing' => $missing_count,
));
}
// Store for frontend panel
set_transient('wp_debug_templates_data', array(
'templates' => self::$templates_loaded,
'parts' => self::$template_parts,
'missing' => self::get_missing_parts(),
), 3600);
}
/**
* Get template load order
*
* @return array Template load order
*/
public static function get_load_order() {
$order = array();
// Combine templates and parts
$all = array_merge(
array_map(function($t) {
return array('type' => 'template', 'data' => $t);
}, self::$templates_loaded),
array_map(function($p) {
return array('type' => 'part', 'data' => $p);
}, self::$template_parts)
);
// Sort by timestamp
usort($all, function($a, $b) {
return $a['data']['timestamp'] - $b['data']['timestamp'];
});
return $all;
}
}