Preskočiť na obsah

Spúšťače akcií

Queuety::on_action() umožňuje zmeniť bežnú akciu WordPress na odolné odoslanie úlohy do pracovného postupu.

Tým vzniká čisté prepojenie:

WordPress action -> mapped payload -> durable workflow

Hodí sa to, keď zaujímavá udalosť už nastala v WordPress a náročná alebo dlhotrvajúca reakcia sa má vykonať asynchrónne.

Príklad: kontrola obsahu pri uložení príspevku

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}",
);

V tomto príklade:

  • save_post je stále pôvodná udalosť WordPress
  • map mení nespracované argumenty hooku na obyčajný stav pracovného postupu
  • when preskočí nežiaduce udalosti skôr, než sa čokoľvek zaradí do frontu
  • idempotency_key zabraňuje tomu, aby opakované spustenia hooku odoslali duplicitné úlohy

Čo sa vykonáva synchrónne

Samotná spätná funkcia akcie sa stále vykonáva v rámci aktuálnej požiadavky WordPress.

To znamená, že tieto časti sú synchrónne:

  • when
  • map
  • idempotency_key

Asynchrónne sa po odoslaní vykonávajú iba kroky pracovného postupu.

Pravidlá pre údaje požiadavky

Mapované údaje požiadavky by mali obsahovať obyčajné polia, skaláre a null.

Neposielajte nespracované objekty WordPress, ako je WP_Post, priamo do stavu pracovného postupu. Najprv ich normalizujte v 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,
    ],
);

Kľúče začínajúce na _ sa odmietnu, pretože tieto názvy sú vyhradené pre interný stav pracovného postupu.

Prijaté argumenty

WordPress pri registrácii spätnej funkcie akcie vyžaduje počet accepted_args.

Queuety ho štandardne odvodí z vašich spätných funkcií map, when a idempotency_key, takže v bežnom prípade nie je potrebná ďalšia konfigurácia:

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,
    ],
);

Ak potrebujete manuálne zadať inú hodnotu, výslovne nastavte accepted_args:

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

Vstavané nástroje na tvorbu pracovných postupov

Môžete odoslať registrovaný názov pracovného postupu alebo vložený nástroj na jeho tvorbu WorkflowBuilder.

Vložené nástroje na tvorbu sa hodia, keď je pracovný postup špecifický pre hook definovaný v tom istom zavádzacom súbore:

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}",
);

Kedy sa to hodí

Spúšťače akcií použite, keď:

  • WordPress už vysiela udalosť, ktorá vás zaujíma
  • reakcia má pretrvať aj po vypršaní časového limitu požiadavky alebo reštarte workera
  • nadväzujúca práca sa môže vetviť, čakať alebo vyžadovať schválenie
  • opakované spustenia hooku musia byť spoľahlivo idempotentné

Ak práca nesúvisí s hranicou udalosti WordPress, použite namiesto toho priame volanie Queuety::dispatch() alebo Queuety::workflow().

Nie pre filtre

Queuety::on_action() je zámerne určené iba pre akcie.

Filtre sú synchrónne transformácie vykonávané počas požiadavky. Zvyčajne by mali zostať synchrónne, pretože WordPress očakáva, že filtrovaná hodnota sa vráti okamžite.