Schema-tutorial
Schema-tutorialLes 15: Een dagelijks activiteitsoverzicht versturen

Les 15: Een dagelijks activiteitsoverzicht versturen

We kunnen Gato GraphQL integreren met WP-Cron, om de uitvoering van GraphQL queries die beheertaken uitvoeren te automatiseren, met een bepaald tijdsinterval. (De Automation extensie is vereist.)

In deze tutoriales konfigureren we WP-Cron zo dat het elke 24 uur een GraphQL query uitvoert die het aantal nieuwe reacties op de site ophaalt, en deze statistieken naar het gewenste e-mailadres stuurt.

GraphQL query met dagelijkse statistieken van nieuwe reacties

Deze GraphQL query stuurt een e-mail met het aantal nieuwe reacties dat in verschillende periodes aan de site is toegevoegd:

  • In de afgelopen 24 uur
  • In het afgelopen jaar
  • Sinds het begin van deze maand
  • Sinds het begin van dit jaar

We maken een Persisted Query met slug "daily-stats-by-email-number-of-comments" en de volgende inhoud:

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
  }
}

De uitvoering van de GraphQL query plannen via WP-Cron

We moeten het WP-Cron-event plannen om de Gato GraphQL hook gatographql__execute_persisted_query uit te voeren, waarbij het e-mailadres als argument wordt meegegeven en de herhaling (dagelijks) wordt ingesteld.

Dit doen we 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
  ]
);

Of via de WP-Crontrol plugin:

  • 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
Nieuwe invoer in WP-Crontrol
Nieuwe invoer in WP-Crontrol

Het 4e argument dat aan het WP-Cron-event wordt meegegeven is het ID (als int) of de gebruikersnaam (als string) van de gebruiker die ingelogd moet zijn bij het uitvoeren van de GraphQL query.

(In dit geval is waarde 1 het ID van de beheerder, maar de gebruikersnaam "admin" had ook kunnen worden opgegeven.)

Het meegeven van dit argument is doorgaans vereist bij het uitvoeren van mutations, omdat de meeste mutations een ingelogde gebruiker (met de juiste rechten) vereisen.