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; }