WordPress Multi-multisite: une étude de cas
Le défi: Créer un tableau de bord d'administration WordPress pour afficher efficacement les données Google Analytics à partir d'environ 900 blogs répartis sur 25 instances multisites. La clé était de surmonter les obstacles de performance inhérents au traitement d'un ensemble de données aussi important.
Cet article détaille le processus de développement, mettant en évidence les décisions et les défis clés rencontrés. Nous explorerons l'API WordPress REST, le débat PHP contre JavaScript, les limitations de l'environnement de production, les considérations de sécurité, la conception de la base de données et même le rôle de l'IA.
Terminologie clé
Avant de plonger, clarifions certains termes:
- WordPress MultiSite: Une fonctionnalité WordPress principale permettant la gestion de plusieurs blogs à partir d'une seule installation. Les blogs partagent les fichiers de base et la base de données, mais ont des dossiers de médias individuels et des tables de base de données spécifiques au blog.
- WordPress Multi- MultiSite: Un terme pour gérer plusieurs instances d'installations multisites WordPress. Cette approche évite les complexités de partage d'une seule multisite entre différents clients.
- Site de tableau de bord: Le site hébergeant le tableau de bord personnalisé pour afficher les données d'analyse agrégées.
- Sites clients: Les 25 instances multisites WordPress à partir desquelles les données sont collectées.
Stratégie de mise en œuvre
La solution impliquait un seul plugin WordPress installé sur le site du tableau de bord et les 25 sites clients. Ce plugin a deux fonctions principales:
- expose les données via des points de terminaison de l'API personnalisés sur les sites clients.
- Arrache les données des sites clients sur le site du tableau de bord, le met en cache et l'affiche sur le tableau de bord.
L'API WordPress REST: The Foundation
L'API WordPress REST était au cœur de ce projet. Son extensibilité a permis à la création de points de terminaison personnalisés d'exposer les données nécessaires.
Extrait de code: enregistrement des points de terminaison API
<?php [...] function register(\WP_REST_Server $server) { $endpoints = $this->get(); foreach ($endpoints as $endpoint_slug => $endpoint) { register_rest_route( $endpoint['namespace'], $endpoint['route'], $endpoint['args'] ); } } // ... (rest of the endpoint definitions) ...
PHP vs JavaScript: l'avantage asynchrone
Initialement, une approche basée sur PHP a été prise en compte. Cependant, le traitement synchrone PHP et les limites de temps d'exécution côté serveur rendent cela impraticable. Les capacités asynchrones de JavaScript offraient une solution supérieure, permettant la récupération concomitante de données de tous les sites.
L'implémentation JavaScript a considérablement réduit le temps de récupération des données: de 925 secondes estimées (synchrone) à environ 2 secondes (asynchrones). Cependant, les limites de demande de navigateur et de serveur ont nécessité un délai de 150 millierscondes entre les demandes.
Extrait de code: les données asynchrones récupérant
async function getBlogsDetails(blogs) { let promises = []; blogs.forEach((blog, index) => { // ... (code for delayed fetch requests) ... }); // ... (code for Promise.all and error handling) ... }
Connexion PHP et JavaScript
Les points de terminaison PHP et le code JavaScript ont été intégrés à l'aide de wp_localize_script()
, passant de manière transparente des URL de point de terminaison et d'autres données nécessaires au javascript.
Sécurité: authentification et CORS
La sécurité a été traitée via les mots de passe de l'application pour l'authentification de l'API et les en-têtes CORS (partage de ressources croisées) afin d'autoriser les demandes de domaine transversal du site du tableau de bord vers les sites clients. Le principe du moindre privilège a été suivi, restreignant l'accès aux COR uniquement aux points de terminaison nécessaires.
Extrait de code: implémentation de l'en-tête CORS
<?php [...] function register(\WP_REST_Server $server) { $endpoints = $this->get(); foreach ($endpoints as $endpoint_slug => $endpoint) { register_rest_route( $endpoint['namespace'], $endpoint['route'], $endpoint['args'] ); } } // ... (rest of the endpoint definitions) ...
Cache de base de données
Pour améliorer les performances, les données sont mises en cache dans une table de base de données personnalisée sur le site du tableau de bord, en utilisant un modèle de base de données relationnel. Le schéma de la base de données a été initialement conçu à l'aide de DocBlocks puis affiné avec l'aide d'un LLM.
Extrait de code: Création de table de base de données SQL
async function getBlogsDetails(blogs) { let promises = []; blogs.forEach((blog, index) => { // ... (code for delayed fetch requests) ... }); // ... (code for Promise.all and error handling) ... }
Résultats et considérations futures
Le MVP est fonctionnel, fournissant des informations précieuses sur les modèles de trafic de blog. Les améliorations futures pourraient inclure l'utilisation d'un framework JavaScript moderne et explorer des solutions sans serveur comme AWS Lambda pour une évolutivité et des performances améliorées. L'utilisation de travaux cron pour la compilation de données préventives est également une amélioration potentielle.
Cet article donne un aperçu de haut niveau du processus de développement. Les défis et solutions spécifiques rencontrés offrent des informations précieuses aux développeurs travaillant avec des déploiements multi-multisites WordPress à grande échelle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Il est sorti! Félicitations à l'équipe Vue pour l'avoir fait, je sais que ce fut un effort massif et une longue période à venir. Tous les nouveaux documents aussi.

Avec la récente montée du prix du bitcoin sur 20k $ USD, et pour lui, récemment en train de briser 30k, je pensais que cela valait la peine de reprendre une profonde plongeon dans la création d'Ethereum

J'ai eu quelqu'un qui écrivait avec cette question très légitime. Lea vient de bloguer sur la façon dont vous pouvez obtenir les propriétés CSS valides elles-mêmes du navigateur. C'est comme ça.

L'autre jour, j'ai repéré ce morceau particulièrement charmant sur le site Web de Corey Ginnivan où une collection de cartes se cassent les uns sur les autres pendant que vous faites défiler.

Je dirais que "Site Web" correspond mieux que "Application mobile" mais j'aime ce cadrage de Max Lynch:

Si nous devons afficher la documentation à l'utilisateur directement dans l'éditeur WordPress, quelle est la meilleure façon de le faire?

Il existe un certain nombre de ces applications de bureau où l'objectif montre votre site à différentes dimensions en même temps. Vous pouvez donc, par exemple, écrire

Questions sur les zones de slash violet dans les dispositions flexibles Lorsque vous utilisez des dispositions flexibles, vous pouvez rencontrer des phénomènes déroutants, comme dans les outils du développeur (D ...
