Le te de l’application concerne WordPress et je vais en discuter dans un autre article.
Je veux parler drsquoune façon drsquointégrer les boucles EDD et EDD aux applications externes. Ce dont nous avons besoin, crsquoest drsquoenvoyer une demande drsquoapi à lrsquoapplication chaque fois qursquoun abonnement est créé, mis à jour ou créé. En outre, cette logique doit être limitée à des abonnements spécifiques, car nous avons de nombreux autres types de produits basés sur les abonnements. Cette partie de cet article est basée sur le plug in que jrsquoai écrit pour gérer lrsquointeraction des EDD fonctionnant sur les formulaires Caldera. Com et Caldera forms pro. Bien qursquoil srsquoagisse drsquoun plug in spécifique au site et qursquoil ne puisse peut être pas être réutilisé tel quel, jrsquoespère que drsquoautres peuvent apprendre en lisant et en copiant.
La séparation de la logique de la récupération EDD de lrsquoAPI plug in fournit tous les crochets nécessaires pour qursquoelle fonctionne. Mais avant de me lier à ces événements, jrsquoai créé la logique nécessaire dans les classes complètement découplées de ces crochets. Cela rend mon code plus facile à tester, ce qui signifie également qursquoil est plus facile à utiliser lorsque jrsquoai besoin drsquoautres façons de traiter les abonnements. La première étape consiste à créer une classe drsquoabonnement pour gérer toute la logique de cet abonnement. Dans un récent article de Torque, jrsquoa i discuté des modèles décoratifs comme alternative à lrsquoextension de classe. Parce que je pense que cet objet drsquoabonnement a une responsabilité fondamentalement différente de la classe drsquoabonnement EDD U, jrsquoa i choisi de modifier la classe drsquoabonnement EDD U au lieu de lrsquoétendre.
Je dis
Crsquoest très simple. Lrsquoabonnement EDD _ a une méthode Get Status (). Mais ce que je veux vraiment savoir, crsquoest si cet état représente un abonnement actif. Abonnement = $abonnement
}
* *
Renvoie booléen
*
Fonction commune statusactive (): bool
{Y}
Retour en _ array ($this gt Subscription gt get Status () [retour en array ($this gt Subscription gt get Status ()]
« activité»,
]
}
Cette méthode peut être utilisée lors de diverses opérations qui se produisent lorsque lrsquoabonnement change. Mais avant de vérifier, je pense qursquoil serait utile de créer une usine pour ces articles, qui pourrait déterminer si lrsquoabonnement EDD est utilisé pour les produits SaaS. nrsquoêtes pas familier avec ce modèle, jrsquoai discuté du modèle drsquousine dans lrsquoarticle précédent.
Ce code suppose qursquoune variable drsquoenvironnement fournit un ID de produit pour le produit drsquoabonnement. la configuration WordPress n’utilise pas de variables d’environnement, pouvez utiliser des constantes. ID amp (int) $abonnement gt produit _ id = = (int) $ENV [lsquoSaaS Product idrsquo]
}
} cela nous donne un moyen drsquoobtenir des articles drsquoabonnement en vérifiant si les articles drsquoabonnement sont appropriés pour le bon produit.
Comme je lrsquoai déjà dit, il est important pour moi de garder toute la logique découplée de lrsquoAPI plug in, mais cela ne signifie pas qursquoelle nrsquoa pas à être associée aux actions activées par EDD lors de la création, de la mise à jour, de lrsquoabonnement ou du renouvellement. Jrsquoa i utilisé une classe Hooks pour gérer lrsquointeraction avec lrsquoAPI plug in. Dans chaque rappel, si la classe drsquoabonnement est le bon produit, appelez la méthode Factory pour lrsquoobtenir. Comme cette méthode renvoie NULL, une condition simple empêche lrsquoexécution de code supplémentaire lorsque ces crochets ne sont pas nécessaires.
Voici le schéma de cette classe: Statoactive () {
Appeler la création drsquoapi distante
}
}
* *
Le contenu de lrsquoapplication peut être annulé ou créé après la mise à jour de lrsquoabonnement
* *
Utiliser
Mise à jour _ abonnement
* *
Paramètre $id
*
Abonnement à la fonction publique _ mis à jour ($ID)
$abonnement = usine:: abonnement ($ID)
($abonnement amp $abonnement gt actif ()) {
Appeler lrsquoAPI distante pour la mise à jour
} ElseIf ($Subscription amp! $Subscription gt Activity ()}
Appeler lrsquoAPI distante pour annuler
}
}
* *
* suivez notre logique lors de la désabonnement
* *
Utiliser EDD _ Subscription cancelled
* *
Param int $ID Subscription id
*
Abonnement à la fonction publique _ annulé ($ID)
$abonnement = usine:: abonnement ($ID)
($abonnement)
Appeler lrsquoAPI distante pour annuler
}
}
} ce que faites dans ces conditions dépend de la façon dont votre application fonctionne. voulez voir comment je gère mon application, pouvez lire le code source ici.
Vendre l’accès aux paramètres de l’api de repos WordPress de nombreux produits SaaS vendent l’accès à l’api. Il peut srsquoagir de lrsquoensemble du produit, et lrsquoAPI Google Maps en est un exemple: ils limitent leur API et pouvez acheter drsquoautres demandes. Dans drsquoautres cas, les produits SaaS incluent lrsquointerface, qui peut être utilisée un nombre limité de fois par mois, ce qui nécessite techniquement un paramètre API à débit limité. Même si le produit SaaS nrsquoest pas basé sur une limite de vitesse, par exemple, il srsquoagit drsquoun abonnement mensuel ou annuel, si utilisez lrsquoAPI rest, devez toujours contrôler lrsquoaccès par abonnement.
Dans cette partie de je vais discuter d’une approche basée sur l’abonnement pour contrôler l’accès à l’api WordPress rest et fournir des réponses significatives aux erreurs qui peuvent être utilisées dans l’application. En fait, jrsquoa i créé un plug in assez complet qui utilise lrsquoajout de paiement périodique drsquoEDD pour tout faire. Cependant, il nrsquoest pas très lié à Edd et peut être facilement exécuté par le plug in membre ou woocommerce. La forme originale de mon plan cratère
Propriété du routage à partir de
(0! = = strpos ($this gt route,
$this gt route =
}
Vérifier si le chemin est un chemin
(0 = = strpos ($request gt get route (), $this gt route) {
Supposons qursquoil y ait trop de demandes logiques pour renvoyer une erreur wp u en utilisant le Code 429
$check = sth ()
(IS _ WP Error ($check)
Retourner $this gt Generate _ Error Response ($check)
Autres {
Autoriser le retour intact
Renvoie $service
}
Autres {
ce nrsquoest pas notre cours, il est revenu, il nrsquoa pas changé
Renvoie $service
}
}
* *
Générer une réponse drsquoerreur
* *
Paramètre wp _ Error $Error
Paramètre int $status
* *
Retour à la réponse
*
La fonction protégée génère une réponse drsquoerreur ( wp _ Error $error, $status = 429) {
Retour à la nouvelle réponse
[lsquomessagersquo = gt $Error gt get _ error message ($status)]],
$status
)
}
Ça ne sert à rien, mais jrsquoaimerais en faire un point de départ pour comprendre ce concept. Votre mise en oeuvre des restrictions tarifaires ou de la logique des comptes peut également être complètement différente, mais elle peut être le point de départ drsquoautres approches. Notez que ce code appelle une fonction appelée
}
* *
Obtenez tous les événements ou abonnements gratuits
* *
Paramètre $user _ id
* *
Retourner le tableau
*
Fonctions statiques publiques get _ user subscriptions ($user id) {
Retourner (nouveau EDD recurrental u Subscriber ($user ID, True))
Obtenir lrsquoabonnement ($u ENV [lsquoSaaS _ Product idrsquo]]
« activité»,
))
}
Commençons par une classe pour gérer notre logique. Un problème complexe que jrsquoa i découvert est que les abonnements EDD u utilisent des tables personnalisées sans méta tables. Jrsquoai trouvé des solutions. Dans le plug in API Speed limit, jrsquoa i séparé la limite de vitesse de lrsquoabonnement et jrsquoai compté lrsquoutilisation dans un tableau personnalisé. Dans cet exemple de code, jrsquoutiliserai un type de message personnalisé caché appelé « u limit _ Tracker » qui contient deux métachamps: « u Subscription ID » et « u uses ». Abonnement = usine:: get _ user Subscription ($user id)
}
* *
Vérifier si la demande doit être acceptée
* *
Retour bool | wp _ Error
*
Fonctions publiques autorisées () {
(NULL ($this gt Subscription) {
$this gt Error Code = 403
Renvoie une nouvelle erreur wp ($this gt Error Code, (lsquono Subscription foundrsquo, lsquotext Domainrsquo)
}
If (True = = $this gt check _ use ($this gt Subscription [0]) {
Renvoie True
Autres {
$this gt Error Code = 429
Renvoie une nouvelle erreur wp ($this gt Error Code, (lsquoSpeed limit exceedrsquo, lsquotext Domainrsquo)
}
}
* *
Retourner int | null
*
Fonction publique get _ Error Code () {
Renvoie $this gt Error _ Code
}
* *
Paramètre int $Subscription id
*
Fonction protégée check _ use ($Subscription ID) {
$WP _ Query = new WP Query ([]
lsquopost _ typersquo = gt lsquolimit Trackerrsquo,
« Meta query» = gt
lsquokeyrsquo = gt lsquo_ Subscription idrsquo,
« valeur» = gt $ID drsquoabonnement,
« comparer» = gt lsquo=
[1]
))
(NULL ($WP _ Query gt posts [0]) {
$id = wp u insert u post
lsquopost _ typersquo = gt lsquolimit Trackerrsquo,
« contenu de la publication» = [1jeemaa1] »
]
Mettre à jour _ post Meta ($ID, $Subscription ID, $Subscription ID)
$utilisation = 0
Autres {
$id = $wp u Query gt post [0] gt ID
$uses = get _ post Meta ($ID,
}
($utilise gt $ceci gt utilisation maximale) {
Renvoie False
Autres {
Mettre à jour _ post Meta ($ID, $USA, $USA + 1)
Renvoie True
}
}
Ce cours
, je lrsquoutiliserai dans la classe route et vérifierai plus tard le type de post caché pour les statistiques drsquoutilisation. Comme pouvez le voir dans la méthode check _ use (), chaque fois que vérifiez, une autre utilisation est calculée et comparée à lrsquoutilisation maximale autorisée. Vous devrez peut être étendre cette logique pour une utilisation ou une récupération mensuelle. Mon but est de donner un point de départ et drsquoexpliquer comment ce type de cours peut être mené. Avec cela, nous pouvons utiliser cette logique pour compléter la classe de chemin que nous avons lancée précédemment. Cette classe est prête à formater lrsquoerreur wp u en réponse au repos ou à permettre le passage de la demande. Par conséquent, il suffit drsquoappeler cette logique dans la méthode de vérification qui se connecte au repos _ pre Dispatch pour arrêter les requêtes non autorisées. Chemin = $chemin
Ajouter un filtre (lsquorest _ pre Dispatchrsquo, [$this, lsquocheckrsquo, 10, 3)
}
* *
* avant que wordpress ne réponde à la demande, vérifiez si un blocage est nécessaire et, si nécessaire, bloquez
* *
@ Param bool $Service if requested
Param wp _ rest Server $Server Server instance.
@ Param wp _ rest request $request used to Generate a response.
* *
Renvoie booléen
*
Vérification de la fonction publique ($Server, $Server, $Request) {
Assurez que la propriété route est
(0! = = strpos ($this gt route,
$this gt route =
}
Vérifier si le chemin est un chemin
(0 = = strpos ($request gt get route (), $this gt route) {
Supposons qursquoil y ait trop de demandes logiques pour renvoyer une erreur wp u en utilisant le Code 429
$Checker = nouveau limiteur (get _ current user id ()
$allow = $Checker gt allow ()
(IS _ WP Error ($allow) {
Retourner $this gt Generate _ Error Response ($allowed, $Checker gt get Error Code ()
Autres {
Autoriser le retour intact
Retourner $Serv
E
}
Autres {
ce nrsquoest pas notre cours, il est revenu, il nrsquoa pas changé
Renvoie $service
}
}
* *
Générer une réponse drsquoerreur
* *
Paramètre wp _ Error $Error
Paramètre int $status
* *
Retour à la réponse
*
La fonction protégée génère une réponse drsquoerreur ( wp _ Error $error, $status = 429) {
Retour à la nouvelle réponse
[lsquomessagersquo = gt $Error gt get _ error message ($status)]],
$status
)
}
} WAAS – WordPress en tant que SaaS j’espère que cet article donne beaucoup d’idées et le début du Code nécessaire pour créer un SaaS basé sur WordPress. Que utilisiez WordPress uniquement pour le commerce électronique ou pour l’ensemble de l’application, WordPress est un excellent outil pour ces projets, car peu importe combien choisissez d’utiliser.