File: /home/alfoxtfy/public_html/search/wp-content/plugins/analizador-pagespeed/analizador-pagespeed.php
<?php
/**
* Plugin Name: Analizador PageSpeed V2
* Description: Herramienta de análisis de velocidad usando la API de Google PageSpeed Insights.
* Version: 1.0
* Author: Limber76
*/
// --------------------------------------------------------------------------------
// 1. CONFIGURACIÓN: CLAVE API
// --------------------------------------------------------------------------------
// !!! REEMPLAZA ESTO CON TU CLAVE REAL O EL PLUGIN FALLARÁ !!!
define('PAGESPEED_API_KEY', 'AIzaSyByLHcwCEwdVmW5tZz6yU9_sc0-DAAJMEI');
// --------------------------------------------------------------------------------
// 2. SHORTCODE Y FORMULARIO
// --------------------------------------------------------------------------------
function pagespeed_analyzer_shortcode() {
// Si el usuario no tiene permisos para usar el plugin (opcional, pero buena práctica)
if (!current_user_can('edit_posts')) {
return '<p>No tienes permiso para usar esta herramienta.</p>';
}
ob_start();
// Mostrar el formulario
?>
<div class="pagespeed-tool-container">
<h2>Analiza la Velocidad de Cualquier URL</h2>
<form method="post" action="">
<input type="url" name="url_a_analizar" placeholder="https://ejemplo.com" required style="width: 70%; padding: 10px; margin-right: 10px; border: 1px solid #ccc;">
<input type="submit" name="analizar_url" value="Analizar Sitio" style="padding: 10px 20px; background-color: #0073aa; color: white; border: none; cursor: pointer;">
</form>
</div>
<?php
// Procesar la petición
if (isset($_POST['analizar_url']) && !empty($_POST['url_a_analizar'])) {
$url = sanitize_url($_POST['url_a_analizar']);
echo '<h3>Analizando: ' . esc_html($url) . '...</h3>';
// Ejecutar las peticiones por separado para móvil y escritorio
$results_desktop = pagespeed_fetch_results($url, 'desktop');
$results_mobile = pagespeed_fetch_results($url, 'mobile');
pagespeed_display_results($results_desktop, 'Escritorio');
pagespeed_display_results($results_mobile, 'Móvil');
}
return ob_get_clean();
}
add_shortcode('pagespeed_analyzer', 'pagespeed_analyzer_shortcode');
// --------------------------------------------------------------------------------
// 3. LLAMADA A LA API DE PAGESPEED
// --------------------------------------------------------------------------------
function pagespeed_fetch_results($url, $strategy = 'desktop') {
$api_url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?';
$params = array(
'url' => rawurlencode($url), // <-- CORRECCIÓN: Usamos rawurlencode para evitar el error de argumento inválido.
'key' => PAGESPEED_API_KEY,
'strategy' => $strategy,
'locale' => 'es-ES'
);
$full_url = $api_url . http_build_query($params);
$response = wp_remote_get($full_url, array('timeout' => 45)); // Aumentar timeout por si Google tarda
if (is_wp_error($response)) {
return array('error' => true, 'message' => 'Error de conexión: ' . $response->get_error_message());
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (isset($data['error'])) {
return array('error' => true, 'message' => 'Error de la API de Google: ' . $data['error']['message']);
}
return $data;
}
// --------------------------------------------------------------------------------
// 4. VISUALIZACIÓN DE RESULTADOS
// --------------------------------------------------------------------------------
function pagespeed_display_results($data, $type = 'Escritorio') {
if (isset($data['error'])) {
echo '<p style="color: red; font-weight: bold;">[Resultados ' . $type . '] Error: ' . esc_html($data['message']) . '</p>';
return;
}
if (!isset($data['lighthouseResult']['categories']['performance']['score'])) {
echo '<p style="color: orange;">[Resultados ' . $type . '] No se obtuvieron datos de rendimiento válidos.</p>';
return;
}
$score = $data['lighthouseResult']['categories']['performance']['score'] * 100;
$metrics = $data['lighthouseResult']['audits'];
// Determinar color de la puntuación
$color = 'red'; // Malo (0-49)
if ($score >= 90) {
$color = 'green'; // Bueno (90-100)
} elseif ($score >= 50) {
$color = 'orange'; // Necesita mejorar (50-89)
}
echo '<div class="pagespeed-results" style="border: 1px solid #ddd; padding: 20px; margin-top: 20px; background-color: #fff;">';
echo '<h4 style="border-bottom: 2px solid ' . $color . '; padding-bottom: 5px;">Análisis para ' . $type . '</h4>';
// Mostrar Puntuación General
echo '<div class="score-box" style="background-color: #f0f0f0; padding: 15px; margin-bottom: 20px; text-align: center;">';
echo '<p style="font-size: 2.5em; color: ' . $color . '; margin: 0; font-weight: bold;">' . $score . '</p>';
echo '<p style="margin: 5px 0 0 0; font-weight: bold;">Puntuación de Rendimiento</p>';
echo '</div>';
// Mostrar Métricas clave (Core Web Vitals y más)
echo '<h5>Métricas Core Web Vitals</h5>';
echo '<table style="width: 100%; border-collapse: collapse; text-align: left;">';
echo '<thead><tr style="background-color: #eee;"><th>Métrica</th><th>Valor</th></tr></thead><tbody>';
$target_metrics = [
'largest-contentful-paint' => 'LCP (Pintura con Contenido más Grande)',
'cumulative-layout-shift' => 'CLS (Cambio de Diseño Acumulativo)',
'first-contentful-paint' => 'FCP (Primera Pintura con Contenido)',
'speed-index' => 'Índice de Velocidad',
];
foreach ($target_metrics as $audit_id => $name) {
if (isset($metrics[$audit_id]['displayValue'])) {
echo '<tr style="border-bottom: 1px solid #ddd;">';
echo '<td style="padding: 8px;"><strong>' . $name . ':</strong></td>';
echo '<td style="padding: 8px;">' . esc_html($metrics[$audit_id]['displayValue']) . '</td>';
echo '</tr>';
}
}
echo '</tbody></table>';
// Mostrar Oportunidades (simplificado)
echo '<h5>Oportunidades de Mejora</h5>';
echo '<ul style="padding-left: 20px;">';
$opportunity_audits = [
'uses-webp-images' => 'Publicar imágenes en formatos de próxima generación (WebP)',
'minify-css' => 'Minificar CSS',
'minify-javascript' => 'Minificar JavaScript',
'render-blocking-resources' => 'Eliminar recursos que bloquean el renderizado',
'unminified-css' => 'Reducir CSS sin usar (Unused CSS)',
];
foreach ($opportunity_audits as $audit_id => $description) {
if (isset($metrics[$audit_id]['score']) && $metrics[$audit_id]['score'] < 1) {
$time_savings = isset($metrics[$audit_id]['details']['overallSavingsMs']) ? '(' . round($metrics[$audit_id]['details']['overallSavingsMs'] / 1000, 2) . 's ahorro)' : '';
echo '<li>' . $description . ' <span style="font-weight: bold; color: orange;">' . $time_savings . '</span></li>';
}
}
echo '</ul>';
echo '</div>';
}