Ga naar de inhoud

Actietriggers

Met Queuety::on_action() kun je een gewone actie van WordPress omzetten in het starten van een duurzame workflow.

Zo ontstaat een heldere verbinding:

WordPress action -> mapped payload -> durable workflow

Dit is handig wanneer de gebeurtenis die ertoe doet al plaatsvindt in WordPress en de kostbare of langlopende reactie asynchroon moet plaatsvinden.

Voorbeeld: content beoordelen wanneer een bericht wordt opgeslagen

PHP
use Queuety\Queuety;

Queuety::on_action(
    'save_post',
    workflow: 'content_review',
    map: static fn ( int $post_id, object $post, bool $update ): array => [
        'post_id' => $post_id,
        'post_type' => $post->post_type,
        'update' => $update,
    ],
    when: static fn ( int $post_id, object $post ): bool => 'post' === $post->post_type,
    idempotency_key: static fn ( int $post_id ): string => "save_post:{$post_id}",
);

In dat voorbeeld:

  • save_post blijft de oorspronkelijke gebeurtenis van WordPress
  • map zet ruwe hookargumenten om in eenvoudige workflowstatus
  • when slaat ongewenste gebeurtenissen over voordat er iets in de wachtrij wordt geplaatst
  • idempotency_key voorkomt dat herhaalde hookaanroepen dubbele runs starten

Wat synchroon wordt uitgevoerd

De actiecallback zelf wordt nog steeds uitgevoerd binnen het huidige verzoek van WordPress.

Dat betekent dat deze onderdelen synchroon zijn:

  • when
  • map
  • idempotency_key

Alleen de workflowstappen worden na het starten asynchroon uitgevoerd.

Regels voor de inhoud

Toegewezen inhoud moet bestaan uit eenvoudige arrays, scalaire waarden en null.

Geef geen ruwe objecten van WordPress, zoals WP_Post, rechtstreeks door aan de workflowstatus. Normaliseer ze eerst binnen map():

PHP
Queuety::on_action(
    'save_post',
    workflow: 'content_review',
    map: static fn ( int $post_id, object $post, bool $update ): array => [
        'post_id' => $post_id,
        'post_type' => $post->post_type,
        'post_status' => $post->post_status,
        'update' => $update,
    ],
);

Sleutels die beginnen met _ worden geweigerd, omdat die namen zijn gereserveerd voor interne workflowstatus.

Geaccepteerde argumenten

WordPress vereist een aantal accepted_args bij het registreren van een actiecallback.

Queuety leidt dit standaard af uit je callbacks voor map, when en idempotency_key, zodat je in het gebruikelijke geval geen extra configuratie nodig hebt:

PHP
Queuety::on_action(
    'save_post',
    workflow: 'content_review',
    map: static fn ( int $post_id, object $post, bool $update ): array => [
        'post_id' => $post_id,
        'update' => $update,
    ],
);

Als je de waarde handmatig wilt overschrijven, geef dan expliciet accepted_args mee:

PHP
Queuety::on_action(
    'comment_post',
    workflow: 'comment_review',
    accepted_args: 2,
);

Inline workflowbouwers

Je kunt een geregistreerde workflownaam of een inline WorkflowBuilder starten.

Inline bouwers zijn handig wanneer de hookspecifieke workflow in hetzelfde bootstrapbestand is gedefinieerd:

PHP
$review = Queuety::workflow( 'comment_review' )
    ->then( ModerateCommentStep::class )
    ->then( NotifyModeratorStep::class );

Queuety::on_action(
    'comment_post',
    workflow: $review,
    map: static fn ( int $comment_id ): array => [
        'comment_id' => $comment_id,
    ],
    idempotency_key: static fn ( int $comment_id ): string => "comment:{$comment_id}",
);

Wanneer dit goed past

Gebruik actietriggers wanneer:

  • WordPress de gebeurtenis waar je om geeft al uitzendt
  • de reactie bestand moet zijn tegen time-outs van verzoeken of herstarts van workers
  • het vervolgwerk vertakkingen kan hebben, kan wachten of goedkeuring kan vereisen
  • dubbele hookaanroepen duurzaam idempotent moeten worden afgehandeld

Gebruik in plaats daarvan een rechtstreekse aanroep van Queuety::dispatch() of Queuety::workflow() wanneer het werk niet gekoppeld is aan een gebeurtenisgrens van WordPress.

Niet voor filters

Queuety::on_action() is bewust alleen voor acties bedoeld.

Filters zijn synchrone transformaties tijdens een verzoek. Ze moeten meestal synchroon blijven, omdat WordPress verwacht dat een gefilterde waarde onmiddellijk wordt geretourneerd.