AbstractBatchedJob.php
10 months ago
AbstractJob.php
10 months ago
ActionScheduler.php
11 months ago
JobInitializer.php
10 months ago
JobInterface.php
10 months ago
LlmsTxtInjectContentJob.php
10 months ago
NotifyMcpJob.php
11 months ago
AbstractBatchedJob.php
75 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Hostinger\Admin\Jobs; |
| 4 | |
| 5 | use Hostinger\LlmsTxtGenerator\LlmsTxtParser; |
| 6 | |
| 7 | defined( 'ABSPATH' ) || exit; |
| 8 | |
| 9 | abstract class AbstractBatchedJob extends AbstractJob { |
| 10 | |
| 11 | public function init(): void { |
| 12 | add_action( $this->get_create_batch_hook(), array( $this, 'handle_create_batch_action' ), 10, 2 ); |
| 13 | parent::init(); |
| 14 | } |
| 15 | |
| 16 | protected function get_create_batch_hook(): string { |
| 17 | return "{$this->get_hook_base_name()}create_batch"; |
| 18 | } |
| 19 | |
| 20 | public function schedule( array $args = array() ): void { |
| 21 | $this->schedule_create_batch_action( 1, $args ); |
| 22 | } |
| 23 | |
| 24 | public function handle_create_batch_action( int $batch_number, array $args ): void { |
| 25 | $items = $this->get_batch( $batch_number, $args ); |
| 26 | |
| 27 | if ( empty( $items ) ) { |
| 28 | $this->handle_complete( $batch_number, $args ); |
| 29 | } else { |
| 30 | $this->schedule_process_action( $items, $args ); |
| 31 | $this->schedule_create_batch_action( $batch_number + 1, $args ); |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | protected function get_batch_size(): int { |
| 36 | return apply_filters( 'hostinger_batch_item_limit', LlmsTxtParser::DEFAULT_LIMIT ); |
| 37 | } |
| 38 | |
| 39 | protected function get_query_offset( int $batch_number ): int { |
| 40 | return $this->get_batch_size() * ( $batch_number - 1 ); |
| 41 | } |
| 42 | |
| 43 | protected function schedule_create_batch_action( int $batch_number, array $args ): void { |
| 44 | if ( $this->can_schedule( array( $batch_number ) ) ) { |
| 45 | $this->action_scheduler->schedule_immediate( |
| 46 | $this->get_create_batch_hook(), |
| 47 | array( |
| 48 | $batch_number, |
| 49 | $args, |
| 50 | ) |
| 51 | ); |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | protected function schedule_process_action( array $items = array(), array $args = array() ): void { |
| 56 | $job_data = array( |
| 57 | 'items' => $items, |
| 58 | 'args' => $args, |
| 59 | ); |
| 60 | if ( ! $this->is_processing( $job_data ) ) { |
| 61 | $this->action_scheduler->schedule_immediate( $this->get_process_item_hook(), array( $job_data ) ); |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | protected function is_processing( array $args = array() ): bool { |
| 66 | return $this->action_scheduler->has_scheduled_action( $this->get_process_item_hook(), array( $args ) ); |
| 67 | } |
| 68 | |
| 69 | protected function handle_complete( int $final_batch_number, array $args ): void { |
| 70 | return; |
| 71 | } |
| 72 | |
| 73 | abstract protected function get_batch( int $batch_number, array $args ): array; |
| 74 | } |
| 75 |