protected function _init()
 {
     if (!$this->is_disabled()) {
         add_action('admin_menu', array($this, '_action_admin_menu'));
         add_action('current_screen', array($this, '_action_download'));
         add_action('admin_enqueue_scripts', array($this, '_action_enqueue_scripts'));
         add_action('wp_ajax_' . self::$wp_ajax_action_status, array($this, '_action_ajax_status'));
         add_action('wp_ajax_' . self::$wp_ajax_action_backup, array($this, '_action_ajax_backup'));
         add_action('wp_ajax_' . self::$wp_ajax_action_restore, array($this, '_action_ajax_restore'));
         add_action('wp_ajax_' . self::$wp_ajax_action_delete, array($this, '_action_ajax_delete'));
         add_action('wp_ajax_' . self::$wp_ajax_action_cancel, array($this, '_action_ajax_cancel'));
     }
     add_action('network_admin_menu', array($this, '_action_admin_menu'));
     add_action('wp_ajax_nopriv_' . self::$wp_ajax_action_test, array($this, '_action_ajax_test'));
     $dir = dirname(__FILE__);
     require_once $dir . '/includes/module/class--fw-ext-backups-module.php';
     require_once $dir . '/includes/module/tasks/class--fw-ext-backups-module-tasks.php';
     $this->tasks = new _FW_Ext_Backups_Module_Tasks(self::get_access_key());
     require_once $dir . '/includes/module/schedule/class--fw-ext-backups-module-schedule.php';
     $this->schedule = new _FW_Ext_Backups_Module_Schedule(self::get_access_key());
     $this->tasks->_init();
     $this->schedule->_init();
     require_once $dir . '/includes/log/init.php';
 }
 /**
  * @return FW_Access_Key
  */
 private static function get_access_key()
 {
     if (empty(self::$access_key)) {
         self::$access_key = new FW_Access_Key('fw:ext:backups:tasks');
     }
     return self::$access_key;
 }
 private function execute_pending_task()
 {
     if ($task = $this->get_pending_task()) {
     } else {
         return false;
     }
     if ($task_type = $this->_get_task_type($task->get_type(), self::get_access_key())) {
     } else {
         return false;
         // must not happen, must be detected by $this->get_pending_task()
     }
     $task_id = $task->get_id();
     unset($task);
     $collection = $this->get_active_task_collection();
     $task = $collection->get_task($task_id);
     if (!is_array($state = $task->get_result())) {
         $state = array();
     }
     if ($this->was_executed($task)) {
         return;
     } else {
         $this->set_executed($task);
     }
     $task->set_last_execution_start_time(microtime(true));
     $task->set_last_execution_end_time(null);
     $this->set_active_task_collection($collection);
     /**
      * Raise memory limit and max_execution_time
      * Note: This is not guaranteed to work on all servers
      */
     if (($task_type = $this->_get_task_type($task->get_type(), self::get_access_key())) && ($custom_timeout = $task_type->get_custom_timeout($task->get_args(), is_array($task->get_result()) ? $task->get_result() : array()))) {
         @ini_set('memory_limit', apply_filters('admin_memory_limit', WP_MAX_MEMORY_LIMIT));
         @set_time_limit(abs($custom_timeout));
     }
     global $wpdb;
     if (($super_admin = $wpdb->get_results("SELECT user_id" . " FROM {$wpdb->usermeta}" . " WHERE `meta_key` = 'wp_user_level' AND `meta_value` = 10" . " LIMIT 1")) && ($super_admin = get_user_by('id', $super_admin[0]->user_id)) && isset($super_admin->caps['administrator']) && $super_admin->caps['administrator']) {
         wp_set_current_user($super_admin->ID);
     }
     if (($collection_tasks = $collection->get_tasks()) && isset($collection_tasks[0]) && $collection_tasks[0]->get_id() === $task->get_id() && $collection_tasks[0]->get_last_execution_start_time()) {
         /**
          * Fixes https://github.com/ThemeFuse/Unyson/issues/2116
          * @since 2.0.15
          */
         do_action('fw:ext:backups:tasks:start:id:' . $collection->get_id(), $collection);
         do_action('fw:ext:backups:tasks:start', $collection);
         unset($collection_tasks);
     } else {
         unset($collection_tasks);
     }
     register_shutdown_function(array($this, '_shutdown_function'), array('collection' => $collection, 'task' => $task));
     if ('POST' === $_SERVER['REQUEST_METHOD']) {
         ob_start();
     }
     // prevent execution abort on output (see 'blocking')
     try {
         $task->set_result($task_type->execute($task->get_args(), $state));
     } catch (Exception $e) {
         $task->set_result(new WP_Error('exception', $e->getMessage()));
     }
     if ('POST' === $_SERVER['REQUEST_METHOD']) {
         ob_end_clean();
     }
     self::$skip_shutdown_function = true;
     $task->set_last_execution_end_time(microtime(true));
     if (!(is_array($task->get_result()) || is_string($task->get_result()) || is_wp_error($task->get_result()) || in_array($task->get_result(), array(true, false), true))) {
         $task->set_result(new WP_Error('invalid_execution_result', __('Invalid execution result', 'fw')));
     }
     $this->set_active_task_collection($collection);
     if ($task->result_is_finished()) {
         if ($task->result_is_fail()) {
             $this->do_task_fail_action($task);
         } else {
             do_action('fw:ext:backups:task:success', $task);
         }
         do_action('fw:ext:backups:task:executed:finished', $task);
     } else {
         do_action('fw:ext:backups:task:executed:unfinished', $task);
     }
     do_action('fw:ext:backups:task:executed', $task);
     $this->request_next_step_execution();
     return true;
 }