web-dev-qa-db-fra.com

Lorsque l'action wp_schedule_event a deux directions possibles, comment éviter une boucle infinie?

Je construis un plugin qui lie WordPress et Salesforce comme ceci (mise à jour ici pour essayer de clarifier ce que fait le plugin):

  1. salesforce_Push: envoyer des données depuis WordPress à Salesforce. Cela se produit lorsqu'un nouvel élément (article, utilisateur, etc., dépend des paramètres de la carte) est créé/mis à jour/supprimé dans WordPress et que les données sont envoyées à l'API Salesforce pour créer/mettre à jour/supprimer l'objet mappé. Le mappage est basé sur l'ID de l'élément (ID utilisateur à ID contact, par exemple).
  2. salesforce_pull: recherchez dans Salesforce les objets créés/mis à jour/supprimés qui doivent revenir dans WordPress (en fonction des paramètres de la carte). Par exemple, un contact est mis à jour dans Salesforce; cela devrait mettre à jour l'utilisateur correspondant dans WordPress.
  3. Il existe une table qui relie les types d'objet (utilisateur à contacter, par exemple) ainsi que les lignes d'objet (un ID utilisateur spécifique à un ID de contact spécifique, par exemple).

Il existe deux méthodes wp_schedule_event: une pour Push et une pour Pull. Les méthodes ci-dessus envoient des données aux événements, puis le traitement a lieu (soit d'appeler une méthode de l'API Salesforce, soit une méthode WordPress, pour créer/mettre à jour/supprimer un élément).

Actuellement, voici ce qui se passe:

  1. Je crée/met à jour/supprime un élément dans WordPress (sur localhost). La même chose se produit dans Salesforce lors de la prochaine exécution de Push wp_schedule_event. Par exemple, toutes les 5 minutes, il envoie de nouveaux utilisateurs à Salesforce et leur crée des contacts, ou les met à jour s'ils sont déjà mappés sur des utilisateurs de WordPress.
  2. Je crée/met à jour/supprime un élément mappé dans Salesforce. Lors de la prochaine exécution de la commande wp_schedule_event, elle charge les données de cet élément à partir de l'API Salesforce et l'envoie à salesforce_pull, où elle appellera des méthodes pour créer/mettre à jour/supprimer des objets dans WordPress (cette partie n'est pas encore terminée).

Le problème est le suivant:

En n ° 1, lorsqu'un élément Salesforce est créé ou mis à jour en fonction de l'activité WordPress (salesforce_Push), il tente également d'appeler la méthode salesforce_pull car il se rend compte que quelque chose a changé dans Salesforce.

Cela crée une boucle qui ne sera pas satisfaite, car chaque système essaye continuellement de mettre à jour l'autre. J'ai essayé de déterminer le type de vérification à exécuter sur chaque méthode pour savoir si elle venait juste d'être appelée par l'autre méthode, mais je suis pour l'instant incapable d'en créer une qui n'arrête pas également les modifications légitimes dans le système.

Un événement que j'aimerais arrêter serait le suivant:

  1. Un utilisateur WordPress met à jour un profil qui est envoyé à Salesforce et met à jour le contact.
  2. Salesforce renvoie le même changement à WordPress pour mettre à jour l'utilisateur.

(C’est ce qui se passe actuellement, pour être clair.)

Un événement que j'aimerais autoriser serait le suivant:

  1. Un utilisateur WordPress met à jour un profil qui est envoyé à Salesforce et met à jour le contact.
  2. Salesforce traite une transaction financière pour l'utilisateur, met à jour l'historique de ses dons et le renvoie à WordPress.
5
Jonathan Stegall

Vous devez créer une variable d'index de version de données utilisateur chaque fois qu'elle change d'incrément. Cela devrait vous aider à savoir quelle est la version la plus récente du jeu de données. Vous pouvez utiliser la valeur de cet index pour déterminer si une mise à jour doit avoir lieu ou non.

(Réponse du commentaire)

1
Nicolai