Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 38
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
PluginActivationTaskManager
0.00% covered (danger)
0.00%
0 / 38
0.00% covered (danger)
0.00%
0 / 4
156
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 activate
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
20
 add_to_queue
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
12
 remove_from_queue
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace NewfoldLabs\WP\Module\Installer\TaskManagers;
4
5use NewfoldLabs\WP\Module\Installer\Data\Options;
6use NewfoldLabs\WP\Module\Installer\Models\PriorityQueue;
7use NewfoldLabs\WP\Module\Installer\Tasks\PluginActivationTask;
8
9/**
10 * Manages the execution of PluginActivationTasks.
11 */
12class PluginActivationTaskManager extends AbstractTaskManager {
13    /**
14     * The number of times Hook can be retried.
15     *
16     * @var int
17     */
18    protected static $retry_limit = 1;
19
20    /**
21     * The name of the queue, might be prefixed.
22     *
23     * @var string
24     */
25    protected static $queue_name = 'plugin_activation_queue';
26
27    /**
28     * The name of the hook, might be prefixed.
29     *
30     * @var string
31     */
32    protected static $hook_name = 'nfd_module_installer_plugin_activation_event';
33
34    /**
35     * Schedules the crons.
36     */
37    public function __construct() {
38        parent::__construct();
39
40        // Thirty seconds cron hook
41        add_action( self::$hook_name, array( $this, 'activate' ) );
42
43        if ( ! wp_next_scheduled( self::$hook_name ) ) {
44            wp_schedule_single_event( time() + 5, self::$hook_name );
45        }
46    }
47
48
49    /**
50     * Queue out all the PluginActivationTask's in the plugin activation queue and execute them.
51     *
52     * @return array|false
53     */
54    public function activate() {
55        /*
56        Get the plugins queued up to be activated, the PluginActivationTask gets
57        converted to an associative array before storing it in the option.
58        */
59        $plugins = \get_option( Options::get_option_name( self::$queue_name ), array() );
60        \update_option( Options::get_option_name( self::$queue_name ), array() );
61
62        $retries = array();
63        foreach ( $plugins as $plugin ) {
64            $plugin_activation_task = new PluginActivationTask(
65                $plugin['slug'],
66                $plugin['priority'],
67                $plugin['retries']
68            );
69            $status                 = $plugin_activation_task->execute();
70            if ( is_wp_error( $status ) ) {
71                if ( $plugin_activation_task->get_retries() <= self::$retry_limit ) {
72                    array_push( $retries, $plugin_activation_task->to_array() );
73                }
74            }
75        }
76        // Get latest instance of the plugin activation queue and update it.
77        $plugins = \get_option( Options::get_option_name( self::$queue_name ), array() );
78        array_merge( $plugins, $retries );
79        \update_option( Options::get_option_name( self::$queue_name ), $plugins );
80
81        return true;
82    }
83
84    /**
85     * Adds a new PluginActivationTask to the Plugin activation queue.
86     * The Task will be inserted at an appropriate position in the queue based on it's priority.
87     *
88     * @param PluginActivationTask $plugin_activation_task The task to be inserted.
89     * @return array|false
90     */
91    public static function add_to_queue( PluginActivationTask $plugin_activation_task ) {
92        /*
93        Get the plugins queued up to be activated, the PluginActivationTask task gets
94        converted to an associative array before storing it in the option.
95        */
96        $plugins = \get_option( Options::get_option_name( self::$queue_name ), array() );
97
98        $queue = new PriorityQueue();
99        foreach ( $plugins as $queued_plugin ) {
100            /*
101            Check if there is an already existing PluginActivationTask in the queue
102            for a given slug.
103            */
104            if ( $queued_plugin['slug'] === $plugin_activation_task->get_slug() ) {
105                return false;
106            }
107            $queue->insert( $queued_plugin, $queued_plugin['priority'] );
108        }
109
110        // Insert a new PluginActivationTask at the appropriate position in the queue.
111        $queue->insert(
112            $plugin_activation_task->to_array(),
113            $plugin_activation_task->get_priority()
114        );
115
116        return \update_option( Options::get_option_name( self::$queue_name ), $queue->to_array() );
117    }
118
119    /**
120     * Removes a PluginActivationTask from the queue.
121     *
122     * @param string $plugin The slug of the task to remove.
123     * @return array
124     */
125    public static function remove_from_queue( $plugin ) {
126        /*
127        Get the plugins queued up to be activated, the PluginActivationTask task gets
128        converted to an associative array before storing it in the option.
129        */
130        $plugins = \get_option( Options::get_option_name( self::$queue_name ), array() );
131
132        $queue = new PriorityQueue();
133        foreach ( $plugins as $queued_plugin ) {
134            /*
135            If the Plugin slug does not match add it back to the queue.
136            */
137            if ( $queued_plugin['slug'] !== $plugin ) {
138                $queue->insert( $queued_plugin, $queued_plugin['priority'] );
139            }
140        }
141
142        return \update_option( Options::get_option_name( self::$queue_name ), $queue->to_array() );
143    }
144}