✅ Cómo Usar las Búsquedas de tus Usuarios en WordPress para Potenciar tu Estrategia SEO

¿Te has preguntado alguna vez qué buscan los usuarios en tu sitio web? Entender las búsquedas realizadas en tu plataforma es una herramienta invaluable para optimizar tu estrategia de contenido y, de manera indirecta, tu SEO. El código que exploraremos en este artículo está diseñado para registrar y analizar las consultas de búsqueda que los visitantes realizan en tu sitio WordPress.

Al registrar estas búsquedas, puedes:

  • Identificar intereses y necesidades específicas de tus usuarios.
  • Crear contenido optimizado para cubrir las consultas más frecuentes.
  • Detectar búsquedas sin resultados para evitar la frustración de los visitantes.
  • Mejorar la experiencia del usuario, lo que puede impactar positivamente en tu posicionamiento en buscadores.

En este artículo, explico cómo este código funciona, sus ventajas, y cómo implementarlo para aprovechar al máximo los datos de las búsquedas en tu sitio web.

registrar busquedas wordpress

Ventajas de Registrar las Búsquedas de los Usuarios

  1. Descubrimiento de contenido faltante
    Si los usuarios buscan algo que no tienes en tu sitio, puedes crear contenido específico para cubrir esas necesidades.
  2. Optimización de palabras clave
    Las consultas de búsqueda te revelan qué términos utilizan los visitantes, lo que puede ayudarte a optimizar tu estrategia SEO enfocándote en palabras clave relevantes.
  3. Mejor experiencia del usuario
    Al abordar las búsquedas sin resultados, reduces la frustración y mejoras la usabilidad del sitio.
  4. Monitoreo de tendencias
    Analizar las búsquedas a lo largo del tiempo te ayuda a identificar tendencias emergentes y temas populares.

Explicación Técnica del Código

El código presentado tiene múltiples componentes que trabajan juntos para registrar las búsquedas, almacenarlas en la base de datos y mostrarlas en el panel de administración de WordPress. Aquí está la explicación detallada, organizada por función:

  1. Crear una tabla personalizada para registrar las búsquedas
    Esta función utiliza las herramientas de WordPress para crear una tabla en la base de datos llamada wp_busquedas. La tabla almacena:
    • Un identificador único para cada búsqueda.
    • El término ingresado por el usuario.
    • El momento en que se realizó la búsqueda.
      La tabla se crea automáticamente al activar el tema para asegurarse de que esté disponible antes de comenzar a registrar datos.
  2. Capturar las búsquedas de los usuarios
    Se añade un script JavaScript personalizado al pie de página que:
    • Detecta inputs de tipo «search» o elementos relacionados en el sitio.
    • Registra las consultas en tiempo real cuando el usuario escribe.
    • Registra búsquedas al enviar el formulario al presionar «Enter» o hacer clic en el botón de búsqueda.
      Este script utiliza AJAX para enviar los términos de búsqueda al servidor, donde se almacenan en la base de datos.
  3. Guardar las búsquedas en la base de datos
    En el backend, WordPress recibe las solicitudes enviadas por el script y las guarda en la tabla personalizada. Este proceso incluye la validación y sanitización de los datos para garantizar la seguridad y evitar entradas maliciosas.
  4. Mostrar las búsquedas en el panel de administración
    Se crea una página en el panel de administración de WordPress donde puedes:
    • Ver un listado de las búsquedas realizadas por los usuarios.
    • Aplicar acciones masivas, como eliminar registros seleccionados.
    • Exportar los datos en formato CSV para su análisis externo.
  5. Exportar búsquedas a CSV
    Una funcionalidad adicional permite descargar todas las búsquedas en un archivo CSV. Esto es útil para analizar los datos con herramientas externas y detectar patrones o tendencias en las consultas de los usuarios.
  6. Automatizar la creación de la tabla
    Si la tabla no existe al iniciar el sitio, una función de verificación se encarga de crearla automáticamente. Esto asegura que el sistema funcione correctamente incluso si se omite la activación del tema.

El siguiente código tienes que agregarlo en el functions.php de tu tema hijo o utilizar un plugin como CODE SNIPPETS.

// Crear una tabla personalizada para almacenar las búsquedas
function crear_tabla_busquedas() {
    global $wpdb;
    $tabla_busquedas = $wpdb->prefix . 'busquedas';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $tabla_busquedas (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        busqueda TEXT NOT NULL,
        fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
add_action('after_switch_theme', 'crear_tabla_busquedas');

// Añadir el script de JavaScript para capturar las búsquedas
function script_capturar_busquedas() {
    ?>
    <script>
    document.addEventListener('DOMContentLoaded', function () {
        // Intentar localizar el campo de búsqueda usando múltiples estrategias
        const searchInput = document.querySelector('input[type="search"]') || document.querySelector('.search-field') || document.querySelector('[name="s"]');
        let lastQuery = ''; // Para evitar duplicados
        let timeout = null; // Para retrasar las peticiones mientras el usuario escribe

        if (searchInput) {
            console.log('Campo de búsqueda detectado:', searchInput);

            // Detectar cambios en tiempo real mientras el usuario escribe
            searchInput.addEventListener('input', function () {
                clearTimeout(timeout); // Reiniciar el temporizador
                timeout = setTimeout(() => {
                    const query = searchInput.value.trim();
                    if (query && query !== lastQuery && query.length > 2) {
                        lastQuery = query; // Actualizar la última búsqueda registrada
                        enviarBusqueda(query); // Enviar búsqueda en tiempo real
                    }
                }, 1000); // Espera 1 segundo tras el último carácter ingresado
            });

            // Detectar si el usuario presiona Enter o hace clic en el botón de búsqueda
            const searchForm = searchInput.closest('form'); // Buscar el formulario padre
            if (searchForm) {
                searchForm.addEventListener('submit', function () {
                    const query = searchInput.value.trim();
                    if (query && query !== lastQuery) {
                        lastQuery = query; // Actualizar la última búsqueda registrada
                        enviarBusqueda(query); // Enviar búsqueda al hacer clic o presionar Enter
                    }
                });
            }
        } else {
            console.warn('No se pudo detectar el campo de búsqueda en la página.');
        }

        // Función para enviar la búsqueda al servidor
        function enviarBusqueda(query) {
            console.log('Enviando búsqueda:', query);
            fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
                method: 'POST',
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
                body: 'action=guardar_busqueda&query=' + encodeURIComponent(query)
            }).then(response => {
                if (!response.ok) {
                    console.error('Error al guardar la búsqueda.');
                } else {
                    console.log('Búsqueda guardada exitosamente.');
                }
            }).catch(error => console.error('Error:', error));
        }
    });
    </script>
    <?php
}
add_action('wp_footer', 'script_capturar_busquedas');

// Guardar las búsquedas en la base de datos
function guardar_busqueda() {
    if (!isset($_POST['query'])) {
        wp_die('No data');
    }

    global $wpdb;
    $tabla_busquedas = $wpdb->prefix . 'busquedas';
    $query = sanitize_text_field($_POST['query']);

    $wpdb->insert($tabla_busquedas, [
        'busqueda' => $query,
        'fecha' => current_time('mysql'),
    ]);

    wp_die();
}
add_action('wp_ajax_guardar_busqueda', 'guardar_busqueda');
add_action('wp_ajax_nopriv_guardar_busqueda', 'guardar_busqueda');

// Añadir una página en el panel de administración para gestionar las búsquedas
function pagina_busquedas_admin() {
    add_menu_page(
        'Búsquedas de Usuarios',
        'Búsquedas',
        'manage_options',
        'busquedas-admin',
        'mostrar_busquedas_admin',
        'dashicons-search',
        20
    );
}
add_action('admin_menu', 'pagina_busquedas_admin');

// Mostrar las búsquedas en la página de administración
function mostrar_busquedas_admin() {
    global $wpdb;
    $tabla_busquedas = $wpdb->prefix . 'busquedas';

    // Manejo de eliminación masiva
    if (isset($_POST['accion_masiva']) && $_POST['accion_masiva'] === 'eliminar') {
        check_admin_referer('accion_masiva_busquedas', 'accion_masiva_nonce');

        if (isset($_POST['seleccionar_busquedas']) && is_array($_POST['seleccionar_busquedas'])) {
            foreach ($_POST['seleccionar_busquedas'] as $id) {
                $id = intval($id); // Sanitización del ID
                $wpdb->delete($tabla_busquedas, ['id' => $id]);
            }
        }
        echo "<script>location.href='" . admin_url('admin.php?page=busquedas-admin') . "'</script>";
        exit;
    }

    // Manejo de exportación a CSV
    if (isset($_POST['accion_masiva']) && $_POST['accion_masiva'] === 'exportar_csv') {
        check_admin_referer('accion_masiva_busquedas', 'accion_masiva_nonce');
        exportar_busquedas_csv();
    }

    // Obtener las búsquedas de la base de datos
    $busquedas = $wpdb->get_results("SELECT * FROM $tabla_busquedas ORDER BY fecha DESC");

    ?>
    <div class="wrap">
        <h1>Búsquedas de Usuarios</h1>

        <!-- Botón para exportar a CSV -->
        <form method="POST" style="margin-bottom: 10px;">
            <?php wp_nonce_field('accion_masiva_busquedas', 'accion_masiva_nonce'); ?>
            <input type="hidden" name="accion_masiva" value="exportar_csv">
            <button type="submit" class="button button-primary">Exportar a CSV</button>
        </form>

        <form method="POST">
            <?php wp_nonce_field('accion_masiva_busquedas', 'accion_masiva_nonce'); ?>

            <!-- Tabla para mostrar las búsquedas -->
            <table class="wp-list-table widefat fixed striped">
                <thead>
                    <tr>
                        <th class="manage-column column-cb check-column">
                            <input type="checkbox" id="seleccionar_todo">
                        </th>
                        <th>ID</th>
                        <th>Búsqueda</th>
                        <th>Fecha</th>
                    </tr>
                </thead>
                <tbody>
                    <?php if (!empty($busquedas)) : ?>
                        <?php foreach ($busquedas as $busqueda) : ?>
                            <tr>
                                <th scope="row" class="check-column">
                                    <input type="checkbox" name="seleccionar_busquedas[]" value="<?php echo esc_attr($busqueda->id); ?>">
                                </th>
                                <td><?php echo esc_html($busqueda->id); ?></td>
                                <td><?php echo esc_html($busqueda->busqueda); ?></td>
                                <td><?php echo esc_html(date('d/m/Y H:i', strtotime($busqueda->fecha))); ?></td>
                            </tr>
                        <?php endforeach; ?>
                    <?php else : ?>
                        <tr>
                            <td colspan="4">No hay búsquedas registradas.</td>
                        </tr>
                    <?php endif; ?>
                </tbody>
                <tfoot>
                    <tr>
                        <th class="manage-column column-cb check-column">
                            <input type="checkbox" id="seleccionar_todo_footer">
                        </th>
                        <th>ID</th>
                        <th>Búsqueda</th>
                        <th>Fecha</th>
                    </tr>
                </tfoot>
            </table>

            <!-- Acciones masivas -->
            <div style="margin-top: 10px;">
                <select name="accion_masiva" required>
                    <option value="">Acciones masivas</option>
                    <option value="eliminar">Eliminar seleccionados</option>
                </select>
                <button type="submit" class="button button-secondary">Aplicar</button>
            </div>
        </form>
    </div>

    <!-- Script para seleccionar/deseleccionar todas las filas -->
    <script>
        document.addEventListener('DOMContentLoaded', function () {
            const checkboxes = document.querySelectorAll('input[name="seleccionar_busquedas[]"]');
            const seleccionarTodo = document.getElementById('seleccionar_todo');
            const seleccionarTodoFooter = document.getElementById('seleccionar_todo_footer');

            function toggleSeleccionarTodo(checked) {
                checkboxes.forEach(checkbox => checkbox.checked = checked);
            }

            if (seleccionarTodo) {
                seleccionarTodo.addEventListener('change', function () {
                    toggleSeleccionarTodo(this.checked);
                    if (seleccionarTodoFooter) {
                        seleccionarTodoFooter.checked = this.checked;
                    }
                });
            }

            if (seleccionarTodoFooter) {
                seleccionarTodoFooter.addEventListener('change', function () {
                    toggleSeleccionarTodo(this.checked);
                    if (seleccionarTodo) {
                        seleccionarTodo.checked = this.checked;
                    }
                });
            }
        });
    </script>
    <?php
}


// Función para exportar las búsquedas a CSV
function exportar_busquedas_csv() {
    global $wpdb;
    $tabla_busquedas = $wpdb->prefix . 'busquedas';
    $busquedas = $wpdb->get_results("SELECT * FROM $tabla_busquedas ORDER BY fecha DESC");

    if (empty($busquedas)) {
        wp_die('No hay búsquedas para exportar.');
    }

    // Limpiar el buffer de salida para evitar cualquier HTML previo
    ob_clean();

    // Establecer encabezados para la descarga del archivo CSV
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="busquedas.csv"');

    // Crear un archivo temporal para almacenar el contenido del CSV
    $output = fopen('php://output', 'w');

    // Agregar encabezados al archivo CSV
    fputcsv($output, ['ID', 'Búsqueda', 'Fecha']);

    // Agregar datos al archivo CSV
    foreach ($busquedas as $busqueda) {
        fputcsv($output, [
            $busqueda->id,
            $busqueda->busqueda,
            date('d/m/Y H:i', strtotime($busqueda->fecha)), // Formato de fecha cambiado
        ]);
    }

    // Cerrar el archivo temporal
    fclose($output);

    // Detener la ejecución para evitar salida adicional
    exit;
}


// Verificar si se ha creado la tabla y si no crearla
function verificar_y_crear_tabla_busquedas() {
    global $wpdb;
    $tabla_busquedas = $wpdb->prefix . 'busquedas';

    // Verificar si la tabla ya existe
    if ($wpdb->get_var("SHOW TABLES LIKE '$tabla_busquedas'") != $tabla_busquedas) {
        // Crear la tabla si no existe
        $charset_collate = $wpdb->get_charset_collate();

        $sql = "CREATE TABLE $tabla_busquedas (
            id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
            busqueda TEXT NOT NULL,
            fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id)
        ) $charset_collate;";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);

        // Mensaje para depuración
        if ($wpdb->get_var("SHOW TABLES LIKE '$tabla_busquedas'") == $tabla_busquedas) {
            error_log("Tabla $tabla_busquedas creada exitosamente.");
        } else {
            error_log("Error al crear la tabla $tabla_busquedas.");
        }
    }
}
add_action('init', 'verificar_y_crear_tabla_busquedas');



Lenguaje del código: PHP (php)

En conclusión, registrar las búsquedas de los usuarios en tu sitio web es una estrategia valiosa para descubrir nuevas oportunidades de contenido, optimizar palabras clave y mejorar la experiencia del usuario. Aunque este código no afecta directamente al SEO, su capacidad para proporcionarte información sobre las necesidades de los usuarios lo convierte en una herramienta clave para desarrollar una estrategia basada en datos. Al implementar esta solución en tu sitio WordPress, puedes llevar tu SEO y tu contenido al siguiente nivel.

Contáctame por WhatsApp para servicios de desarrollo personalizado, ajustes en tu tienda online o cualquier solución a medida que necesites.
➡️Haz clic aquí para contactarme por WhatsApp

Nos vemos en el siguiente tutorial.

Un saludo.

5/5 - (2 votos)
Compartir Artículo

Un comentario

  1. Fran Salas Master WP 1 año atrás

    Deja tus opiniones o dudas en los comentarios.

¿Tienes una duda o sugerencia sobre este artículo?

Puedes dejar un comentario de forma anónima, sin necesidad de registrarte ni proporcionar ningún dato personal. Tu mensaje se publicará como “Usuario Anónimo No Premium”, un perfil que agrupa a todos los visitantes no registrados.

Importante: para evitar el spam automático, todos los comentarios anónimos deben comenzar con el símbolo #. Ejemplo: # Tengo una duda sobre los shortcodes personalizados...

Este espacio está destinado exclusivamente a preguntas concretas, dudas o sugerencias relacionadas con el contenido del artículo. Por respeto a los demás lectores, no se publicarán temas sin relación.

Privacidad y normas:
  • No tienes que agregar tu nombre, correo ni ningún otro dato identificativo.
  • No se permiten enlaces en comentarios anónimos.
  • No se permiten símbolos especiales como < o > (menor y mayor que), ya que se consideran intentos de insertar código y serán bloqueados.
  • Todos los comentarios anónimos pasan por revisión antes de ser publicados y solo se aprobarán si aportan valor al contenido del artículo.
¿Quieres comentar con tu nombre y que tu mensaje se publique al instante? Inicia sesión o regístrate.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

0%