GeoDirectory

Comment nous avons construit wp-rankings.com : 60 000 annonces et 16 millions de lignes sur GeoDirectory

La semaine dernière, nous avons mis wp-rankings.com en ligne.

Il suit chaque extension du dépôt WordPress.org : croissance, estimations d'installations, classements, dynamique, positions de mots-clés et comparaisons avec les concurrents.

Voici sur quoi il tourne :

Tout ça sur GeoDirectory.

La recherche passe par notre propre extension Elasticsearch, un add-on GeoDirectory que nous avons développé pour les sites à cette échelle. Nous expliquerons plus loin pourquoi nous en avions besoin.

On nous demande sans cesse jusqu'où GeoDirectory peut monter en charge. La réponse était autrefois « plus loin que vous ne le pensez, et voici quelques sites clients. » Maintenant, il existe un site public que tout le monde peut aller mettre à l'épreuve.

Cet article explique comment il a été construit.

Pourquoi ce site existe

WordPress.org affichait autrefois un graphique de croissance des installations actives sur chaque page d'extension. À un moment donné, ils l'ont supprimé. Le ticket Trac demandant son retour, #6511, est toujours ouvert.

Ce graphique était le seul moyen de voir si une extension était réellement en croissance.

Sans lui, vous obtenez un chiffre dans une catégorie, « 10 000+ installations actives », sans savoir si c'est 10 000 en pleine ascension ou 19 000 qui s'effritent silencieusement.

Ainsi, il y a 4 ans, nous avons commencé à interroger l'API des plugins WordPress.org chaque jour, à stocker les résultats, et nous avons construit wp-rankings V1.

Nous n'avons pas manqué un seul jour depuis.

4 ans de captures quotidiennes sur l'ensemble du dépôt. C'est la seule chose qu'on ne peut pas recréer après coup.

V2 est l'évolution de tout cela, avec bien plus de statistiques, et c'est ce qui se passe quand on construit enfin une interface de premier ordre pour les données.

La structure des annonces

Chaque plugin du dépôt est une annonce GeoDirectory. Un gd_place post, avec ses données dans la table de détails de GeoDirectory, wp_geodir_gd_place_detail.

40 champs personnalisés sur chacun. Installations actives, téléchargements, note, nombre d'évaluations, fils de support, fils résolus, version, testé jusqu'à, classement WordPress.org, ainsi que les valeurs que nous calculons nous-mêmes et réécrivons.

C'est la partie que les gens sous-estiment.

Les champs personnalisés GeoDirectory constituent un vrai schéma, dans une vraie table, avec de vrais types de colonnes. Nos taux de croissance calculés vivent dans des colonnes FLOAT.

Ils s'indexent, se trient, se filtrent. Ils se comportent comme des colonnes de base de données parce que c'est exactement ce qu'ils sont.

Si vous avez déjà essayé de trier une archive WordPress par une valeur de post meta sur un site d'une certaine taille, vous savez pourquoi c'est important.

Post meta est un stockage clé-valeur déguisé en schéma, et il s'effondre précisément quand vous commencez à poser des questions intéressantes.

Tout le reste dans cet article dépend de cette seule décision. Intégrez vos données dans des champs personnalisés correctement, et tout le reste devient possible.

Recherche et tri, et l'erreur que nous avons commise

Si vous ne lisez qu'une seule section de cet article, que ce soit celle-ci.

Nous avions besoin d'un tri par tendances. Ordonner l'archive par croissance sur 7 jours pour voir ce qui bouge en ce moment.

Claude Code se charge de la majeure partie de l'implémentation sur ce projet, et sa première réponse était du SQL personnalisé. Des JOINs personnalisés et un hook d'ordre personnalisé greffé sur la requête de GeoDirectory.

Ça semblait raisonnable. Ça tournait bien en local.

Sur le site en production, les performances se sont effondrées. Une recherche qui était rapide prenait désormais des dizaines de secondes.

Nous l'avons repéré immédiatement et avons demandé à l'IA de tout jeter à la poubelle pour refaire les choses à la façon de GeoDirectory.

Le bon correctif était minime. Ajouter growth_7d en tant que champ personnalisé GeoDirectory, ce qui vous donne une colonne FLOAT dans la table de détail. Calculer la valeur dans une tâche en arrière-plan. L'écrire dans le champ.

Ensuite, enregistrer le tri avec le système de tri natif de GeoDirectory et laisser GeoDirectory trier par ce champ, comme il trie par n'importe quel autre. growth_7d_desc. C'est tout.

Rapide à nouveau. Sur 60 000 annonces.

Voici la leçon à retenir, et elle dépasse largement ce projet.

Les outils de codage IA reconstruiront votre infrastructure par défaut. Confiez-leur un problème de tri, et ils se tourneront vers SQL parce qu'ils l'ont vu un million de fois lors de leur entraînement.

Ils ne savent pas que Stiofan a passé des années à optimiser la couche de requêtes de GeoDirectory pour les grands ensembles de données.

Ils ne savent pas que tout ce qu'ils s'apprêtent à construire a déjà été construit, testé en production et peaufiné pendant une décennie.

Ils livreront en toute confiance une version dégradée d'un problème déjà résolu, et seront très fiers d'eux-mêmes.

Donc si vous utilisez Claude ou ChatGPT sur un site GeoDirectory, l'instruction la plus précieuse que vous puissiez lui donner est celle-ci :

Ne contournez pas l'infrastructure native de recherche, de tri et de filtrage de GeoDirectory. Étendez-la avec des champs personnalisés.

C'est à ça que servent les champs personnalisés. C'est toute l'astuce.

Là où GeoDirectory s'arrête, et où notre code commence

Nous avons 2 plugins personnalisés.

Le premier est le scraper. Stiofan l'a développé il y a 4 ans, et il n'a qu'une seule tâche : interroger l'API des plugins WordPress.org chaque jour et écrire ce qu'il trouve dans les annonces. C'est grâce à lui que l'ensemble de données existe, et il tourne discrètement depuis lors.

Le second est le plugin d'analytique, nouveau dans la V2. Il possède la table de snapshots de 16,2 millions de lignes. Une ligne par plugin par jour : position dans le classement, tranche d'installations, nombre d'installations estimé, taux de croissance, état de momentum.

Les séries temporelles ne sont pas du ressort d'un annuaire, et nous ne demanderions jamais à GeoDirectory de s'en charger. Cette table possède son propre schéma, ses propres index et ses propres tâches en arrière-plan, et elle se situe entièrement en dehors de GeoDirectory.

Mais les résultats reviennent.

Le plugin d'analytique effectue le gros du travail sur ses propres données, puis écrit les résultats dans les champs personnalisés de GeoDirectory. Un taux de croissance sur 7 jours est calculé à partir de millions de lignes de données historiques et apparaît sous la forme d'un simple FLOAT dans la fiche.

Du point de vue de GeoDirectory, c'est simplement un champ comme un autre. Il le trie, le filtre et l'affiche comme n'importe quel autre.

Calcul à l'extérieur. Stockage à l'intérieur. Laissez GeoDirectory interroger les données.

C'est l'architecture en 3 lignes, et c'est pourquoi le site est rapide malgré un jeu de données très volumineux. La requête d'archive ne touche jamais les 16 millions de lignes. Elle lit un seul chiffre calculé il y a plusieurs heures.

La page de fiche individuelle

La page de plugin est un tableau de bord. Carte de métriques, nombre d'installations actives estimé avec un indice de confiance, graphiques de croissance sur 30 jours, 90 jours, 1 an et depuis le début, un classificateur de momentum, une projection vers le prochain palier, statistiques d'avis et de support, classements par mots-clés sur WordPress.org, et une carte de comparaison avec jusqu'à 3 concurrents.

Sous le capot, c'est une page de fiche individuelle GeoDirectory standard avec le thème Blockstrap de base. Aucun thème personnalisé.

Le tableau de bord lui-même est notre code. Chart.js, alimenté par les champs personnalisés. Un utilisateur lambda de Blockstrap ne pourrait pas le construire à la main, et il ne sert à rien de prétendre le contraire.

Voilà ce qu'il faut dire tout haut, cependant : ils n'ont plus à le construire à la main.

Il y a 2 ans, une page comme celle-ci nécessitait d'embaucher un développeur pendant des semaines.

Aujourd'hui, vous décrivez ce que vous voulez, et une IA le construit. Graphiques, cartes, tableaux de comparaison et badges conditionnels.

C'est presque banal maintenant, parce que la partie difficile était déjà faite. Les données étaient stockées dans les champs personnalisés GeoDirectory, structurées, typées et interrogeables.

L'IA excelle à construire sur une couche de données propre. Elle est très mauvaise pour en inventer une.

Donnez-lui un champ personnalisé bien structuré et demandez-lui un graphique de croissance, et vous l'aurez avant l'heure du déjeuner. Laissez-la concevoir votre couche de requêtes, et elle cassera votre site avec enthousiasme — nous en avons fait l'expérience.

La répartition est donc simple. GeoDirectory gère les données et les requêtes. L'IA construit tout ce que vous voulez par-dessus.

Faites-le dans cet ordre, et ce type de site est à la portée d'une seule personne.

Les archives

C'est là que tout ce qui précède porte ses fruits.

La page tendances affiche les plugins avec au moins 10 000 installations actives, classés par vitesse de croissance sur 7 jours. Rang, plugin, évolution sur 24 heures, évolution sur 7 jours, pourcentage de croissance et installations actives estimées.

L'ensemble est un bloc GeoDirectory Listings.

Le bloc de listings natif de GeoDirectory, trié par une option de tri GeoDirectory, lisant les champs personnalisés GeoDirectory. Le tri tendances s'intègre dans le système de tri de GeoDirectory aux côtés de tous les autres tris, ce qui lui permet de fonctionner partout où les listings fonctionnent.

Il n'y a pas de SQL personnalisé nulle part.

La page statistiques y mène directement.

Chaque tranche d'installations sur cette page est un lien vers les tendances avec le seuil déjà appliqué, donc « montrez-moi les plugins au-dessus de 100 000 installations qui progressent » ne prend qu'un seul clic.

Importez les données dans des champs personnalisés, enregistrez le tri correctement, et les archives s'assemblent d'elles-mêmes à partir des composants déjà fournis par GeoDirectory.

Le processus de réclamation

Les propriétaires de plugins peuvent réclamer leur listing. Il s'agit de la fonctionnalité de réclamation native de GeoDirectory, avec notre logique de vérification ajoutée par-dessus.

Nous vérifions le Plugin URI : du plugin, celui présent dans le fichier PHP principal, et vérifions que le réclamant contrôle ce domaine.

Vérification par e-mail, approbation automatique au clic.

Environ 100 plugins ont été réclamés la première semaine.

Le même principe qu'ailleurs sur ce site.

GeoDirectory fournit la fonctionnalité. Vos règles métier se posent par-dessus.

Trafic, vitesse et la question Elasticsearch

Le lancement a été propulsé presque exclusivement par X.

Le post s'est répandu largement, quelques personnalités influentes de l'univers WordPress l'ont relayé, et le trafic est arrivé en une seule vague.

3 000 vrais humains le jour du lancement. Pas répartis uniformément sur 24 heures, mais concentrés sur quelques-unes d'entre elles.

Un mot sur la mesure, car c'est un piège courant. Cloudflare a rapporté 72 000 visiteurs uniques sur cette période. Les journaux serveur indiquaient environ 3 000 humains. Le reste, c'était des bots.

Si vous communiquez le trafic d'un annuaire à un client, vérifiez les journaux serveur avant de vous réjouir.

La stack a tenu. GeoDirectory Cloud, Cloudflare en frontal, cache LiteSpeed.

Rien d'exotique.

Google PageSpeed lui attribue 92, et nous n'avons pas encore commencé à optimiser (ça viendra une fois la bêta terminée).

Maintenant, soyons honnêtes.

La recherche sur ce site passe par notre propre extension Elasticsearch pour GeoDirectory.

Avec 60 000 annonces, 40 champs personnalisés et un tri sur des valeurs calculées, la recherche combinée au tri personnalisé commençait à être plus lente que souhaité.

MySQL faisait plus de travail qu'il n'aurait dû.

La plupart des annuaires n'approcheront jamais ces volumes.

La recherche native de GeoDirectory est rapide, et si vous gérez quelques milliers d'annonces, c'est déjà la bonne solution. Nous vous le dirions franchement.

wp-rankings est véritablement à l'extrémité de la courbe, et l'extension Elasticsearch est quelque chose que nous installons et configurons sur des projets sur mesure pour des sites qui ont dépassé les limites de MySQL.

L'essentiel, c'est qu'elle s'intègre à la couche de recherche de GeoDirectory.

Elle remplace le moteur en dessous, et tout ce qui se trouve au-dessus reste natif. GeoDirectory garde la main sur la recherche, le tri et le filtrage.

Même principe qu'avant, mais dans l'autre sens.

Travaillez avec l'infrastructure de GeoDirectory, jamais en contournant. L'une de ces approches fait monter le site en charge. L'autre le brise.

Le reste de la pile

UsersWP pour les comptes, la connexion, l'inscription et les profils.

Blockstrap, plus le plugin de création de pages Blockstrap, pour les modèles et tout ce qui est visuel.

Turnstile à la connexion et à l'inscription, via AyeCode Connect.

GetPaid et UsersWP Membership pour le niveau premium si la demande se confirme. Nous ne l'avons pas encore développé.

La demande que nous n'avions pas anticipée, c'est la publicité.

Une demi-douzaine de personnes ont déjà demandé à sponsoriser le site, donc le GeoDirectory Advertising add-on sera intégré prochainement, en libre-service, afin que les sponsors puissent acheter leurs propres emplacements sans que nous ayons à intervenir.

Toute la pile AyeCode, qui fait ce pour quoi elle a été conçue. Rien ici n'est un contournement.

Ce que cela démontre

« Jusqu'où GeoDirectory peut-il monter en charge ? » était autrefois une question à laquelle nous répondions avec un haussement d'épaules et une liste de sites clients.

Maintenant, il y en a un public que vous pouvez aller mettre à l'épreuve.

60 000 annonces. 40 champs personnalisés sur chacune. 16 millions de lignes d'historique derrière elles.

Un pic de trafic qui ferait s'effondrer la plupart des sites d'annuaires, absorbé sans broncher.

Nous étions deux à le construire.

La majeure partie de l'implémentation a été assistée par IA, et les seuls vrais problèmes sont survenus quand nous avons laissé l'IA revoir la plomberie de GeoDirectory au lieu de l'utiliser telle quelle.

Allez voir : wp-rankings.com

Si vous voulez construire quelque chose de similaire, vous savez déjà sur quoi ça tourne.