¿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.

Ventajas de Registrar las Búsquedas de los Usuarios
- Descubrimiento de contenido faltante
Si los usuarios buscan algo que no tienes en tu sitio, puedes crear contenido específico para cubrir esas necesidades. - 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. - Mejor experiencia del usuario
Al abordar las búsquedas sin resultados, reduces la frustración y mejoras la usabilidad del sitio. - 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:
- 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 llamadawp_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.
- 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.
- 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. - 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.
- 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. - 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.




Deja tus opiniones o dudas en los comentarios.