Cómo construimos wp-rankings.com: 60.000 listados y 16 millones de filas en GeoDirectory
La semana pasada, pusimos wp-rankings.com en vivo.
Rastrea cada plugin del repositorio de WordPress.org: crecimiento, estimaciones de instalaciones, rankings, tendencias, posiciones de palabras clave y comparativas con la competencia.
Esto es lo que usa:
- Más de 60 000 listados
- 40 campos personalizados en cada uno de ellos
- 16,2 millones de filas de datos históricos detrás
- 3 000 visitantes humanos reales el día del lanzamiento, la mayoría en pocas horas
- Más de 10 000 usuarios únicos en los primeros 5 días, todavía en beta
- Puntuación de 92 en Google PageSpeed, sin haber realizado ningún trabajo de optimización
Todo ello sobre GeoDirectory.
La búsqueda funciona a través de nuestra propia extensión de Elasticsearch, un complemento de GeoDirectory que desarrollamos para sitios a esta escala. Más adelante explicamos por qué lo necesitábamos.
La gente nos pregunta constantemente hasta dónde escala GeoDirectory. La respuesta solía ser "más de lo que crees, y aquí tienes algunos sitios de clientes." Ahora hay un sitio público que cualquiera puede visitar y poner a prueba.
Esta publicación explica cómo se construyó.
Por qué existe el sitio
WordPress.org solía mostrar un gráfico de crecimiento de instalaciones activas en cada página de plugin. En algún momento, lo eliminaron. El ticket de Trac que solicita su regreso, #6511, sigue abierto.
Ese gráfico era la única forma de ver si un plugin realmente estaba creciendo.
Sin él, obtienes un número en un rango, "más de 10 000 instalaciones activas," sin saber si son 10 000 en rápido ascenso o 19 000 en silenciosa caída libre.
Así que, hace 4 años, empezamos a consultar la API de plugins de WordPress.org cada día, almacenando los resultados, y construimos wp-rankings V1.
No hemos faltado un solo día desde entonces.
4 años de instantáneas diarias de todo el repositorio. Eso es algo que no puedes ir a crear después.
V2 es la evolución de eso, con muchas más estadísticas, y es lo que ocurre cuando por fin construyes un front end de primera clase para los datos.
La estructura de los listados
Cada plugin del repositorio es un listado de GeoDirectory. Un gd_place post, con sus datos en la tabla de detalles de GeoDirectory, wp_geodir_gd_place_detail.
40 campos personalizados en cada uno. Instalaciones activas, descargas, valoración, número de valoraciones, hilos de soporte, hilos resueltos, versión, probado hasta, ranking en WordPress.org, además de los valores que calculamos nosotros mismos y escribimos de vuelta.
Esta es la parte que la gente subestima.
Los campos personalizados de GeoDirectory son un esquema real, en una tabla real, con tipos de columna reales. Nuestras tasas de crecimiento calculadas viven en columnas FLOAT.
Se indexan, se ordenan, se filtran. Se comportan como columnas de base de datos porque eso es lo que son.
Si alguna vez has intentado ordenar un archivo de WordPress por un valor de post meta en un sitio de cualquier tamaño, sabes por qué esto importa.
El post meta es un almacén clave-valor disfrazado de esquema, y se rompe exactamente cuando empiezas a hacer preguntas interesantes.
Todo lo demás en esta publicación depende de esta decisión. Mete tus datos en campos personalizados correctamente, y el resto se vuelve posible.
Búsqueda y ordenación, y el error que cometimos
Si lees una sola sección de esta publicación, que sea esta.
Necesitábamos una ordenación por tendencias. Ordenar el archivo por crecimiento en 7 días para ver qué se está moviendo ahora mismo.
Claude Code se encarga de la mayor parte de la implementación en este proyecto, y su primera respuesta fue SQL personalizado. JOINs personalizados y un hook de order-by personalizado enganchado a la consulta de GeoDirectory.
Parecía razonable. Funcionaba bien en local.
En el sitio en producción, el rendimiento se desplomó. Una búsqueda que antes era rápida tardaba decenas de segundos.
Lo detectamos de inmediato y le pedimos a la IA que descartara todo y lo hiciera a la manera de GeoDirectory.
La corrección correcta era pequeña. Añadir growth_7d como campo personalizado de GeoDirectory, lo que te da una columna FLOAT en la tabla de detalle. Calcular el valor en un proceso en segundo plano. Escribirlo en el campo.
Luego registrar el ordenamiento con el propio sistema de ordenación de GeoDirectory y dejar que GeoDirectory ordene por él, igual que ordena por cualquier otra cosa. growth_7d_desc. Listo.
Rápido de nuevo. Con 60.000 listados.
Aquí está la lección, y va mucho más allá de este proyecto.
Las herramientas de codificación con IA reconstruirán tu infraestructura por defecto. Dale un problema de ordenación y recurrirá a SQL porque lo ha visto un millón de veces en su entrenamiento.
No sabe que Stiofan pasó años optimizando la capa de consultas de GeoDirectory para grandes conjuntos de datos.
No sabe que todo lo que está a punto de construir ya ha sido construido, probado en producción y pulido durante más de una década.
Con toda la confianza del mundo, entregará una versión peor de un problema ya resuelto, y estará muy satisfecha consigo misma.
Así que si usas Claude o ChatGPT en un sitio GeoDirectory, la instrucción más valiosa que puedes darle es esta:
No eludas la infraestructura nativa de búsqueda, ordenación y filtrado de GeoDirectory. Extiéndela con campos personalizados.
Para eso son los campos personalizados. Ese es todo el truco.
Dónde termina GeoDirectory y dónde empieza nuestro código
Tenemos 2 plugins personalizados.
El primero es el scraper. Stiofan lo construyó hace 4 años y tiene un único trabajo: consultar la API de plugins de WordPress.org cada día y escribir lo que encuentra en los listados. Es la razón por la que el conjunto de datos existe, y ha estado funcionando en silencio desde entonces.
El segundo es el plugin de analíticas, nuevo en V2. Gestiona la tabla de instantáneas con 16,2 millones de filas. Una fila por plugin por día: posición en el ranking, tramo de instalaciones, instalaciones estimadas, tasa de crecimiento, estado de impulso.
Las series temporales no son tarea de un directorio, y nunca le pediríamos eso a GeoDirectory. Esa tabla tiene su propio esquema, índices y procesos en segundo plano, y reside completamente fuera de GeoDirectory.
Pero los resultados regresan.
El plugin de analíticas realiza el trabajo pesado con sus propios datos y luego escribe el resultado en los campos personalizados de GeoDirectory. Una tasa de crecimiento a 7 días se calcula a partir de millones de filas de datos históricos y aparece como un único FLOAT en el listado.
Desde la perspectiva de GeoDirectory, es simplemente otro campo más. Lo ordena, lo filtra y lo muestra como cualquier otro.
Calcular fuera. Almacenar dentro. Dejar que GeoDirectory consulte.
Esa es la arquitectura en 3 líneas, y es por eso que el sitio es rápido a pesar de trabajar con un conjunto de datos muy grande. La consulta del archivo nunca toca los 16 millones de filas. Lee un único número que fue calculado horas antes.
La página de listado individual

La página del plugin es un panel de control. Tarjeta de métricas, instalaciones activas estimadas con una valoración de confianza, gráficos de crecimiento a 30 días, 90 días, 1 año y desde siempre, un clasificador de impulso, una proyección al siguiente hito, estadísticas de reseñas y soporte, rankings de palabras clave en WordPress.org y una tarjeta de comparación con hasta 3 competidores.
Por debajo, es una página de listado individual estándar de GeoDirectory con el tema Blockstrap predeterminado. Sin tema personalizado.
El panel de control en sí es nuestro código. Chart.js, alimentado por los campos personalizados. Un usuario habitual de Blockstrap no podría construir eso a mano, y no tiene sentido fingir lo contrario.
Pero he aquí algo que vale la pena decir en voz alta: ya no tienen que construirlo a mano.
Hace 2 años, una página como esta significaba contratar a un desarrollador durante semanas.
Hoy, describes lo que quieres y una IA lo construye. Gráficos, tarjetas, tablas de comparación e insignias condicionales.
Ahora es casi trivial porque la parte difícil ya estaba hecha. Los datos estaban almacenados en campos personalizados de GeoDirectory, estructurados, tipados y consultables.
La IA es muy buena construyendo sobre una capa de datos limpia. Es muy mala inventándola.
Dale un campo personalizado bien estructurado y pídele un gráfico de crecimiento, y lo tendrás antes de comer. Deja que diseñe tu capa de consultas, y alegremente te romperá el sitio, como descubrimos.
Así que la división es sencilla. GeoDirectory gestiona los datos y las consultas. La IA construye lo que quieras encima.
Hazlo en ese orden, y este tipo de sitio está al alcance de una sola persona.
Los archivos

Aquí es donde todo lo anterior da sus frutos.
La página de tendencias muestra plugins con al menos 10.000 instalaciones activas, ordenados por la velocidad a la que están creciendo en 7 días. Posición, plugin, movimiento en 24 horas, movimiento en 7 días, porcentaje de crecimiento e instalaciones activas estimadas.
Todo ello es un bloque de Listados de GeoDirectory.
El propio bloque de listados de GeoDirectory, ordenado por una opción de ordenación de GeoDirectory, leyendo campos personalizados de GeoDirectory. El ordenamiento por tendencia se integra en el sistema de ordenación de GeoDirectory junto a todos los demás criterios, por lo que funciona en cualquier lugar donde funcionen los listados.
No hay SQL personalizado en ninguna parte.
La página de estadísticas enlaza directamente con él.

Cada grupo de instalaciones en esa página es un enlace que filtra por tendencia con el umbral ya aplicado, así que "muéstrame los plugins con más de 100.000 instalaciones que están en alza" es un solo clic.
Introduce los datos en campos personalizados, registra el ordenamiento correctamente, y los archivos se ensamblan solos a partir de los componentes que GeoDirectory ya incluye.
El flujo de reclamación
Los propietarios de plugins pueden reclamar su listado. Esa es la función nativa de reclamación de GeoDirectory, con nuestra lógica de verificación añadida encima.
Verificamos el campo Plugin URI: del encabezado, el que está en el archivo PHP principal, y comprobamos que el solicitante controla ese dominio.
Verificación por correo electrónico, aprobación automática con un clic.
Alrededor de 100 plugins fueron reclamados en la primera semana.
El mismo patrón que en el resto del sitio.
GeoDirectory incluye la función. Tus reglas de negocio se añaden encima.
Tráfico, velocidad y la cuestión de Elasticsearch
El lanzamiento fue impulsado casi por completo desde X.
La publicación se viralizó, algunas personas de alto perfil en el ecosistema de WordPress la compartieron, y el tráfico llegó de golpe.
3.000 personas reales el día del lanzamiento. No distribuidas uniformemente a lo largo de 24 horas, sino concentradas en unas pocas.
Una nota sobre la medición, porque esto suele sorprender a la gente. Cloudflare reportó 72.000 visitantes únicos en ese periodo. Los registros del servidor indicaban alrededor de 3.000 personas reales. El resto eran bots.
Si le vas a reportar el tráfico del directorio a un cliente, revisa los registros del servidor antes de celebrar.
El stack aguantó. GeoDirectory Cloud, Cloudflare por delante, caché con LiteSpeed.
Nada exótico.
Google PageSpeed le da 92, y aún no hemos empezado a optimizar (eso ocurrirá cuando termine la beta).
Ahora la parte honesta.
La búsqueda en este sitio funciona a través de nuestra propia extensión de Elasticsearch para GeoDirectory.
Con 60.000 listados y 40 campos personalizados, y ordenamiento por valores calculados, la búsqueda combinada con el ordenamiento personalizado empezaba a ser más lenta de lo que queríamos.
MySQL estaba haciendo más trabajo del necesario.
La mayoría de los directorios nunca llegarán a eso.
La búsqueda nativa de GeoDirectory es rápida, y si gestionas unos pocos miles de listados, ya es la respuesta correcta. Así te lo diríamos.
wp-rankings está genuinamente en el extremo más alto de la curva, y la extensión de Elasticsearch es algo que instalamos y configuramos en proyectos a medida para sitios que han superado los límites de MySQL.
Lo importante es que se integra en la capa de búsqueda de GeoDirectory.
Cambia el motor por debajo, y todo lo que hay encima permanece nativo. GeoDirectory sigue siendo el dueño de la búsqueda, el ordenamiento y el filtrado.
El mismo principio de antes, pero desde el otro lado.
Trabaja con la infraestructura de GeoDirectory, nunca en torno a ella. Una de esas dos opciones escala el sitio. La otra lo rompe.
El resto del stack
UsersWP para cuentas, inicio de sesión, registro y perfiles.
Blockstrap, más el plugin de maquetación Blockstrap, para las plantillas y todo lo visual.
Turnstile en el inicio de sesión y el registro, a través de AyeCode Connect.
GetPaid y UsersWP Membership para el nivel premium si la demanda resulta ser real. Aún no lo hemos desarrollado.
La demanda que no esperábamos es la de publicidad.
Ya hay media docena de personas que han pedido patrocinar el sitio, así que el GeoDirectory Advertising add-on es lo próximo que se añadirá, de forma autoservicio, para que los patrocinadores puedan comprar sus propios espacios sin que nosotros tengamos que intervenir.
Todo el stack de AyeCode, haciendo lo que fue creado para hacer. Nada aquí es un parche.
Qué demuestra esto
"¿Hasta dónde escala GeoDirectory?" solía ser una pregunta que respondíamos con un encogimiento de hombros y una lista de sitios de clientes.
Ahora hay uno público al que puedes ir e intentar romper.
60.000 listados. 40 campos personalizados en cada uno. 16 millones de filas de historial detrás de ellos.
Un pico de tráfico que habría tumbado a la mayoría de los sitios de directorio, absorbido sin el menor temblor.
Lo construimos dos personas.
La mayor parte de la implementación fue asistida por IA, y el único momento en que tuvimos problemas de verdad fue cuando dejamos que la IA rediseñara la arquitectura interna de GeoDirectory en lugar de usarla.
Échale un vistazo: wp-rankings.com
Si quieres construir algo parecido, ya sabes en qué se basa.
Boletín - ¡Mantente al día!
Recibe las últimas noticias, consejos y contenido exclusivo directamente en tu bandeja de entrada.