џџџџџџџџџџџџ%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+џџџџ7џџџџџџџџџџџџџџџџ>8џџџџџџџџ:џџџџџџџџ;џџџџџџџџџџџџџџџџA&џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ9џџџџ$6џџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџEџџџџџџџџџџџџ(џџџџџџџџџџџџ џџџџџџџџџџџџ"џџџџ #џџџџџџџџџџџџџџџџ-џџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџџџџџџџџџџџ/џџџџџџџџ3џџџџџџџџ'џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ.џџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџ*џџџџџџџџџџџџџџџџџџџџџџџџ2џџџџџџџџџџџџџџџџџџџџ4џџџџCџџџџџџџџ<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,џџџџDџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ`HfтџџџџцПWл2ЛВЬ`)hт aeтџџџџ‡dŽj И-hтР`eтџџџџ|€ CfтЃeтџџџџх…|€€Cfти4fтџџџџZЛхОШ=РhфШbcUPРbcUџџџџQЫšџШЏœТфШbcUGfтџџџџЮџГк>Ž}юxАжbcU(5fтџџџџM {ЛВЬтШbcU@GfтџџџџчXГ7ŸQ(к€aeтрaeтџџџџ)жQ!њјТx5fт€Gfтџџџџ5зЇ•РИвтbcU#fтџџџџњвAыч_#ЬРфШbcU@beтџџџџdіЮщЎУШ5fт0"`тџџџџkаkTЧРвœ beтPРbcUџџџџ—лРБ„A’6fтрGfтџџџџ!ˆш>Ž}юh6fта"`тџџџџgыZвШх хИ6fтИЃeтџџџџыlŸ•Р#гbcU Hfтџџџџ€щrВ’Р(ЩbcU(Єeтџџџџ6ЊрrВ’Р7fтceтџџџџ|ПчrВ’РpЯгbcUPРbcUџџџџ-g<њR! у`ceтР#fтџџџџr Š|€РHfтIfтџџџџ”qJтƒ”ŸX7fтРceтZa™ј‰Х•hHзbcU@Ifтџџџџt/КћŸ3уПРЩbcUSfтQž —Ÿ сЮbcU deтџџџџЂМN>з wƒYЩbcU€Ifтџџџџ‡Жz6ax™€deтрdeтџџџџв™МВWкРЈ7fтРIfтџџџџ8dE 1€рЩbcUJfтџџџџ*1нІыБKУp#`т@Jfтџџџџ{еФ`КŸн€РfтPРbcUџџџџѕл?щ.ЈЫРхШbcU$`тџџџџiLрbaџ ‰x:fтPgeтџџџџЃЪ!=у6ѓ€geтрLfтџџџџIŒЮН хШ:fт Mfтџџџџ›/ФОю7А$`т`MfтџџџџЬIнM'ЁлP%`тPРbcU)ІIР48ї№хШbcUРMfтџџџџдУ|ўЋжкэxЅeтNfтџџџџsBR„Q€ЬшЅeт;fт0Iиx 6G~ЂСfт@Nfтџџџџ…"р$знXІeт€NfтџџџџййђЭ&ВшШІeтh;fтџџџџF‘м§ћF~Ђ€Сfт№%`т5' HыќdІрgeтpheтџџџџ' HыќdІ heт8Їeтџџџџйyем)ieтРNfтџџџџжФу‘olќђ`ieтрЇeтџџџџѓџ*ƒ+ЗЈeтOfтџџџџРг5buНdІРieт@Ofт€‡и*2з) jeт€Ofтџџџџ"‚кzНdІ€jeтр;fтџџџџOѓЋ›wƒget_batch(); foreach ( $batch->data as $key => $value ) { $task = $this->task( $value ); if ( false !== $task ) { $batch->data[ $key ] = $task; } else { unset( $batch->data[ $key ] ); } if ( $this->batch_limit_exceeded() ) { // Batch limits reached. break; } } // Update or delete current batch. if ( ! empty( $batch->data ) ) { $this->update( $batch->key, $batch->data ); } else { $this->delete( $batch->key ); } } while ( ! $this->batch_limit_exceeded() && ! $this->is_queue_empty() ); $this->unlock_process(); // Start next batch or complete process. if ( ! $this->is_queue_empty() ) { $this->dispatch(); } else { $this->complete(); } } /** * Use the protected `is_process_running` method as a public method. * @return bool */ public function is_process_locked() { return $this->is_process_running(); } public function handle_immediately( $callbacks ) { $this->manager->on_runner_start(); $this->lock_process(); foreach ( $callbacks as $callback ) { $item = [ 'callback' => $callback, ]; do { $item = $this->task( $item ); } while ( $item ); } $this->unlock_process(); } /** * Task * * Override this method to perform any actions required on each * queue item. Return the modified item for further processing * in the next pass through. Or, return false to remove the * item from the queue. * * @param array $item * * @return array|bool */ protected function task( $item ) { $result = false; if ( ! isset( $item['iterate_num'] ) ) { $item['iterate_num'] = 1; } $logger = Plugin::$instance->logger->get_logger(); $callback = $this->format_callback_log( $item ); if ( is_callable( $item['callback'] ) ) { $progress = ''; if ( 1 < $item['iterate_num'] ) { if ( empty( $item['total'] ) ) { $progress = sprintf( '(x%s)', $item['iterate_num'] ); } else { $percent = ceil( $item['iterate_num'] / ( $item['total'] / 100 ) ); $progress = sprintf( '(%s of %s, %s%%)', $item['iterate_num'], $item['total'], $percent ); } } $logger->info( sprintf( '%s Start %s', $callback, $progress ) ); $this->current_item = $item; $result = (bool) call_user_func( $item['callback'], $this ); // get back the updated item. $item = $this->current_item; $this->current_item = null; if ( $result ) { if ( empty( $item['total'] ) ) { $logger->info( sprintf( '%s callback needs to run again', $callback ) ); } elseif ( 1 === $item['iterate_num'] ) { $logger->info( sprintf( '%s callback needs to run more %d times', $callback, $item['total'] - $item['iterate_num'] ) ); } $item['iterate_num']++; } else { $logger->info( sprintf( '%s Finished', $callback ) ); } } else { $logger->notice( sprintf( 'Could not find %s callback', $callback ) ); } return $result ? $item : false; } /** * Schedule cron healthcheck. * * @param array $schedules Schedules. * @return array */ public function schedule_cron_healthcheck( $schedules ) { $interval = apply_filters( $this->identifier . '_cron_interval', 5 ); // Adds every 5 minutes to the existing schedules. $schedules[ $this->identifier . '_cron_interval' ] = array( 'interval' => MINUTE_IN_SECONDS * $interval, 'display' => sprintf( /* translators: %d: Interval in minutes. */ esc_html__( 'Every %d minutes', 'elementor' ), $interval ), ); return $schedules; } /** * See if the batch limit has been exceeded. * * @return bool */ public function is_memory_exceeded() { return $this->memory_exceeded(); } /** * Delete all batches. * * @return self */ public function delete_all_batches() { global $wpdb; $table = $wpdb->options; $column = 'option_name'; if ( is_multisite() ) { $table = $wpdb->sitemeta; $column = 'meta_key'; } $key = $wpdb->esc_like( $this->identifier . '_batch_' ) . '%'; $wpdb->query( $wpdb->prepare( "DELETE FROM {$table} WHERE {$column} LIKE %s", $key ) ); // @codingStandardsIgnoreLine. return $this; } /** * Kill process. * * Stop processing queue items, clear cronjob and delete all batches. */ public function kill_process() { if ( ! $this->is_queue_empty() ) { $this->delete_all_batches(); wp_clear_scheduled_hook( $this->cron_hook_identifier ); } } public function set_current_item( $item ) { $this->current_item = $item; } protected function format_callback_log( $item ) { return implode( '::', (array) $item['callback'] ); } /** * @var \Elementor\Core\Base\Background_Task_Manager */ protected $manager; public function __construct( $manager ) { $this->manager = $manager; // Uses unique prefix per blog so each blog has separate queue. $this->prefix = 'elementor_' . get_current_blog_id(); $this->action = $this->manager->get_action(); parent::__construct(); } }