Tutoriel du schéma
Tutoriel du schémaLeçon 15 : Envoyer un résumé quotidien d'activité

Leçon 15 : Envoyer un résumé quotidien d'activité

Nous pouvons intégrer Gato GraphQL avec WP-Cron, pour automatiser l'exécution de requêtes GraphQL qui effectuent des tâches d'administration, avec un intervalle de temps. (L'extension Automatisation est requise.)

Dans cette leçon du tutoriel, nous configurons WP-Cron pour qu'il exécute toutes les 24 h une requête GraphQL qui récupère le nombre de nouveaux commentaires ajoutés au site, et envoie ces statistiques au compte e-mail souhaité.

Requête GraphQL avec les statistiques quotidiennes des nouveaux commentaires

Cette requête GraphQL envoie un e-mail indiquant le nombre de nouveaux commentaires ajoutés au site pour plusieurs périodes de temps :

  • Dans les dernières 24 h
  • Dans la dernière année
  • Depuis le début du mois
  • Depuis le début de l'année

Nous créons une Persisted Query avec le slug "daily-stats-by-email-number-of-comments" et le contenu :

query CountComments {
  DATE_ISO8601: _env(name: DATE_ISO8601) @remove
 
  timeToday: _time
  dateToday: _date(format: $__DATE_ISO8601, timestamp: $__timeToday)
  
  timeYesterday: _intSubtract(subtract: 86400, from: $__timeToday)
  dateYesterday: _date(format: $__DATE_ISO8601, timestamp: $__timeYesterday)
  
  time1YearAgo: _intSubtract(subtract: 31536000, from: $__timeToday)
  date1YearAgo: _date(format: $__DATE_ISO8601, timestamp: $__time1YearAgo)
 
  timeBegOfThisMonth: _makeTime(hour: 0, minute: 0, second: 0, day: 1)
  dateBegOfThisMonth: _date(format: $__DATE_ISO8601, timestamp: $__timeBegOfThisMonth)
 
  timeBegOfThisYear: _makeTime(hour: 0, minute: 0, second: 0, month: 1, day: 1)
  dateBegOfThisYear: _date(format: $__DATE_ISO8601, timestamp: $__timeBegOfThisYear)
  
  commentsAddedInLast24Hs: commentCount(filter: { dateQuery: { after: $__dateYesterday } } )
    @export(as: "commentsAddedInLast24Hs")
  commentsAddedInLast1Year: commentCount(filter: { dateQuery: { after: $__date1YearAgo } } )
    @export(as: "commentsAddedInLast1Year")
  commentsAddedSinceBegOfThisMonth: commentCount(filter: { dateQuery: { after: $__dateBegOfThisMonth } } )
    @export(as: "commentsAddedSinceBegOfThisMonth")
  commentsAddedSinceBegOfThisYear: commentCount(filter: { dateQuery: { after: $__dateBegOfThisYear } } )
    @export(as: "commentsAddedSinceBegOfThisYear")
}
 
query CreateEmailMessage @depends(on: "CountComments") {
  emailMessageTemplate: _strConvertMarkdownToHTML(
    text: """
 
This is the number of comments added to the site:
 
| Period | # Comments added |
| --- | --- |
| **In the last 24 hs**: | {$commentsAddedInLast24Hs} |
| **In the last 365 days**: | {$commentsAddedInLast1Year} |
| **Since begginning of this month**: | {$commentsAddedSinceBegOfThisMonth} |
| **Since begginning of this year**: | {$commentsAddedSinceBegOfThisYear} |
 
    """
  )
  emailMessage: _strReplaceMultiple(
    search: [
      "{$commentsAddedInLast24Hs}",
      "{$commentsAddedInLast1Year}",
      "{$commentsAddedSinceBegOfThisMonth}",
      "{$commentsAddedSinceBegOfThisYear}"
    ],
    replaceWith: [
      $commentsAddedInLast24Hs,
      $commentsAddedInLast1Year,
      $commentsAddedSinceBegOfThisMonth,
      $commentsAddedSinceBegOfThisYear
    ],
    in: $__emailMessageTemplate
  )
    @export(as: "emailMessage")
}
 
mutation SendDailyStatsByEmailNumberOfComments(
  $to: [String!]!
)
  @depends(on: "CreateEmailMessage")
{
  _sendEmail(
    input: {
      to: $to
      subject: "Daily stats: Number of new comments"
      messageAs: {
        html: $emailMessage
      }
    }
  ) {
    status
  }
}

Planification de l'exécution de la requête GraphQL via WP-Cron

Nous devons planifier l'événement WP-Cron pour qu'il exécute le hook Gato GraphQL gatographql__execute_persisted_query, en lui passant l'adresse e-mail de destination comme argument, ainsi que la récurrence (quotidienne).

Nous faisons cela soit via PHP :

wp_schedule_event(
  time(),
  'daily',
  'gatographql__execute_persisted_query',
  [
    'daily-stats-by-email-number-of-comments',
    [
      'to' => ['admin@mysite.com']
    ],
    'SendDailyStatsByEmailNumberOfComments',
    1 // This is the admin user's ID
  ]
);

Soit via le plugin WP-Crontrol :

  • Event type: Standard cron event
  • Hook name: gatographql__execute_persisted_query
  • Arguments: ["daily-stats-by-email-number-of-comments",{"to":["admin@mysite.com"]},"SendDailyStatsByEmailNumberOfComments",1]
  • Recurrence: Once Daily
Nouvelle entrée dans WP-Crontrol
Nouvelle entrée dans WP-Crontrol

Le 4e argument passé à l'événement WP-Cron est l'identifiant (en tant qu'int) ou le nom d'utilisateur (en tant que string) de l'utilisateur qui doit être connecté lors de l'exécution de la requête GraphQL.

(Dans ce cas, la valeur 1 est l'identifiant de l'utilisateur administrateur, et on aurait aussi pu fournir le nom d'utilisateur "admin".)

Passer cet argument est généralement nécessaire lors de l'exécution de mutations, car la plupart d'entre elles requièrent qu'un utilisateur (avec les capacités appropriées) soit connecté.