
# Ενεργοποιητές ενεργειών

Το `Queuety::on_action()` σάς επιτρέπει να μετατρέψετε μια κανονική ενέργεια WordPress σε αποστολή ανθεκτικής ροής εργασιών.

Έτσι δημιουργείται μια σαφής σύνδεση:

`WordPress action -> mapped payload -> durable workflow`

Αυτό είναι χρήσιμο όταν το ενδιαφέρον συμβάν υπάρχει ήδη στο WordPress και η απαιτητική ή μεγάλης διάρκειας απόκριση πρέπει να εκτελεστεί ασύγχρονα.

## Παράδειγμα: έλεγχος περιεχομένου κατά την αποθήκευση μιας ανάρτησης

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

Σε αυτό το παράδειγμα:

- `save_post` εξακολουθεί να είναι το αρχικό συμβάν WordPress
- `map` μετατρέπει τα ακατέργαστα ορίσματα hook σε απλή κατάσταση ροής εργασιών
- `when` παραλείπει τα ανεπιθύμητα συμβάντα πριν μπουν οτιδήποτε σε ουρά
- `idempotency_key` εμποδίζει τις επαναλαμβανόμενες ενεργοποιήσεις hook να αποστείλουν διπλές εκτελέσεις

## Τι εκτελείται συγχρονισμένα

Η ίδια η επανάκληση action εξακολουθεί να εκτελείται μέσα στο τρέχον αίτημα WordPress.

Αυτό σημαίνει ότι τα εξής μέρη εκτελούνται συγχρονισμένα:

- `when`
- `map`
- `idempotency_key`

Μόνο τα βήματα της ροής εργασιών εκτελούνται ασύγχρονα μετά την αποστολή.

## Κανόνες payload

Τα αντιστοιχισμένα payload πρέπει να περιέχουν απλούς πίνακες, scalar τιμές και `null`.

Μην περνάτε ακατέργαστα αντικείμενα WordPress, όπως το `WP_Post`, απευθείας στην κατάσταση ροής εργασιών. Κανονικοποιήστε τα πρώτα μέσα στο `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,
    ],
);
```

Τα κλειδιά που αρχίζουν με `_` απορρίπτονται, επειδή αυτά τα ονόματα προορίζονται για εσωτερική κατάσταση ροής εργασιών.

## Αποδεκτά ορίσματα

Το WordPress απαιτεί πλήθος `accepted_args` κατά την καταχώριση μιας επανάκλησης action.

Από προεπιλογή, το Queuety το συνάγει από τις επανακλήσεις σας `map`, `when` και `idempotency_key`, οπότε συνήθως δεν απαιτείται πρόσθετη ρύθμιση:

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

Αν χρειάζεστε χειροκίνητη παράκαμψη, περάστε ρητά το `accepted_args`:

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

## Ενσωματωμένοι δημιουργοί ροών εργασιών

Μπορείτε να αποστείλετε ένα καταχωρισμένο όνομα ροής εργασιών ή έναν ενσωματωμένο δημιουργό `WorkflowBuilder`.

Οι ενσωματωμένοι δημιουργοί είναι χρήσιμοι όταν η ροή εργασιών που αφορά ειδικά το hook ορίζεται στο ίδιο αρχείο bootstrap:

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

## Πότε είναι κατάλληλο

Χρησιμοποιήστε triggers action όταν:

- το WordPress εκπέμπει ήδη το συμβάν που σας ενδιαφέρει
- η απόκριση πρέπει να επιβιώνει από χρονικά όρια αιτημάτων ή επανεκκινήσεις worker
- η επακόλουθη εργασία μπορεί να διακλαδωθεί, να περιμένει ή να απαιτεί έγκριση
- οι διπλές ενεργοποιήσεις hook χρειάζονται μόνιμη idempotency

Χρησιμοποιήστε απευθείας κλήση `Queuety::dispatch()` ή `Queuety::workflow()` όταν η εργασία δεν συνδέεται με όριο συμβάντος WordPress.

## Όχι για filters

Το `Queuety::on_action()` προορίζεται αποκλειστικά για action.

Τα filters είναι συγχρονισμένοι μετασχηματισμοί κατά τον χρόνο του αιτήματος. Συνήθως πρέπει να παραμένουν συγχρονισμένα, επειδή το WordPress αναμένει να επιστραφεί αμέσως μια φιλτραρισμένη τιμή.
