HEX
Server: LiteSpeed
System: Linux server358.web-hosting.com 4.18.0-553.lve.el8.x86_64 #1 SMP Mon May 27 15:27:34 UTC 2024 x86_64
User: alfoxtfy (2915)
PHP: 8.1.33
Disabled: NONE
Upload Files
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>';
}