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
LlmsTxtInjectContentJob.php
87 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Hostinger\Admin\Jobs; |
| 4 | |
| 5 | use Hostinger\Admin\PluginSettings; |
| 6 | use Hostinger\LlmsTxtGenerator\LlmsTxtFileHelper; |
| 7 | use Hostinger\LlmsTxtGenerator\LlmsTxtGenerator; |
| 8 | use Hostinger\LlmsTxtGenerator\LlmsTxtParser; |
| 9 | |
| 10 | class LlmsTxtInjectContentJob extends AbstractBatchedJob { |
| 11 | |
| 12 | public const JOB_NAME = 'generate_llmstxt'; |
| 13 | |
| 14 | protected LlmsTxtParser $llms_txt_parser; |
| 15 | protected LlmsTxtFileHelper $llms_txt_file_helper; |
| 16 | protected PluginSettings $plugin_settings; |
| 17 | |
| 18 | public function __construct( ActionScheduler $action_scheduler, LlmsTxtParser $llms_txt_parser, LlmsTxtFileHelper $llms_txt_file_helper, PluginSettings $plugin_settings ) { |
| 19 | parent::__construct( $action_scheduler ); |
| 20 | $this->llms_txt_parser = $llms_txt_parser; |
| 21 | $this->llms_txt_file_helper = $llms_txt_file_helper; |
| 22 | $this->plugin_settings = $plugin_settings; |
| 23 | } |
| 24 | |
| 25 | protected function get_batch( int $batch_number, $args ): array { |
| 26 | if ( ! isset( $args['post_type'] ) ) { |
| 27 | return array(); |
| 28 | } |
| 29 | |
| 30 | $offset = $this->get_query_offset( $batch_number ); |
| 31 | $limit = $this->get_batch_size(); |
| 32 | |
| 33 | return $this->llms_txt_parser->get_by_post_type( $args['post_type'], $limit, $offset ); |
| 34 | } |
| 35 | |
| 36 | public function get_name(): string { |
| 37 | return self::JOB_NAME; |
| 38 | } |
| 39 | |
| 40 | protected function process_items( array $args = array() ): void { |
| 41 | if ( ! $this->is_llms_txt_enabled() ) { |
| 42 | return; |
| 43 | } |
| 44 | |
| 45 | $items = $args['items'] ?? array(); |
| 46 | $job_args = $args['args'] ?? array(); |
| 47 | |
| 48 | if ( ! isset( $job_args['post_type'] ) || empty( $items ) ) { |
| 49 | return; |
| 50 | } |
| 51 | |
| 52 | $content = $this->llms_txt_parser->get_items( $items ); |
| 53 | $this->inject_content( $job_args['post_type'], $content ); |
| 54 | } |
| 55 | |
| 56 | public function schedule( array $args = array() ): void { |
| 57 | // Initiate as 2, as the first batch will be created when the user toggles on the option. |
| 58 | $this->schedule_create_batch_action( 2, $args ); |
| 59 | } |
| 60 | |
| 61 | public function can_schedule( $args = array() ): bool { |
| 62 | return parent::can_schedule( $args ) && $this->is_llms_txt_enabled(); |
| 63 | } |
| 64 | |
| 65 | public function is_llms_txt_enabled(): bool { |
| 66 | $settings = $this->plugin_settings->get_plugin_settings(); |
| 67 | return $settings->get_enable_llms_txt(); |
| 68 | } |
| 69 | |
| 70 | public function inject_content( $post_type, $new_content ): void { |
| 71 | $content = $this->llms_txt_file_helper->get_content(); |
| 72 | $section = LlmsTxtGenerator::HOSTINGER_LLMSTXT_SUPPORTED_POST_TYPES[ $post_type ]; |
| 73 | $header = "## $section\n\n"; |
| 74 | $header_position = strpos( $content, $header ); |
| 75 | $header_length = strlen( $header ); |
| 76 | if ( $header_position === false ) { |
| 77 | return; |
| 78 | } |
| 79 | |
| 80 | $before_injection_slot = substr( $content, 0, $header_position + $header_length ); |
| 81 | $after_injection_slot = substr( $content, $header_position + $header_length ); |
| 82 | |
| 83 | $final_content = $before_injection_slot . $new_content . $after_injection_slot; |
| 84 | $this->llms_txt_file_helper->create( $final_content ); |
| 85 | } |
| 86 | } |
| 87 |