@@ -5,67 +5,67 @@ |
||
5 | 5 | */ |
6 | 6 | class ActionScheduler_SimpleSchedule extends ActionScheduler_Abstract_Schedule { |
7 | 7 | |
8 | - /** |
|
9 | - * Deprecated property @see $this->__wakeup() for details. |
|
10 | - **/ |
|
11 | - private $timestamp = NULL; |
|
8 | + /** |
|
9 | + * Deprecated property @see $this->__wakeup() for details. |
|
10 | + **/ |
|
11 | + private $timestamp = NULL; |
|
12 | 12 | |
13 | - /** |
|
14 | - * @param DateTime $after |
|
15 | - * |
|
16 | - * @return DateTime|null |
|
17 | - */ |
|
18 | - public function calculate_next( DateTime $after ) { |
|
19 | - return null; |
|
20 | - } |
|
13 | + /** |
|
14 | + * @param DateTime $after |
|
15 | + * |
|
16 | + * @return DateTime|null |
|
17 | + */ |
|
18 | + public function calculate_next( DateTime $after ) { |
|
19 | + return null; |
|
20 | + } |
|
21 | 21 | |
22 | - /** |
|
23 | - * @return bool |
|
24 | - */ |
|
25 | - public function is_recurring() { |
|
26 | - return false; |
|
27 | - } |
|
22 | + /** |
|
23 | + * @return bool |
|
24 | + */ |
|
25 | + public function is_recurring() { |
|
26 | + return false; |
|
27 | + } |
|
28 | 28 | |
29 | - /** |
|
30 | - * Serialize schedule with data required prior to AS 3.0.0 |
|
31 | - * |
|
32 | - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer |
|
33 | - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
34 | - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
35 | - * aligned properties and property names for better inheritance. To guard against the |
|
36 | - * scheduled date for single actions always being seen as "now" if downgrading to |
|
37 | - * Action Scheduler < 3.0.0, we need to also store the data with the old property names |
|
38 | - * so if it's unserialized in AS < 3.0, the schedule doesn't end up with a null recurrence. |
|
39 | - * |
|
40 | - * @return array |
|
41 | - */ |
|
42 | - public function __sleep() { |
|
29 | + /** |
|
30 | + * Serialize schedule with data required prior to AS 3.0.0 |
|
31 | + * |
|
32 | + * Prior to Action Scheduler 3.0.0, schedules used different property names to refer |
|
33 | + * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
34 | + * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
35 | + * aligned properties and property names for better inheritance. To guard against the |
|
36 | + * scheduled date for single actions always being seen as "now" if downgrading to |
|
37 | + * Action Scheduler < 3.0.0, we need to also store the data with the old property names |
|
38 | + * so if it's unserialized in AS < 3.0, the schedule doesn't end up with a null recurrence. |
|
39 | + * |
|
40 | + * @return array |
|
41 | + */ |
|
42 | + public function __sleep() { |
|
43 | 43 | |
44 | - $sleep_params = parent::__sleep(); |
|
44 | + $sleep_params = parent::__sleep(); |
|
45 | 45 | |
46 | - $this->timestamp = $this->scheduled_timestamp; |
|
46 | + $this->timestamp = $this->scheduled_timestamp; |
|
47 | 47 | |
48 | - return array_merge( $sleep_params, array( |
|
49 | - 'timestamp', |
|
50 | - ) ); |
|
51 | - } |
|
48 | + return array_merge( $sleep_params, array( |
|
49 | + 'timestamp', |
|
50 | + ) ); |
|
51 | + } |
|
52 | 52 | |
53 | - /** |
|
54 | - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 |
|
55 | - * |
|
56 | - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer |
|
57 | - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
58 | - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
59 | - * aligned properties and property names for better inheritance. To maintain backward |
|
60 | - * compatibility with schedules serialized and stored prior to 3.0, we need to correctly |
|
61 | - * map the old property names with matching visibility. |
|
62 | - */ |
|
63 | - public function __wakeup() { |
|
53 | + /** |
|
54 | + * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 |
|
55 | + * |
|
56 | + * Prior to Action Scheduler 3.0.0, schedules used different property names to refer |
|
57 | + * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
58 | + * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
59 | + * aligned properties and property names for better inheritance. To maintain backward |
|
60 | + * compatibility with schedules serialized and stored prior to 3.0, we need to correctly |
|
61 | + * map the old property names with matching visibility. |
|
62 | + */ |
|
63 | + public function __wakeup() { |
|
64 | 64 | |
65 | - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->timestamp ) ) { |
|
66 | - $this->scheduled_timestamp = $this->timestamp; |
|
67 | - unset( $this->timestamp ); |
|
68 | - } |
|
69 | - parent::__wakeup(); |
|
70 | - } |
|
65 | + if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->timestamp ) ) { |
|
66 | + $this->scheduled_timestamp = $this->timestamp; |
|
67 | + unset( $this->timestamp ); |
|
68 | + } |
|
69 | + parent::__wakeup(); |
|
70 | + } |
|
71 | 71 | } |
@@ -15,7 +15,7 @@ discard block |
||
15 | 15 | * |
16 | 16 | * @return DateTime|null |
17 | 17 | */ |
18 | - public function calculate_next( DateTime $after ) { |
|
18 | + public function calculate_next(DateTime $after) { |
|
19 | 19 | return null; |
20 | 20 | } |
21 | 21 | |
@@ -45,9 +45,9 @@ discard block |
||
45 | 45 | |
46 | 46 | $this->timestamp = $this->scheduled_timestamp; |
47 | 47 | |
48 | - return array_merge( $sleep_params, array( |
|
48 | + return array_merge($sleep_params, array( |
|
49 | 49 | 'timestamp', |
50 | - ) ); |
|
50 | + )); |
|
51 | 51 | } |
52 | 52 | |
53 | 53 | /** |
@@ -62,9 +62,9 @@ discard block |
||
62 | 62 | */ |
63 | 63 | public function __wakeup() { |
64 | 64 | |
65 | - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->timestamp ) ) { |
|
65 | + if (is_null($this->scheduled_timestamp) && !is_null($this->timestamp)) { |
|
66 | 66 | $this->scheduled_timestamp = $this->timestamp; |
67 | - unset( $this->timestamp ); |
|
67 | + unset($this->timestamp); |
|
68 | 68 | } |
69 | 69 | parent::__wakeup(); |
70 | 70 | } |
@@ -4,15 +4,15 @@ |
||
4 | 4 | * Class ActionScheduler_Schedule |
5 | 5 | */ |
6 | 6 | interface ActionScheduler_Schedule { |
7 | - /** |
|
8 | - * @param DateTime $after |
|
9 | - * @return DateTime|null |
|
10 | - */ |
|
11 | - public function next( DateTime $after = NULL ); |
|
7 | + /** |
|
8 | + * @param DateTime $after |
|
9 | + * @return DateTime|null |
|
10 | + */ |
|
11 | + public function next( DateTime $after = NULL ); |
|
12 | 12 | |
13 | - /** |
|
14 | - * @return bool |
|
15 | - */ |
|
16 | - public function is_recurring(); |
|
13 | + /** |
|
14 | + * @return bool |
|
15 | + */ |
|
16 | + public function is_recurring(); |
|
17 | 17 | } |
18 | - |
|
19 | 18 | \ No newline at end of file |
19 | + |
|
20 | 20 | \ No newline at end of file |
@@ -8,7 +8,7 @@ |
||
8 | 8 | * @param DateTime $after |
9 | 9 | * @return DateTime|null |
10 | 10 | */ |
11 | - public function next( DateTime $after = NULL ); |
|
11 | + public function next(DateTime $after = NULL); |
|
12 | 12 | |
13 | 13 | /** |
14 | 14 | * @return bool |
@@ -5,24 +5,24 @@ |
||
5 | 5 | */ |
6 | 6 | class ActionScheduler_NullSchedule extends ActionScheduler_SimpleSchedule { |
7 | 7 | |
8 | - /** |
|
9 | - * Make the $date param optional and default to null. |
|
10 | - * |
|
11 | - * @param null $date The date & time to run the action. |
|
12 | - */ |
|
13 | - public function __construct( DateTime $date = null ) { |
|
14 | - $this->scheduled_date = null; |
|
15 | - } |
|
8 | + /** |
|
9 | + * Make the $date param optional and default to null. |
|
10 | + * |
|
11 | + * @param null $date The date & time to run the action. |
|
12 | + */ |
|
13 | + public function __construct( DateTime $date = null ) { |
|
14 | + $this->scheduled_date = null; |
|
15 | + } |
|
16 | 16 | |
17 | - /** |
|
18 | - * This schedule has no scheduled DateTime, so we need to override the parent __sleep() |
|
19 | - * @return array |
|
20 | - */ |
|
21 | - public function __sleep() { |
|
22 | - return array(); |
|
23 | - } |
|
17 | + /** |
|
18 | + * This schedule has no scheduled DateTime, so we need to override the parent __sleep() |
|
19 | + * @return array |
|
20 | + */ |
|
21 | + public function __sleep() { |
|
22 | + return array(); |
|
23 | + } |
|
24 | 24 | |
25 | - public function __wakeup() { |
|
26 | - $this->scheduled_date = null; |
|
27 | - } |
|
25 | + public function __wakeup() { |
|
26 | + $this->scheduled_date = null; |
|
27 | + } |
|
28 | 28 | } |
@@ -10,7 +10,7 @@ |
||
10 | 10 | * |
11 | 11 | * @param null $date The date & time to run the action. |
12 | 12 | */ |
13 | - public function __construct( DateTime $date = null ) { |
|
13 | + public function __construct(DateTime $date = null) { |
|
14 | 14 | $this->scheduled_date = null; |
15 | 15 | } |
16 | 16 |
@@ -5,53 +5,53 @@ |
||
5 | 5 | */ |
6 | 6 | class ActionScheduler_CanceledSchedule extends ActionScheduler_SimpleSchedule { |
7 | 7 | |
8 | - /** |
|
9 | - * Deprecated property @see $this->__wakeup() for details. |
|
10 | - **/ |
|
11 | - private $timestamp = NULL; |
|
8 | + /** |
|
9 | + * Deprecated property @see $this->__wakeup() for details. |
|
10 | + **/ |
|
11 | + private $timestamp = NULL; |
|
12 | 12 | |
13 | - /** |
|
14 | - * @param DateTime $after |
|
15 | - * |
|
16 | - * @return DateTime|null |
|
17 | - */ |
|
18 | - public function calculate_next( DateTime $after ) { |
|
19 | - return null; |
|
20 | - } |
|
13 | + /** |
|
14 | + * @param DateTime $after |
|
15 | + * |
|
16 | + * @return DateTime|null |
|
17 | + */ |
|
18 | + public function calculate_next( DateTime $after ) { |
|
19 | + return null; |
|
20 | + } |
|
21 | 21 | |
22 | - /** |
|
23 | - * Cancelled actions should never have a next schedule, even if get_next() |
|
24 | - * is called with $after < $this->scheduled_date. |
|
25 | - * |
|
26 | - * @param DateTime $after |
|
27 | - * @return DateTime|null |
|
28 | - */ |
|
29 | - public function get_next( DateTime $after ) { |
|
30 | - return null; |
|
31 | - } |
|
22 | + /** |
|
23 | + * Cancelled actions should never have a next schedule, even if get_next() |
|
24 | + * is called with $after < $this->scheduled_date. |
|
25 | + * |
|
26 | + * @param DateTime $after |
|
27 | + * @return DateTime|null |
|
28 | + */ |
|
29 | + public function get_next( DateTime $after ) { |
|
30 | + return null; |
|
31 | + } |
|
32 | 32 | |
33 | - /** |
|
34 | - * @return bool |
|
35 | - */ |
|
36 | - public function is_recurring() { |
|
37 | - return false; |
|
38 | - } |
|
33 | + /** |
|
34 | + * @return bool |
|
35 | + */ |
|
36 | + public function is_recurring() { |
|
37 | + return false; |
|
38 | + } |
|
39 | 39 | |
40 | - /** |
|
41 | - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 |
|
42 | - * |
|
43 | - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer |
|
44 | - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
45 | - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
46 | - * aligned properties and property names for better inheritance. To maintain backward |
|
47 | - * compatibility with schedules serialized and stored prior to 3.0, we need to correctly |
|
48 | - * map the old property names with matching visibility. |
|
49 | - */ |
|
50 | - public function __wakeup() { |
|
51 | - if ( ! is_null( $this->timestamp ) ) { |
|
52 | - $this->scheduled_timestamp = $this->timestamp; |
|
53 | - unset( $this->timestamp ); |
|
54 | - } |
|
55 | - parent::__wakeup(); |
|
56 | - } |
|
40 | + /** |
|
41 | + * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 |
|
42 | + * |
|
43 | + * Prior to Action Scheduler 3.0.0, schedules used different property names to refer |
|
44 | + * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
45 | + * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
46 | + * aligned properties and property names for better inheritance. To maintain backward |
|
47 | + * compatibility with schedules serialized and stored prior to 3.0, we need to correctly |
|
48 | + * map the old property names with matching visibility. |
|
49 | + */ |
|
50 | + public function __wakeup() { |
|
51 | + if ( ! is_null( $this->timestamp ) ) { |
|
52 | + $this->scheduled_timestamp = $this->timestamp; |
|
53 | + unset( $this->timestamp ); |
|
54 | + } |
|
55 | + parent::__wakeup(); |
|
56 | + } |
|
57 | 57 | } |
@@ -15,7 +15,7 @@ discard block |
||
15 | 15 | * |
16 | 16 | * @return DateTime|null |
17 | 17 | */ |
18 | - public function calculate_next( DateTime $after ) { |
|
18 | + public function calculate_next(DateTime $after) { |
|
19 | 19 | return null; |
20 | 20 | } |
21 | 21 | |
@@ -26,7 +26,7 @@ discard block |
||
26 | 26 | * @param DateTime $after |
27 | 27 | * @return DateTime|null |
28 | 28 | */ |
29 | - public function get_next( DateTime $after ) { |
|
29 | + public function get_next(DateTime $after) { |
|
30 | 30 | return null; |
31 | 31 | } |
32 | 32 | |
@@ -48,9 +48,9 @@ discard block |
||
48 | 48 | * map the old property names with matching visibility. |
49 | 49 | */ |
50 | 50 | public function __wakeup() { |
51 | - if ( ! is_null( $this->timestamp ) ) { |
|
51 | + if (!is_null($this->timestamp)) { |
|
52 | 52 | $this->scheduled_timestamp = $this->timestamp; |
53 | - unset( $this->timestamp ); |
|
53 | + unset($this->timestamp); |
|
54 | 54 | } |
55 | 55 | parent::__wakeup(); |
56 | 56 | } |
@@ -5,98 +5,98 @@ |
||
5 | 5 | */ |
6 | 6 | class ActionScheduler_CronSchedule extends ActionScheduler_Abstract_RecurringSchedule implements ActionScheduler_Schedule { |
7 | 7 | |
8 | - /** |
|
9 | - * Deprecated property @see $this->__wakeup() for details. |
|
10 | - **/ |
|
11 | - private $start_timestamp = NULL; |
|
12 | - |
|
13 | - /** |
|
14 | - * Deprecated property @see $this->__wakeup() for details. |
|
15 | - **/ |
|
16 | - private $cron = NULL; |
|
17 | - |
|
18 | - /** |
|
19 | - * Wrapper for parent constructor to accept a cron expression string and map it to a CronExpression for this |
|
20 | - * objects $recurrence property. |
|
21 | - * |
|
22 | - * @param DateTime $start The date & time to run the action at or after. If $start aligns with the CronSchedule passed via $recurrence, it will be used. If it does not align, the first matching date after it will be used. |
|
23 | - * @param CronExpression|string $recurrence The CronExpression used to calculate the schedule's next instance. |
|
24 | - * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. |
|
25 | - */ |
|
26 | - public function __construct( DateTime $start, $recurrence, DateTime $first = null ) { |
|
27 | - if ( ! is_a( $recurrence, 'CronExpression' ) ) { |
|
28 | - $recurrence = CronExpression::factory( $recurrence ); |
|
29 | - } |
|
30 | - |
|
31 | - // For backward compatibility, we need to make sure the date is set to the first matching cron date, not whatever date is passed in. Importantly, by passing true as the 3rd param, if $start matches the cron expression, then it will be used. This was previously handled in the now deprecated next() method. |
|
32 | - $date = $recurrence->getNextRunDate( $start, 0, true ); |
|
33 | - |
|
34 | - // parent::__construct() will set this to $date by default, but that may be different to $start now. |
|
35 | - $first = empty( $first ) ? $start : $first; |
|
36 | - |
|
37 | - parent::__construct( $date, $recurrence, $first ); |
|
38 | - } |
|
39 | - |
|
40 | - /** |
|
41 | - * Calculate when an instance of this schedule would start based on a given |
|
42 | - * date & time using its the CronExpression. |
|
43 | - * |
|
44 | - * @param DateTime $after |
|
45 | - * @return DateTime |
|
46 | - */ |
|
47 | - protected function calculate_next( DateTime $after ) { |
|
48 | - return $this->recurrence->getNextRunDate( $after, 0, false ); |
|
49 | - } |
|
50 | - |
|
51 | - /** |
|
52 | - * @return string |
|
53 | - */ |
|
54 | - public function get_recurrence() { |
|
55 | - return strval( $this->recurrence ); |
|
56 | - } |
|
57 | - |
|
58 | - /** |
|
59 | - * Serialize cron schedules with data required prior to AS 3.0.0 |
|
60 | - * |
|
61 | - * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to |
|
62 | - * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
63 | - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
64 | - * aligned properties and property names for better inheritance. To guard against the |
|
65 | - * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to |
|
66 | - * also store the data with the old property names so if it's unserialized in AS < 3.0, |
|
67 | - * the schedule doesn't end up with a null recurrence. |
|
68 | - * |
|
69 | - * @return array |
|
70 | - */ |
|
71 | - public function __sleep() { |
|
72 | - |
|
73 | - $sleep_params = parent::__sleep(); |
|
74 | - |
|
75 | - $this->start_timestamp = $this->scheduled_timestamp; |
|
76 | - $this->cron = $this->recurrence; |
|
77 | - |
|
78 | - return array_merge( $sleep_params, array( |
|
79 | - 'start_timestamp', |
|
80 | - 'cron' |
|
81 | - ) ); |
|
82 | - } |
|
83 | - |
|
84 | - /** |
|
85 | - * Unserialize cron schedules serialized/stored prior to AS 3.0.0 |
|
86 | - * |
|
87 | - * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). |
|
88 | - */ |
|
89 | - public function __wakeup() { |
|
90 | - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { |
|
91 | - $this->scheduled_timestamp = $this->start_timestamp; |
|
92 | - unset( $this->start_timestamp ); |
|
93 | - } |
|
94 | - |
|
95 | - if ( is_null( $this->recurrence ) && ! is_null( $this->cron ) ) { |
|
96 | - $this->recurrence = $this->cron; |
|
97 | - unset( $this->cron ); |
|
98 | - } |
|
99 | - parent::__wakeup(); |
|
100 | - } |
|
8 | + /** |
|
9 | + * Deprecated property @see $this->__wakeup() for details. |
|
10 | + **/ |
|
11 | + private $start_timestamp = NULL; |
|
12 | + |
|
13 | + /** |
|
14 | + * Deprecated property @see $this->__wakeup() for details. |
|
15 | + **/ |
|
16 | + private $cron = NULL; |
|
17 | + |
|
18 | + /** |
|
19 | + * Wrapper for parent constructor to accept a cron expression string and map it to a CronExpression for this |
|
20 | + * objects $recurrence property. |
|
21 | + * |
|
22 | + * @param DateTime $start The date & time to run the action at or after. If $start aligns with the CronSchedule passed via $recurrence, it will be used. If it does not align, the first matching date after it will be used. |
|
23 | + * @param CronExpression|string $recurrence The CronExpression used to calculate the schedule's next instance. |
|
24 | + * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. |
|
25 | + */ |
|
26 | + public function __construct( DateTime $start, $recurrence, DateTime $first = null ) { |
|
27 | + if ( ! is_a( $recurrence, 'CronExpression' ) ) { |
|
28 | + $recurrence = CronExpression::factory( $recurrence ); |
|
29 | + } |
|
30 | + |
|
31 | + // For backward compatibility, we need to make sure the date is set to the first matching cron date, not whatever date is passed in. Importantly, by passing true as the 3rd param, if $start matches the cron expression, then it will be used. This was previously handled in the now deprecated next() method. |
|
32 | + $date = $recurrence->getNextRunDate( $start, 0, true ); |
|
33 | + |
|
34 | + // parent::__construct() will set this to $date by default, but that may be different to $start now. |
|
35 | + $first = empty( $first ) ? $start : $first; |
|
36 | + |
|
37 | + parent::__construct( $date, $recurrence, $first ); |
|
38 | + } |
|
39 | + |
|
40 | + /** |
|
41 | + * Calculate when an instance of this schedule would start based on a given |
|
42 | + * date & time using its the CronExpression. |
|
43 | + * |
|
44 | + * @param DateTime $after |
|
45 | + * @return DateTime |
|
46 | + */ |
|
47 | + protected function calculate_next( DateTime $after ) { |
|
48 | + return $this->recurrence->getNextRunDate( $after, 0, false ); |
|
49 | + } |
|
50 | + |
|
51 | + /** |
|
52 | + * @return string |
|
53 | + */ |
|
54 | + public function get_recurrence() { |
|
55 | + return strval( $this->recurrence ); |
|
56 | + } |
|
57 | + |
|
58 | + /** |
|
59 | + * Serialize cron schedules with data required prior to AS 3.0.0 |
|
60 | + * |
|
61 | + * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to |
|
62 | + * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp |
|
63 | + * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 |
|
64 | + * aligned properties and property names for better inheritance. To guard against the |
|
65 | + * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to |
|
66 | + * also store the data with the old property names so if it's unserialized in AS < 3.0, |
|
67 | + * the schedule doesn't end up with a null recurrence. |
|
68 | + * |
|
69 | + * @return array |
|
70 | + */ |
|
71 | + public function __sleep() { |
|
72 | + |
|
73 | + $sleep_params = parent::__sleep(); |
|
74 | + |
|
75 | + $this->start_timestamp = $this->scheduled_timestamp; |
|
76 | + $this->cron = $this->recurrence; |
|
77 | + |
|
78 | + return array_merge( $sleep_params, array( |
|
79 | + 'start_timestamp', |
|
80 | + 'cron' |
|
81 | + ) ); |
|
82 | + } |
|
83 | + |
|
84 | + /** |
|
85 | + * Unserialize cron schedules serialized/stored prior to AS 3.0.0 |
|
86 | + * |
|
87 | + * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). |
|
88 | + */ |
|
89 | + public function __wakeup() { |
|
90 | + if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { |
|
91 | + $this->scheduled_timestamp = $this->start_timestamp; |
|
92 | + unset( $this->start_timestamp ); |
|
93 | + } |
|
94 | + |
|
95 | + if ( is_null( $this->recurrence ) && ! is_null( $this->cron ) ) { |
|
96 | + $this->recurrence = $this->cron; |
|
97 | + unset( $this->cron ); |
|
98 | + } |
|
99 | + parent::__wakeup(); |
|
100 | + } |
|
101 | 101 | } |
102 | 102 |
@@ -23,18 +23,18 @@ discard block |
||
23 | 23 | * @param CronExpression|string $recurrence The CronExpression used to calculate the schedule's next instance. |
24 | 24 | * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. |
25 | 25 | */ |
26 | - public function __construct( DateTime $start, $recurrence, DateTime $first = null ) { |
|
27 | - if ( ! is_a( $recurrence, 'CronExpression' ) ) { |
|
28 | - $recurrence = CronExpression::factory( $recurrence ); |
|
26 | + public function __construct(DateTime $start, $recurrence, DateTime $first = null) { |
|
27 | + if (!is_a($recurrence, 'CronExpression')) { |
|
28 | + $recurrence = CronExpression::factory($recurrence); |
|
29 | 29 | } |
30 | 30 | |
31 | 31 | // For backward compatibility, we need to make sure the date is set to the first matching cron date, not whatever date is passed in. Importantly, by passing true as the 3rd param, if $start matches the cron expression, then it will be used. This was previously handled in the now deprecated next() method. |
32 | - $date = $recurrence->getNextRunDate( $start, 0, true ); |
|
32 | + $date = $recurrence->getNextRunDate($start, 0, true); |
|
33 | 33 | |
34 | 34 | // parent::__construct() will set this to $date by default, but that may be different to $start now. |
35 | - $first = empty( $first ) ? $start : $first; |
|
35 | + $first = empty($first) ? $start : $first; |
|
36 | 36 | |
37 | - parent::__construct( $date, $recurrence, $first ); |
|
37 | + parent::__construct($date, $recurrence, $first); |
|
38 | 38 | } |
39 | 39 | |
40 | 40 | /** |
@@ -44,15 +44,15 @@ discard block |
||
44 | 44 | * @param DateTime $after |
45 | 45 | * @return DateTime |
46 | 46 | */ |
47 | - protected function calculate_next( DateTime $after ) { |
|
48 | - return $this->recurrence->getNextRunDate( $after, 0, false ); |
|
47 | + protected function calculate_next(DateTime $after) { |
|
48 | + return $this->recurrence->getNextRunDate($after, 0, false); |
|
49 | 49 | } |
50 | 50 | |
51 | 51 | /** |
52 | 52 | * @return string |
53 | 53 | */ |
54 | 54 | public function get_recurrence() { |
55 | - return strval( $this->recurrence ); |
|
55 | + return strval($this->recurrence); |
|
56 | 56 | } |
57 | 57 | |
58 | 58 | /** |
@@ -75,10 +75,10 @@ discard block |
||
75 | 75 | $this->start_timestamp = $this->scheduled_timestamp; |
76 | 76 | $this->cron = $this->recurrence; |
77 | 77 | |
78 | - return array_merge( $sleep_params, array( |
|
78 | + return array_merge($sleep_params, array( |
|
79 | 79 | 'start_timestamp', |
80 | 80 | 'cron' |
81 | - ) ); |
|
81 | + )); |
|
82 | 82 | } |
83 | 83 | |
84 | 84 | /** |
@@ -87,14 +87,14 @@ discard block |
||
87 | 87 | * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). |
88 | 88 | */ |
89 | 89 | public function __wakeup() { |
90 | - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { |
|
90 | + if (is_null($this->scheduled_timestamp) && !is_null($this->start_timestamp)) { |
|
91 | 91 | $this->scheduled_timestamp = $this->start_timestamp; |
92 | - unset( $this->start_timestamp ); |
|
92 | + unset($this->start_timestamp); |
|
93 | 93 | } |
94 | 94 | |
95 | - if ( is_null( $this->recurrence ) && ! is_null( $this->cron ) ) { |
|
95 | + if (is_null($this->recurrence) && !is_null($this->cron)) { |
|
96 | 96 | $this->recurrence = $this->cron; |
97 | - unset( $this->cron ); |
|
97 | + unset($this->cron); |
|
98 | 98 | } |
99 | 99 | parent::__wakeup(); |
100 | 100 | } |
@@ -6,606 +6,606 @@ |
||
6 | 6 | */ |
7 | 7 | class ActionScheduler_ListTable extends ActionScheduler_Abstract_ListTable { |
8 | 8 | |
9 | - /** |
|
10 | - * The package name. |
|
11 | - * |
|
12 | - * @var string |
|
13 | - */ |
|
14 | - protected $package = 'action-scheduler'; |
|
15 | - |
|
16 | - /** |
|
17 | - * Columns to show (name => label). |
|
18 | - * |
|
19 | - * @var array |
|
20 | - */ |
|
21 | - protected $columns = array(); |
|
22 | - |
|
23 | - /** |
|
24 | - * Actions (name => label). |
|
25 | - * |
|
26 | - * @var array |
|
27 | - */ |
|
28 | - protected $row_actions = array(); |
|
29 | - |
|
30 | - /** |
|
31 | - * The active data stores |
|
32 | - * |
|
33 | - * @var ActionScheduler_Store |
|
34 | - */ |
|
35 | - protected $store; |
|
36 | - |
|
37 | - /** |
|
38 | - * A logger to use for getting action logs to display |
|
39 | - * |
|
40 | - * @var ActionScheduler_Logger |
|
41 | - */ |
|
42 | - protected $logger; |
|
43 | - |
|
44 | - /** |
|
45 | - * A ActionScheduler_QueueRunner runner instance (or child class) |
|
46 | - * |
|
47 | - * @var ActionScheduler_QueueRunner |
|
48 | - */ |
|
49 | - protected $runner; |
|
50 | - |
|
51 | - /** |
|
52 | - * Bulk actions. The key of the array is the method name of the implementation: |
|
53 | - * |
|
54 | - * bulk_<key>(array $ids, string $sql_in). |
|
55 | - * |
|
56 | - * See the comments in the parent class for further details |
|
57 | - * |
|
58 | - * @var array |
|
59 | - */ |
|
60 | - protected $bulk_actions = array(); |
|
61 | - |
|
62 | - /** |
|
63 | - * Flag variable to render our notifications, if any, once. |
|
64 | - * |
|
65 | - * @var bool |
|
66 | - */ |
|
67 | - protected static $did_notification = false; |
|
68 | - |
|
69 | - /** |
|
70 | - * Array of seconds for common time periods, like week or month, alongside an internationalised string representation, i.e. "Day" or "Days" |
|
71 | - * |
|
72 | - * @var array |
|
73 | - */ |
|
74 | - private static $time_periods; |
|
75 | - |
|
76 | - /** |
|
77 | - * Sets the current data store object into `store->action` and initialises the object. |
|
78 | - * |
|
79 | - * @param ActionScheduler_Store $store |
|
80 | - * @param ActionScheduler_Logger $logger |
|
81 | - * @param ActionScheduler_QueueRunner $runner |
|
82 | - */ |
|
83 | - public function __construct( ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner ) { |
|
84 | - |
|
85 | - $this->store = $store; |
|
86 | - $this->logger = $logger; |
|
87 | - $this->runner = $runner; |
|
88 | - |
|
89 | - $this->table_header = __( 'Scheduled Actions', 'action-scheduler' ); |
|
90 | - |
|
91 | - $this->bulk_actions = array( |
|
92 | - 'delete' => __( 'Delete', 'action-scheduler' ), |
|
93 | - ); |
|
94 | - |
|
95 | - $this->columns = array( |
|
96 | - 'hook' => __( 'Hook', 'action-scheduler' ), |
|
97 | - 'status' => __( 'Status', 'action-scheduler' ), |
|
98 | - 'args' => __( 'Arguments', 'action-scheduler' ), |
|
99 | - 'group' => __( 'Group', 'action-scheduler' ), |
|
100 | - 'recurrence' => __( 'Recurrence', 'action-scheduler' ), |
|
101 | - 'schedule' => __( 'Scheduled Date', 'action-scheduler' ), |
|
102 | - 'log_entries' => __( 'Log', 'action-scheduler' ), |
|
103 | - ); |
|
104 | - |
|
105 | - $this->sort_by = array( |
|
106 | - 'schedule', |
|
107 | - 'hook', |
|
108 | - 'group', |
|
109 | - ); |
|
110 | - |
|
111 | - $this->search_by = array( |
|
112 | - 'hook', |
|
113 | - 'args', |
|
114 | - 'claim_id', |
|
115 | - ); |
|
116 | - |
|
117 | - $request_status = $this->get_request_status(); |
|
118 | - |
|
119 | - if ( empty( $request_status ) ) { |
|
120 | - $this->sort_by[] = 'status'; |
|
121 | - } elseif ( in_array( $request_status, array( 'in-progress', 'failed' ) ) ) { |
|
122 | - $this->columns += array( 'claim_id' => __( 'Claim ID', 'action-scheduler' ) ); |
|
123 | - $this->sort_by[] = 'claim_id'; |
|
124 | - } |
|
125 | - |
|
126 | - $this->row_actions = array( |
|
127 | - 'hook' => array( |
|
128 | - 'run' => array( |
|
129 | - 'name' => __( 'Run', 'action-scheduler' ), |
|
130 | - 'desc' => __( 'Process the action now as if it were run as part of a queue', 'action-scheduler' ), |
|
131 | - ), |
|
132 | - 'cancel' => array( |
|
133 | - 'name' => __( 'Cancel', 'action-scheduler' ), |
|
134 | - 'desc' => __( 'Cancel the action now to avoid it being run in future', 'action-scheduler' ), |
|
135 | - 'class' => 'cancel trash', |
|
136 | - ), |
|
137 | - ), |
|
138 | - ); |
|
139 | - |
|
140 | - self::$time_periods = array( |
|
141 | - array( |
|
142 | - 'seconds' => YEAR_IN_SECONDS, |
|
143 | - /* translators: %s: amount of time */ |
|
144 | - 'names' => _n_noop( '%s year', '%s years', 'action-scheduler' ), |
|
145 | - ), |
|
146 | - array( |
|
147 | - 'seconds' => MONTH_IN_SECONDS, |
|
148 | - /* translators: %s: amount of time */ |
|
149 | - 'names' => _n_noop( '%s month', '%s months', 'action-scheduler' ), |
|
150 | - ), |
|
151 | - array( |
|
152 | - 'seconds' => WEEK_IN_SECONDS, |
|
153 | - /* translators: %s: amount of time */ |
|
154 | - 'names' => _n_noop( '%s week', '%s weeks', 'action-scheduler' ), |
|
155 | - ), |
|
156 | - array( |
|
157 | - 'seconds' => DAY_IN_SECONDS, |
|
158 | - /* translators: %s: amount of time */ |
|
159 | - 'names' => _n_noop( '%s day', '%s days', 'action-scheduler' ), |
|
160 | - ), |
|
161 | - array( |
|
162 | - 'seconds' => HOUR_IN_SECONDS, |
|
163 | - /* translators: %s: amount of time */ |
|
164 | - 'names' => _n_noop( '%s hour', '%s hours', 'action-scheduler' ), |
|
165 | - ), |
|
166 | - array( |
|
167 | - 'seconds' => MINUTE_IN_SECONDS, |
|
168 | - /* translators: %s: amount of time */ |
|
169 | - 'names' => _n_noop( '%s minute', '%s minutes', 'action-scheduler' ), |
|
170 | - ), |
|
171 | - array( |
|
172 | - 'seconds' => 1, |
|
173 | - /* translators: %s: amount of time */ |
|
174 | - 'names' => _n_noop( '%s second', '%s seconds', 'action-scheduler' ), |
|
175 | - ), |
|
176 | - ); |
|
177 | - |
|
178 | - parent::__construct( array( |
|
179 | - 'singular' => 'action-scheduler', |
|
180 | - 'plural' => 'action-scheduler', |
|
181 | - 'ajax' => false, |
|
182 | - ) ); |
|
183 | - } |
|
184 | - |
|
185 | - /** |
|
186 | - * Convert an interval of seconds into a two part human friendly string. |
|
187 | - * |
|
188 | - * The WordPress human_time_diff() function only calculates the time difference to one degree, meaning |
|
189 | - * even if an action is 1 day and 11 hours away, it will display "1 day". This function goes one step |
|
190 | - * further to display two degrees of accuracy. |
|
191 | - * |
|
192 | - * Inspired by the Crontrol::interval() function by Edward Dale: https://wordpress.org/plugins/wp-crontrol/ |
|
193 | - * |
|
194 | - * @param int $interval A interval in seconds. |
|
195 | - * @param int $periods_to_include Depth of time periods to include, e.g. for an interval of 70, and $periods_to_include of 2, both minutes and seconds would be included. With a value of 1, only minutes would be included. |
|
196 | - * @return string A human friendly string representation of the interval. |
|
197 | - */ |
|
198 | - private static function human_interval( $interval, $periods_to_include = 2 ) { |
|
199 | - |
|
200 | - if ( $interval <= 0 ) { |
|
201 | - return __( 'Now!', 'action-scheduler' ); |
|
202 | - } |
|
203 | - |
|
204 | - $output = ''; |
|
205 | - |
|
206 | - for ( $time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count( self::$time_periods ) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++ ) { |
|
207 | - |
|
208 | - $periods_in_interval = floor( $seconds_remaining / self::$time_periods[ $time_period_index ]['seconds'] ); |
|
209 | - |
|
210 | - if ( $periods_in_interval > 0 ) { |
|
211 | - if ( ! empty( $output ) ) { |
|
212 | - $output .= ' '; |
|
213 | - } |
|
214 | - $output .= sprintf( _n( self::$time_periods[ $time_period_index ]['names'][0], self::$time_periods[ $time_period_index ]['names'][1], $periods_in_interval, 'action-scheduler' ), $periods_in_interval ); |
|
215 | - $seconds_remaining -= $periods_in_interval * self::$time_periods[ $time_period_index ]['seconds']; |
|
216 | - $periods_included++; |
|
217 | - } |
|
218 | - } |
|
219 | - |
|
220 | - return $output; |
|
221 | - } |
|
222 | - |
|
223 | - /** |
|
224 | - * Returns the recurrence of an action or 'Non-repeating'. The output is human readable. |
|
225 | - * |
|
226 | - * @param ActionScheduler_Action $action |
|
227 | - * |
|
228 | - * @return string |
|
229 | - */ |
|
230 | - protected function get_recurrence( $action ) { |
|
231 | - $schedule = $action->get_schedule(); |
|
232 | - if ( $schedule->is_recurring() ) { |
|
233 | - $recurrence = $schedule->get_recurrence(); |
|
234 | - |
|
235 | - if ( is_numeric( $recurrence ) ) { |
|
236 | - /* translators: %s: time interval */ |
|
237 | - return sprintf( __( 'Every %s', 'action-scheduler' ), self::human_interval( $recurrence ) ); |
|
238 | - } else { |
|
239 | - return $recurrence; |
|
240 | - } |
|
241 | - } |
|
242 | - |
|
243 | - return __( 'Non-repeating', 'action-scheduler' ); |
|
244 | - } |
|
245 | - |
|
246 | - /** |
|
247 | - * Serializes the argument of an action to render it in a human friendly format. |
|
248 | - * |
|
249 | - * @param array $row The array representation of the current row of the table |
|
250 | - * |
|
251 | - * @return string |
|
252 | - */ |
|
253 | - public function column_args( array $row ) { |
|
254 | - if ( empty( $row['args'] ) ) { |
|
255 | - return apply_filters( 'action_scheduler_list_table_column_args', '', $row ); |
|
256 | - } |
|
257 | - |
|
258 | - $row_html = '<ul>'; |
|
259 | - foreach ( $row['args'] as $key => $value ) { |
|
260 | - $row_html .= sprintf( '<li><code>%s => %s</code></li>', esc_html( var_export( $key, true ) ), esc_html( var_export( $value, true ) ) ); |
|
261 | - } |
|
262 | - $row_html .= '</ul>'; |
|
263 | - |
|
264 | - return apply_filters( 'action_scheduler_list_table_column_args', $row_html, $row ); |
|
265 | - } |
|
266 | - |
|
267 | - /** |
|
268 | - * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. |
|
269 | - * |
|
270 | - * @param array $row Action array. |
|
271 | - * @return string |
|
272 | - */ |
|
273 | - public function column_log_entries( array $row ) { |
|
274 | - |
|
275 | - $log_entries_html = '<ol>'; |
|
276 | - |
|
277 | - $timezone = new DateTimezone( 'UTC' ); |
|
278 | - |
|
279 | - foreach ( $row['log_entries'] as $log_entry ) { |
|
280 | - $log_entries_html .= $this->get_log_entry_html( $log_entry, $timezone ); |
|
281 | - } |
|
282 | - |
|
283 | - $log_entries_html .= '</ol>'; |
|
284 | - |
|
285 | - return $log_entries_html; |
|
286 | - } |
|
287 | - |
|
288 | - /** |
|
289 | - * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. |
|
290 | - * |
|
291 | - * @param ActionScheduler_LogEntry $log_entry |
|
292 | - * @param DateTimezone $timezone |
|
293 | - * @return string |
|
294 | - */ |
|
295 | - protected function get_log_entry_html( ActionScheduler_LogEntry $log_entry, DateTimezone $timezone ) { |
|
296 | - $date = $log_entry->get_date(); |
|
297 | - $date->setTimezone( $timezone ); |
|
298 | - return sprintf( '<li><strong>%s</strong><br/>%s</li>', esc_html( $date->format( 'Y-m-d H:i:s O' ) ), esc_html( $log_entry->get_message() ) ); |
|
299 | - } |
|
300 | - |
|
301 | - /** |
|
302 | - * Only display row actions for pending actions. |
|
303 | - * |
|
304 | - * @param array $row Row to render |
|
305 | - * @param string $column_name Current row |
|
306 | - * |
|
307 | - * @return string |
|
308 | - */ |
|
309 | - protected function maybe_render_actions( $row, $column_name ) { |
|
310 | - if ( 'pending' === strtolower( $row['status'] ) ) { |
|
311 | - return parent::maybe_render_actions( $row, $column_name ); |
|
312 | - } |
|
313 | - |
|
314 | - return ''; |
|
315 | - } |
|
316 | - |
|
317 | - /** |
|
318 | - * Renders admin notifications |
|
319 | - * |
|
320 | - * Notifications: |
|
321 | - * 1. When the maximum number of tasks are being executed simultaneously. |
|
322 | - * 2. Notifications when a task is manually executed. |
|
323 | - * 3. Tables are missing. |
|
324 | - */ |
|
325 | - public function display_admin_notices() { |
|
326 | - global $wpdb; |
|
327 | - |
|
328 | - if ( ( is_a( $this->store, 'ActionScheduler_HybridStore' ) || is_a( $this->store, 'ActionScheduler_DBStore' ) ) && apply_filters( 'action_scheduler_enable_recreate_data_store', true ) ) { |
|
329 | - $table_list = array( |
|
330 | - 'actionscheduler_actions', |
|
331 | - 'actionscheduler_logs', |
|
332 | - 'actionscheduler_groups', |
|
333 | - 'actionscheduler_claims', |
|
334 | - ); |
|
335 | - |
|
336 | - $found_tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared |
|
337 | - foreach ( $table_list as $table_name ) { |
|
338 | - if ( ! in_array( $wpdb->prefix . $table_name, $found_tables ) ) { |
|
339 | - $this->admin_notices[] = array( |
|
340 | - 'class' => 'error', |
|
341 | - 'message' => __( 'It appears one or more database tables were missing. Attempting to re-create the missing table(s).' , 'action-scheduler' ), |
|
342 | - ); |
|
343 | - $this->recreate_tables(); |
|
344 | - parent::display_admin_notices(); |
|
345 | - |
|
346 | - return; |
|
347 | - } |
|
348 | - } |
|
349 | - } |
|
350 | - |
|
351 | - if ( $this->runner->has_maximum_concurrent_batches() ) { |
|
352 | - $claim_count = $this->store->get_claim_count(); |
|
353 | - $this->admin_notices[] = array( |
|
354 | - 'class' => 'updated', |
|
355 | - 'message' => sprintf( |
|
356 | - /* translators: %s: amount of claims */ |
|
357 | - _n( |
|
358 | - 'Maximum simultaneous queues already in progress (%s queue). No additional queues will begin processing until the current queues are complete.', |
|
359 | - 'Maximum simultaneous queues already in progress (%s queues). No additional queues will begin processing until the current queues are complete.', |
|
360 | - $claim_count, |
|
361 | - 'action-scheduler' |
|
362 | - ), |
|
363 | - $claim_count |
|
364 | - ), |
|
365 | - ); |
|
366 | - } elseif ( $this->store->has_pending_actions_due() ) { |
|
367 | - |
|
368 | - $async_request_lock_expiration = ActionScheduler::lock()->get_expiration( 'async-request-runner' ); |
|
369 | - |
|
370 | - // No lock set or lock expired |
|
371 | - if ( false === $async_request_lock_expiration || $async_request_lock_expiration < time() ) { |
|
372 | - $in_progress_url = add_query_arg( 'status', 'in-progress', remove_query_arg( 'status' ) ); |
|
373 | - /* translators: %s: process URL */ |
|
374 | - $async_request_message = sprintf( __( 'A new queue has begun processing. <a href="%s">View actions in-progress »</a>', 'action-scheduler' ), esc_url( $in_progress_url ) ); |
|
375 | - } else { |
|
376 | - /* translators: %d: seconds */ |
|
377 | - $async_request_message = sprintf( __( 'The next queue will begin processing in approximately %d seconds.', 'action-scheduler' ), $async_request_lock_expiration - time() ); |
|
378 | - } |
|
379 | - |
|
380 | - $this->admin_notices[] = array( |
|
381 | - 'class' => 'notice notice-info', |
|
382 | - 'message' => $async_request_message, |
|
383 | - ); |
|
384 | - } |
|
385 | - |
|
386 | - $notification = get_transient( 'action_scheduler_admin_notice' ); |
|
387 | - |
|
388 | - if ( is_array( $notification ) ) { |
|
389 | - delete_transient( 'action_scheduler_admin_notice' ); |
|
390 | - |
|
391 | - $action = $this->store->fetch_action( $notification['action_id'] ); |
|
392 | - $action_hook_html = '<strong><code>' . $action->get_hook() . '</code></strong>'; |
|
393 | - if ( 1 == $notification['success'] ) { |
|
394 | - $class = 'updated'; |
|
395 | - switch ( $notification['row_action_type'] ) { |
|
396 | - case 'run' : |
|
397 | - /* translators: %s: action HTML */ |
|
398 | - $action_message_html = sprintf( __( 'Successfully executed action: %s', 'action-scheduler' ), $action_hook_html ); |
|
399 | - break; |
|
400 | - case 'cancel' : |
|
401 | - /* translators: %s: action HTML */ |
|
402 | - $action_message_html = sprintf( __( 'Successfully canceled action: %s', 'action-scheduler' ), $action_hook_html ); |
|
403 | - break; |
|
404 | - default : |
|
405 | - /* translators: %s: action HTML */ |
|
406 | - $action_message_html = sprintf( __( 'Successfully processed change for action: %s', 'action-scheduler' ), $action_hook_html ); |
|
407 | - break; |
|
408 | - } |
|
409 | - } else { |
|
410 | - $class = 'error'; |
|
411 | - /* translators: 1: action HTML 2: action ID 3: error message */ |
|
412 | - $action_message_html = sprintf( __( 'Could not process change for action: "%1$s" (ID: %2$d). Error: %3$s', 'action-scheduler' ), $action_hook_html, esc_html( $notification['action_id'] ), esc_html( $notification['error_message'] ) ); |
|
413 | - } |
|
414 | - |
|
415 | - $action_message_html = apply_filters( 'action_scheduler_admin_notice_html', $action_message_html, $action, $notification ); |
|
416 | - |
|
417 | - $this->admin_notices[] = array( |
|
418 | - 'class' => $class, |
|
419 | - 'message' => $action_message_html, |
|
420 | - ); |
|
421 | - } |
|
422 | - |
|
423 | - parent::display_admin_notices(); |
|
424 | - } |
|
425 | - |
|
426 | - /** |
|
427 | - * Prints the scheduled date in a human friendly format. |
|
428 | - * |
|
429 | - * @param array $row The array representation of the current row of the table |
|
430 | - * |
|
431 | - * @return string |
|
432 | - */ |
|
433 | - public function column_schedule( $row ) { |
|
434 | - return $this->get_schedule_display_string( $row['schedule'] ); |
|
435 | - } |
|
436 | - |
|
437 | - /** |
|
438 | - * Get the scheduled date in a human friendly format. |
|
439 | - * |
|
440 | - * @param ActionScheduler_Schedule $schedule |
|
441 | - * @return string |
|
442 | - */ |
|
443 | - protected function get_schedule_display_string( ActionScheduler_Schedule $schedule ) { |
|
444 | - |
|
445 | - $schedule_display_string = ''; |
|
446 | - |
|
447 | - if ( ! $schedule->get_date() ) { |
|
448 | - return '0000-00-00 00:00:00'; |
|
449 | - } |
|
450 | - |
|
451 | - $next_timestamp = $schedule->get_date()->getTimestamp(); |
|
452 | - |
|
453 | - $schedule_display_string .= $schedule->get_date()->format( 'Y-m-d H:i:s O' ); |
|
454 | - $schedule_display_string .= '<br/>'; |
|
455 | - |
|
456 | - if ( gmdate( 'U' ) > $next_timestamp ) { |
|
457 | - /* translators: %s: date interval */ |
|
458 | - $schedule_display_string .= sprintf( __( ' (%s ago)', 'action-scheduler' ), self::human_interval( gmdate( 'U' ) - $next_timestamp ) ); |
|
459 | - } else { |
|
460 | - /* translators: %s: date interval */ |
|
461 | - $schedule_display_string .= sprintf( __( ' (%s)', 'action-scheduler' ), self::human_interval( $next_timestamp - gmdate( 'U' ) ) ); |
|
462 | - } |
|
463 | - |
|
464 | - return $schedule_display_string; |
|
465 | - } |
|
466 | - |
|
467 | - /** |
|
468 | - * Bulk delete |
|
469 | - * |
|
470 | - * Deletes actions based on their ID. This is the handler for the bulk delete. It assumes the data |
|
471 | - * properly validated by the callee and it will delete the actions without any extra validation. |
|
472 | - * |
|
473 | - * @param array $ids |
|
474 | - * @param string $ids_sql Inherited and unused |
|
475 | - */ |
|
476 | - protected function bulk_delete( array $ids, $ids_sql ) { |
|
477 | - foreach ( $ids as $id ) { |
|
478 | - $this->store->delete_action( $id ); |
|
479 | - } |
|
480 | - } |
|
481 | - |
|
482 | - /** |
|
483 | - * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their |
|
484 | - * parameters are valid. |
|
485 | - * |
|
486 | - * @param int $action_id |
|
487 | - */ |
|
488 | - protected function row_action_cancel( $action_id ) { |
|
489 | - $this->process_row_action( $action_id, 'cancel' ); |
|
490 | - } |
|
491 | - |
|
492 | - /** |
|
493 | - * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their |
|
494 | - * parameters are valid. |
|
495 | - * |
|
496 | - * @param int $action_id |
|
497 | - */ |
|
498 | - protected function row_action_run( $action_id ) { |
|
499 | - $this->process_row_action( $action_id, 'run' ); |
|
500 | - } |
|
501 | - |
|
502 | - /** |
|
503 | - * Force the data store schema updates. |
|
504 | - */ |
|
505 | - protected function recreate_tables() { |
|
506 | - if ( is_a( $this->store, 'ActionScheduler_HybridStore' ) ) { |
|
507 | - $store = $this->store; |
|
508 | - } else { |
|
509 | - $store = new ActionScheduler_HybridStore(); |
|
510 | - } |
|
511 | - add_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10, 2 ); |
|
512 | - |
|
513 | - $store_schema = new ActionScheduler_StoreSchema(); |
|
514 | - $logger_schema = new ActionScheduler_LoggerSchema(); |
|
515 | - $store_schema->register_tables( true ); |
|
516 | - $logger_schema->register_tables( true ); |
|
517 | - |
|
518 | - remove_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10 ); |
|
519 | - } |
|
520 | - /** |
|
521 | - * Implements the logic behind processing an action once an action link is clicked on the list table. |
|
522 | - * |
|
523 | - * @param int $action_id |
|
524 | - * @param string $row_action_type The type of action to perform on the action. |
|
525 | - */ |
|
526 | - protected function process_row_action( $action_id, $row_action_type ) { |
|
527 | - try { |
|
528 | - switch ( $row_action_type ) { |
|
529 | - case 'run' : |
|
530 | - $this->runner->process_action( $action_id, 'Admin List Table' ); |
|
531 | - break; |
|
532 | - case 'cancel' : |
|
533 | - $this->store->cancel_action( $action_id ); |
|
534 | - break; |
|
535 | - } |
|
536 | - $success = 1; |
|
537 | - $error_message = ''; |
|
538 | - } catch ( Exception $e ) { |
|
539 | - $success = 0; |
|
540 | - $error_message = $e->getMessage(); |
|
541 | - } |
|
542 | - |
|
543 | - set_transient( 'action_scheduler_admin_notice', compact( 'action_id', 'success', 'error_message', 'row_action_type' ), 30 ); |
|
544 | - } |
|
545 | - |
|
546 | - /** |
|
547 | - * {@inheritDoc} |
|
548 | - */ |
|
549 | - public function prepare_items() { |
|
550 | - $this->prepare_column_headers(); |
|
551 | - |
|
552 | - $per_page = $this->get_items_per_page( $this->package . '_items_per_page', $this->items_per_page ); |
|
553 | - $query = array( |
|
554 | - 'per_page' => $per_page, |
|
555 | - 'offset' => $this->get_items_offset(), |
|
556 | - 'status' => $this->get_request_status(), |
|
557 | - 'orderby' => $this->get_request_orderby(), |
|
558 | - 'order' => $this->get_request_order(), |
|
559 | - 'search' => $this->get_request_search_query(), |
|
560 | - ); |
|
561 | - |
|
562 | - $this->items = array(); |
|
563 | - |
|
564 | - $total_items = $this->store->query_actions( $query, 'count' ); |
|
565 | - |
|
566 | - $status_labels = $this->store->get_status_labels(); |
|
567 | - |
|
568 | - foreach ( $this->store->query_actions( $query ) as $action_id ) { |
|
569 | - try { |
|
570 | - $action = $this->store->fetch_action( $action_id ); |
|
571 | - } catch ( Exception $e ) { |
|
572 | - continue; |
|
573 | - } |
|
574 | - if ( is_a( $action, 'ActionScheduler_NullAction' ) ) { |
|
575 | - continue; |
|
576 | - } |
|
577 | - $this->items[ $action_id ] = array( |
|
578 | - 'ID' => $action_id, |
|
579 | - 'hook' => $action->get_hook(), |
|
580 | - 'status' => $status_labels[ $this->store->get_status( $action_id ) ], |
|
581 | - 'args' => $action->get_args(), |
|
582 | - 'group' => $action->get_group(), |
|
583 | - 'log_entries' => $this->logger->get_logs( $action_id ), |
|
584 | - 'claim_id' => $this->store->get_claim_id( $action_id ), |
|
585 | - 'recurrence' => $this->get_recurrence( $action ), |
|
586 | - 'schedule' => $action->get_schedule(), |
|
587 | - ); |
|
588 | - } |
|
589 | - |
|
590 | - $this->set_pagination_args( array( |
|
591 | - 'total_items' => $total_items, |
|
592 | - 'per_page' => $per_page, |
|
593 | - 'total_pages' => ceil( $total_items / $per_page ), |
|
594 | - ) ); |
|
595 | - } |
|
596 | - |
|
597 | - /** |
|
598 | - * Prints the available statuses so the user can click to filter. |
|
599 | - */ |
|
600 | - protected function display_filter_by_status() { |
|
601 | - $this->status_counts = $this->store->action_counts(); |
|
602 | - parent::display_filter_by_status(); |
|
603 | - } |
|
604 | - |
|
605 | - /** |
|
606 | - * Get the text to display in the search box on the list table. |
|
607 | - */ |
|
608 | - protected function get_search_box_button_text() { |
|
609 | - return __( 'Search hook, args and claim ID', 'action-scheduler' ); |
|
610 | - } |
|
9 | + /** |
|
10 | + * The package name. |
|
11 | + * |
|
12 | + * @var string |
|
13 | + */ |
|
14 | + protected $package = 'action-scheduler'; |
|
15 | + |
|
16 | + /** |
|
17 | + * Columns to show (name => label). |
|
18 | + * |
|
19 | + * @var array |
|
20 | + */ |
|
21 | + protected $columns = array(); |
|
22 | + |
|
23 | + /** |
|
24 | + * Actions (name => label). |
|
25 | + * |
|
26 | + * @var array |
|
27 | + */ |
|
28 | + protected $row_actions = array(); |
|
29 | + |
|
30 | + /** |
|
31 | + * The active data stores |
|
32 | + * |
|
33 | + * @var ActionScheduler_Store |
|
34 | + */ |
|
35 | + protected $store; |
|
36 | + |
|
37 | + /** |
|
38 | + * A logger to use for getting action logs to display |
|
39 | + * |
|
40 | + * @var ActionScheduler_Logger |
|
41 | + */ |
|
42 | + protected $logger; |
|
43 | + |
|
44 | + /** |
|
45 | + * A ActionScheduler_QueueRunner runner instance (or child class) |
|
46 | + * |
|
47 | + * @var ActionScheduler_QueueRunner |
|
48 | + */ |
|
49 | + protected $runner; |
|
50 | + |
|
51 | + /** |
|
52 | + * Bulk actions. The key of the array is the method name of the implementation: |
|
53 | + * |
|
54 | + * bulk_<key>(array $ids, string $sql_in). |
|
55 | + * |
|
56 | + * See the comments in the parent class for further details |
|
57 | + * |
|
58 | + * @var array |
|
59 | + */ |
|
60 | + protected $bulk_actions = array(); |
|
61 | + |
|
62 | + /** |
|
63 | + * Flag variable to render our notifications, if any, once. |
|
64 | + * |
|
65 | + * @var bool |
|
66 | + */ |
|
67 | + protected static $did_notification = false; |
|
68 | + |
|
69 | + /** |
|
70 | + * Array of seconds for common time periods, like week or month, alongside an internationalised string representation, i.e. "Day" or "Days" |
|
71 | + * |
|
72 | + * @var array |
|
73 | + */ |
|
74 | + private static $time_periods; |
|
75 | + |
|
76 | + /** |
|
77 | + * Sets the current data store object into `store->action` and initialises the object. |
|
78 | + * |
|
79 | + * @param ActionScheduler_Store $store |
|
80 | + * @param ActionScheduler_Logger $logger |
|
81 | + * @param ActionScheduler_QueueRunner $runner |
|
82 | + */ |
|
83 | + public function __construct( ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner ) { |
|
84 | + |
|
85 | + $this->store = $store; |
|
86 | + $this->logger = $logger; |
|
87 | + $this->runner = $runner; |
|
88 | + |
|
89 | + $this->table_header = __( 'Scheduled Actions', 'action-scheduler' ); |
|
90 | + |
|
91 | + $this->bulk_actions = array( |
|
92 | + 'delete' => __( 'Delete', 'action-scheduler' ), |
|
93 | + ); |
|
94 | + |
|
95 | + $this->columns = array( |
|
96 | + 'hook' => __( 'Hook', 'action-scheduler' ), |
|
97 | + 'status' => __( 'Status', 'action-scheduler' ), |
|
98 | + 'args' => __( 'Arguments', 'action-scheduler' ), |
|
99 | + 'group' => __( 'Group', 'action-scheduler' ), |
|
100 | + 'recurrence' => __( 'Recurrence', 'action-scheduler' ), |
|
101 | + 'schedule' => __( 'Scheduled Date', 'action-scheduler' ), |
|
102 | + 'log_entries' => __( 'Log', 'action-scheduler' ), |
|
103 | + ); |
|
104 | + |
|
105 | + $this->sort_by = array( |
|
106 | + 'schedule', |
|
107 | + 'hook', |
|
108 | + 'group', |
|
109 | + ); |
|
110 | + |
|
111 | + $this->search_by = array( |
|
112 | + 'hook', |
|
113 | + 'args', |
|
114 | + 'claim_id', |
|
115 | + ); |
|
116 | + |
|
117 | + $request_status = $this->get_request_status(); |
|
118 | + |
|
119 | + if ( empty( $request_status ) ) { |
|
120 | + $this->sort_by[] = 'status'; |
|
121 | + } elseif ( in_array( $request_status, array( 'in-progress', 'failed' ) ) ) { |
|
122 | + $this->columns += array( 'claim_id' => __( 'Claim ID', 'action-scheduler' ) ); |
|
123 | + $this->sort_by[] = 'claim_id'; |
|
124 | + } |
|
125 | + |
|
126 | + $this->row_actions = array( |
|
127 | + 'hook' => array( |
|
128 | + 'run' => array( |
|
129 | + 'name' => __( 'Run', 'action-scheduler' ), |
|
130 | + 'desc' => __( 'Process the action now as if it were run as part of a queue', 'action-scheduler' ), |
|
131 | + ), |
|
132 | + 'cancel' => array( |
|
133 | + 'name' => __( 'Cancel', 'action-scheduler' ), |
|
134 | + 'desc' => __( 'Cancel the action now to avoid it being run in future', 'action-scheduler' ), |
|
135 | + 'class' => 'cancel trash', |
|
136 | + ), |
|
137 | + ), |
|
138 | + ); |
|
139 | + |
|
140 | + self::$time_periods = array( |
|
141 | + array( |
|
142 | + 'seconds' => YEAR_IN_SECONDS, |
|
143 | + /* translators: %s: amount of time */ |
|
144 | + 'names' => _n_noop( '%s year', '%s years', 'action-scheduler' ), |
|
145 | + ), |
|
146 | + array( |
|
147 | + 'seconds' => MONTH_IN_SECONDS, |
|
148 | + /* translators: %s: amount of time */ |
|
149 | + 'names' => _n_noop( '%s month', '%s months', 'action-scheduler' ), |
|
150 | + ), |
|
151 | + array( |
|
152 | + 'seconds' => WEEK_IN_SECONDS, |
|
153 | + /* translators: %s: amount of time */ |
|
154 | + 'names' => _n_noop( '%s week', '%s weeks', 'action-scheduler' ), |
|
155 | + ), |
|
156 | + array( |
|
157 | + 'seconds' => DAY_IN_SECONDS, |
|
158 | + /* translators: %s: amount of time */ |
|
159 | + 'names' => _n_noop( '%s day', '%s days', 'action-scheduler' ), |
|
160 | + ), |
|
161 | + array( |
|
162 | + 'seconds' => HOUR_IN_SECONDS, |
|
163 | + /* translators: %s: amount of time */ |
|
164 | + 'names' => _n_noop( '%s hour', '%s hours', 'action-scheduler' ), |
|
165 | + ), |
|
166 | + array( |
|
167 | + 'seconds' => MINUTE_IN_SECONDS, |
|
168 | + /* translators: %s: amount of time */ |
|
169 | + 'names' => _n_noop( '%s minute', '%s minutes', 'action-scheduler' ), |
|
170 | + ), |
|
171 | + array( |
|
172 | + 'seconds' => 1, |
|
173 | + /* translators: %s: amount of time */ |
|
174 | + 'names' => _n_noop( '%s second', '%s seconds', 'action-scheduler' ), |
|
175 | + ), |
|
176 | + ); |
|
177 | + |
|
178 | + parent::__construct( array( |
|
179 | + 'singular' => 'action-scheduler', |
|
180 | + 'plural' => 'action-scheduler', |
|
181 | + 'ajax' => false, |
|
182 | + ) ); |
|
183 | + } |
|
184 | + |
|
185 | + /** |
|
186 | + * Convert an interval of seconds into a two part human friendly string. |
|
187 | + * |
|
188 | + * The WordPress human_time_diff() function only calculates the time difference to one degree, meaning |
|
189 | + * even if an action is 1 day and 11 hours away, it will display "1 day". This function goes one step |
|
190 | + * further to display two degrees of accuracy. |
|
191 | + * |
|
192 | + * Inspired by the Crontrol::interval() function by Edward Dale: https://wordpress.org/plugins/wp-crontrol/ |
|
193 | + * |
|
194 | + * @param int $interval A interval in seconds. |
|
195 | + * @param int $periods_to_include Depth of time periods to include, e.g. for an interval of 70, and $periods_to_include of 2, both minutes and seconds would be included. With a value of 1, only minutes would be included. |
|
196 | + * @return string A human friendly string representation of the interval. |
|
197 | + */ |
|
198 | + private static function human_interval( $interval, $periods_to_include = 2 ) { |
|
199 | + |
|
200 | + if ( $interval <= 0 ) { |
|
201 | + return __( 'Now!', 'action-scheduler' ); |
|
202 | + } |
|
203 | + |
|
204 | + $output = ''; |
|
205 | + |
|
206 | + for ( $time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count( self::$time_periods ) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++ ) { |
|
207 | + |
|
208 | + $periods_in_interval = floor( $seconds_remaining / self::$time_periods[ $time_period_index ]['seconds'] ); |
|
209 | + |
|
210 | + if ( $periods_in_interval > 0 ) { |
|
211 | + if ( ! empty( $output ) ) { |
|
212 | + $output .= ' '; |
|
213 | + } |
|
214 | + $output .= sprintf( _n( self::$time_periods[ $time_period_index ]['names'][0], self::$time_periods[ $time_period_index ]['names'][1], $periods_in_interval, 'action-scheduler' ), $periods_in_interval ); |
|
215 | + $seconds_remaining -= $periods_in_interval * self::$time_periods[ $time_period_index ]['seconds']; |
|
216 | + $periods_included++; |
|
217 | + } |
|
218 | + } |
|
219 | + |
|
220 | + return $output; |
|
221 | + } |
|
222 | + |
|
223 | + /** |
|
224 | + * Returns the recurrence of an action or 'Non-repeating'. The output is human readable. |
|
225 | + * |
|
226 | + * @param ActionScheduler_Action $action |
|
227 | + * |
|
228 | + * @return string |
|
229 | + */ |
|
230 | + protected function get_recurrence( $action ) { |
|
231 | + $schedule = $action->get_schedule(); |
|
232 | + if ( $schedule->is_recurring() ) { |
|
233 | + $recurrence = $schedule->get_recurrence(); |
|
234 | + |
|
235 | + if ( is_numeric( $recurrence ) ) { |
|
236 | + /* translators: %s: time interval */ |
|
237 | + return sprintf( __( 'Every %s', 'action-scheduler' ), self::human_interval( $recurrence ) ); |
|
238 | + } else { |
|
239 | + return $recurrence; |
|
240 | + } |
|
241 | + } |
|
242 | + |
|
243 | + return __( 'Non-repeating', 'action-scheduler' ); |
|
244 | + } |
|
245 | + |
|
246 | + /** |
|
247 | + * Serializes the argument of an action to render it in a human friendly format. |
|
248 | + * |
|
249 | + * @param array $row The array representation of the current row of the table |
|
250 | + * |
|
251 | + * @return string |
|
252 | + */ |
|
253 | + public function column_args( array $row ) { |
|
254 | + if ( empty( $row['args'] ) ) { |
|
255 | + return apply_filters( 'action_scheduler_list_table_column_args', '', $row ); |
|
256 | + } |
|
257 | + |
|
258 | + $row_html = '<ul>'; |
|
259 | + foreach ( $row['args'] as $key => $value ) { |
|
260 | + $row_html .= sprintf( '<li><code>%s => %s</code></li>', esc_html( var_export( $key, true ) ), esc_html( var_export( $value, true ) ) ); |
|
261 | + } |
|
262 | + $row_html .= '</ul>'; |
|
263 | + |
|
264 | + return apply_filters( 'action_scheduler_list_table_column_args', $row_html, $row ); |
|
265 | + } |
|
266 | + |
|
267 | + /** |
|
268 | + * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. |
|
269 | + * |
|
270 | + * @param array $row Action array. |
|
271 | + * @return string |
|
272 | + */ |
|
273 | + public function column_log_entries( array $row ) { |
|
274 | + |
|
275 | + $log_entries_html = '<ol>'; |
|
276 | + |
|
277 | + $timezone = new DateTimezone( 'UTC' ); |
|
278 | + |
|
279 | + foreach ( $row['log_entries'] as $log_entry ) { |
|
280 | + $log_entries_html .= $this->get_log_entry_html( $log_entry, $timezone ); |
|
281 | + } |
|
282 | + |
|
283 | + $log_entries_html .= '</ol>'; |
|
284 | + |
|
285 | + return $log_entries_html; |
|
286 | + } |
|
287 | + |
|
288 | + /** |
|
289 | + * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. |
|
290 | + * |
|
291 | + * @param ActionScheduler_LogEntry $log_entry |
|
292 | + * @param DateTimezone $timezone |
|
293 | + * @return string |
|
294 | + */ |
|
295 | + protected function get_log_entry_html( ActionScheduler_LogEntry $log_entry, DateTimezone $timezone ) { |
|
296 | + $date = $log_entry->get_date(); |
|
297 | + $date->setTimezone( $timezone ); |
|
298 | + return sprintf( '<li><strong>%s</strong><br/>%s</li>', esc_html( $date->format( 'Y-m-d H:i:s O' ) ), esc_html( $log_entry->get_message() ) ); |
|
299 | + } |
|
300 | + |
|
301 | + /** |
|
302 | + * Only display row actions for pending actions. |
|
303 | + * |
|
304 | + * @param array $row Row to render |
|
305 | + * @param string $column_name Current row |
|
306 | + * |
|
307 | + * @return string |
|
308 | + */ |
|
309 | + protected function maybe_render_actions( $row, $column_name ) { |
|
310 | + if ( 'pending' === strtolower( $row['status'] ) ) { |
|
311 | + return parent::maybe_render_actions( $row, $column_name ); |
|
312 | + } |
|
313 | + |
|
314 | + return ''; |
|
315 | + } |
|
316 | + |
|
317 | + /** |
|
318 | + * Renders admin notifications |
|
319 | + * |
|
320 | + * Notifications: |
|
321 | + * 1. When the maximum number of tasks are being executed simultaneously. |
|
322 | + * 2. Notifications when a task is manually executed. |
|
323 | + * 3. Tables are missing. |
|
324 | + */ |
|
325 | + public function display_admin_notices() { |
|
326 | + global $wpdb; |
|
327 | + |
|
328 | + if ( ( is_a( $this->store, 'ActionScheduler_HybridStore' ) || is_a( $this->store, 'ActionScheduler_DBStore' ) ) && apply_filters( 'action_scheduler_enable_recreate_data_store', true ) ) { |
|
329 | + $table_list = array( |
|
330 | + 'actionscheduler_actions', |
|
331 | + 'actionscheduler_logs', |
|
332 | + 'actionscheduler_groups', |
|
333 | + 'actionscheduler_claims', |
|
334 | + ); |
|
335 | + |
|
336 | + $found_tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared |
|
337 | + foreach ( $table_list as $table_name ) { |
|
338 | + if ( ! in_array( $wpdb->prefix . $table_name, $found_tables ) ) { |
|
339 | + $this->admin_notices[] = array( |
|
340 | + 'class' => 'error', |
|
341 | + 'message' => __( 'It appears one or more database tables were missing. Attempting to re-create the missing table(s).' , 'action-scheduler' ), |
|
342 | + ); |
|
343 | + $this->recreate_tables(); |
|
344 | + parent::display_admin_notices(); |
|
345 | + |
|
346 | + return; |
|
347 | + } |
|
348 | + } |
|
349 | + } |
|
350 | + |
|
351 | + if ( $this->runner->has_maximum_concurrent_batches() ) { |
|
352 | + $claim_count = $this->store->get_claim_count(); |
|
353 | + $this->admin_notices[] = array( |
|
354 | + 'class' => 'updated', |
|
355 | + 'message' => sprintf( |
|
356 | + /* translators: %s: amount of claims */ |
|
357 | + _n( |
|
358 | + 'Maximum simultaneous queues already in progress (%s queue). No additional queues will begin processing until the current queues are complete.', |
|
359 | + 'Maximum simultaneous queues already in progress (%s queues). No additional queues will begin processing until the current queues are complete.', |
|
360 | + $claim_count, |
|
361 | + 'action-scheduler' |
|
362 | + ), |
|
363 | + $claim_count |
|
364 | + ), |
|
365 | + ); |
|
366 | + } elseif ( $this->store->has_pending_actions_due() ) { |
|
367 | + |
|
368 | + $async_request_lock_expiration = ActionScheduler::lock()->get_expiration( 'async-request-runner' ); |
|
369 | + |
|
370 | + // No lock set or lock expired |
|
371 | + if ( false === $async_request_lock_expiration || $async_request_lock_expiration < time() ) { |
|
372 | + $in_progress_url = add_query_arg( 'status', 'in-progress', remove_query_arg( 'status' ) ); |
|
373 | + /* translators: %s: process URL */ |
|
374 | + $async_request_message = sprintf( __( 'A new queue has begun processing. <a href="%s">View actions in-progress »</a>', 'action-scheduler' ), esc_url( $in_progress_url ) ); |
|
375 | + } else { |
|
376 | + /* translators: %d: seconds */ |
|
377 | + $async_request_message = sprintf( __( 'The next queue will begin processing in approximately %d seconds.', 'action-scheduler' ), $async_request_lock_expiration - time() ); |
|
378 | + } |
|
379 | + |
|
380 | + $this->admin_notices[] = array( |
|
381 | + 'class' => 'notice notice-info', |
|
382 | + 'message' => $async_request_message, |
|
383 | + ); |
|
384 | + } |
|
385 | + |
|
386 | + $notification = get_transient( 'action_scheduler_admin_notice' ); |
|
387 | + |
|
388 | + if ( is_array( $notification ) ) { |
|
389 | + delete_transient( 'action_scheduler_admin_notice' ); |
|
390 | + |
|
391 | + $action = $this->store->fetch_action( $notification['action_id'] ); |
|
392 | + $action_hook_html = '<strong><code>' . $action->get_hook() . '</code></strong>'; |
|
393 | + if ( 1 == $notification['success'] ) { |
|
394 | + $class = 'updated'; |
|
395 | + switch ( $notification['row_action_type'] ) { |
|
396 | + case 'run' : |
|
397 | + /* translators: %s: action HTML */ |
|
398 | + $action_message_html = sprintf( __( 'Successfully executed action: %s', 'action-scheduler' ), $action_hook_html ); |
|
399 | + break; |
|
400 | + case 'cancel' : |
|
401 | + /* translators: %s: action HTML */ |
|
402 | + $action_message_html = sprintf( __( 'Successfully canceled action: %s', 'action-scheduler' ), $action_hook_html ); |
|
403 | + break; |
|
404 | + default : |
|
405 | + /* translators: %s: action HTML */ |
|
406 | + $action_message_html = sprintf( __( 'Successfully processed change for action: %s', 'action-scheduler' ), $action_hook_html ); |
|
407 | + break; |
|
408 | + } |
|
409 | + } else { |
|
410 | + $class = 'error'; |
|
411 | + /* translators: 1: action HTML 2: action ID 3: error message */ |
|
412 | + $action_message_html = sprintf( __( 'Could not process change for action: "%1$s" (ID: %2$d). Error: %3$s', 'action-scheduler' ), $action_hook_html, esc_html( $notification['action_id'] ), esc_html( $notification['error_message'] ) ); |
|
413 | + } |
|
414 | + |
|
415 | + $action_message_html = apply_filters( 'action_scheduler_admin_notice_html', $action_message_html, $action, $notification ); |
|
416 | + |
|
417 | + $this->admin_notices[] = array( |
|
418 | + 'class' => $class, |
|
419 | + 'message' => $action_message_html, |
|
420 | + ); |
|
421 | + } |
|
422 | + |
|
423 | + parent::display_admin_notices(); |
|
424 | + } |
|
425 | + |
|
426 | + /** |
|
427 | + * Prints the scheduled date in a human friendly format. |
|
428 | + * |
|
429 | + * @param array $row The array representation of the current row of the table |
|
430 | + * |
|
431 | + * @return string |
|
432 | + */ |
|
433 | + public function column_schedule( $row ) { |
|
434 | + return $this->get_schedule_display_string( $row['schedule'] ); |
|
435 | + } |
|
436 | + |
|
437 | + /** |
|
438 | + * Get the scheduled date in a human friendly format. |
|
439 | + * |
|
440 | + * @param ActionScheduler_Schedule $schedule |
|
441 | + * @return string |
|
442 | + */ |
|
443 | + protected function get_schedule_display_string( ActionScheduler_Schedule $schedule ) { |
|
444 | + |
|
445 | + $schedule_display_string = ''; |
|
446 | + |
|
447 | + if ( ! $schedule->get_date() ) { |
|
448 | + return '0000-00-00 00:00:00'; |
|
449 | + } |
|
450 | + |
|
451 | + $next_timestamp = $schedule->get_date()->getTimestamp(); |
|
452 | + |
|
453 | + $schedule_display_string .= $schedule->get_date()->format( 'Y-m-d H:i:s O' ); |
|
454 | + $schedule_display_string .= '<br/>'; |
|
455 | + |
|
456 | + if ( gmdate( 'U' ) > $next_timestamp ) { |
|
457 | + /* translators: %s: date interval */ |
|
458 | + $schedule_display_string .= sprintf( __( ' (%s ago)', 'action-scheduler' ), self::human_interval( gmdate( 'U' ) - $next_timestamp ) ); |
|
459 | + } else { |
|
460 | + /* translators: %s: date interval */ |
|
461 | + $schedule_display_string .= sprintf( __( ' (%s)', 'action-scheduler' ), self::human_interval( $next_timestamp - gmdate( 'U' ) ) ); |
|
462 | + } |
|
463 | + |
|
464 | + return $schedule_display_string; |
|
465 | + } |
|
466 | + |
|
467 | + /** |
|
468 | + * Bulk delete |
|
469 | + * |
|
470 | + * Deletes actions based on their ID. This is the handler for the bulk delete. It assumes the data |
|
471 | + * properly validated by the callee and it will delete the actions without any extra validation. |
|
472 | + * |
|
473 | + * @param array $ids |
|
474 | + * @param string $ids_sql Inherited and unused |
|
475 | + */ |
|
476 | + protected function bulk_delete( array $ids, $ids_sql ) { |
|
477 | + foreach ( $ids as $id ) { |
|
478 | + $this->store->delete_action( $id ); |
|
479 | + } |
|
480 | + } |
|
481 | + |
|
482 | + /** |
|
483 | + * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their |
|
484 | + * parameters are valid. |
|
485 | + * |
|
486 | + * @param int $action_id |
|
487 | + */ |
|
488 | + protected function row_action_cancel( $action_id ) { |
|
489 | + $this->process_row_action( $action_id, 'cancel' ); |
|
490 | + } |
|
491 | + |
|
492 | + /** |
|
493 | + * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their |
|
494 | + * parameters are valid. |
|
495 | + * |
|
496 | + * @param int $action_id |
|
497 | + */ |
|
498 | + protected function row_action_run( $action_id ) { |
|
499 | + $this->process_row_action( $action_id, 'run' ); |
|
500 | + } |
|
501 | + |
|
502 | + /** |
|
503 | + * Force the data store schema updates. |
|
504 | + */ |
|
505 | + protected function recreate_tables() { |
|
506 | + if ( is_a( $this->store, 'ActionScheduler_HybridStore' ) ) { |
|
507 | + $store = $this->store; |
|
508 | + } else { |
|
509 | + $store = new ActionScheduler_HybridStore(); |
|
510 | + } |
|
511 | + add_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10, 2 ); |
|
512 | + |
|
513 | + $store_schema = new ActionScheduler_StoreSchema(); |
|
514 | + $logger_schema = new ActionScheduler_LoggerSchema(); |
|
515 | + $store_schema->register_tables( true ); |
|
516 | + $logger_schema->register_tables( true ); |
|
517 | + |
|
518 | + remove_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10 ); |
|
519 | + } |
|
520 | + /** |
|
521 | + * Implements the logic behind processing an action once an action link is clicked on the list table. |
|
522 | + * |
|
523 | + * @param int $action_id |
|
524 | + * @param string $row_action_type The type of action to perform on the action. |
|
525 | + */ |
|
526 | + protected function process_row_action( $action_id, $row_action_type ) { |
|
527 | + try { |
|
528 | + switch ( $row_action_type ) { |
|
529 | + case 'run' : |
|
530 | + $this->runner->process_action( $action_id, 'Admin List Table' ); |
|
531 | + break; |
|
532 | + case 'cancel' : |
|
533 | + $this->store->cancel_action( $action_id ); |
|
534 | + break; |
|
535 | + } |
|
536 | + $success = 1; |
|
537 | + $error_message = ''; |
|
538 | + } catch ( Exception $e ) { |
|
539 | + $success = 0; |
|
540 | + $error_message = $e->getMessage(); |
|
541 | + } |
|
542 | + |
|
543 | + set_transient( 'action_scheduler_admin_notice', compact( 'action_id', 'success', 'error_message', 'row_action_type' ), 30 ); |
|
544 | + } |
|
545 | + |
|
546 | + /** |
|
547 | + * {@inheritDoc} |
|
548 | + */ |
|
549 | + public function prepare_items() { |
|
550 | + $this->prepare_column_headers(); |
|
551 | + |
|
552 | + $per_page = $this->get_items_per_page( $this->package . '_items_per_page', $this->items_per_page ); |
|
553 | + $query = array( |
|
554 | + 'per_page' => $per_page, |
|
555 | + 'offset' => $this->get_items_offset(), |
|
556 | + 'status' => $this->get_request_status(), |
|
557 | + 'orderby' => $this->get_request_orderby(), |
|
558 | + 'order' => $this->get_request_order(), |
|
559 | + 'search' => $this->get_request_search_query(), |
|
560 | + ); |
|
561 | + |
|
562 | + $this->items = array(); |
|
563 | + |
|
564 | + $total_items = $this->store->query_actions( $query, 'count' ); |
|
565 | + |
|
566 | + $status_labels = $this->store->get_status_labels(); |
|
567 | + |
|
568 | + foreach ( $this->store->query_actions( $query ) as $action_id ) { |
|
569 | + try { |
|
570 | + $action = $this->store->fetch_action( $action_id ); |
|
571 | + } catch ( Exception $e ) { |
|
572 | + continue; |
|
573 | + } |
|
574 | + if ( is_a( $action, 'ActionScheduler_NullAction' ) ) { |
|
575 | + continue; |
|
576 | + } |
|
577 | + $this->items[ $action_id ] = array( |
|
578 | + 'ID' => $action_id, |
|
579 | + 'hook' => $action->get_hook(), |
|
580 | + 'status' => $status_labels[ $this->store->get_status( $action_id ) ], |
|
581 | + 'args' => $action->get_args(), |
|
582 | + 'group' => $action->get_group(), |
|
583 | + 'log_entries' => $this->logger->get_logs( $action_id ), |
|
584 | + 'claim_id' => $this->store->get_claim_id( $action_id ), |
|
585 | + 'recurrence' => $this->get_recurrence( $action ), |
|
586 | + 'schedule' => $action->get_schedule(), |
|
587 | + ); |
|
588 | + } |
|
589 | + |
|
590 | + $this->set_pagination_args( array( |
|
591 | + 'total_items' => $total_items, |
|
592 | + 'per_page' => $per_page, |
|
593 | + 'total_pages' => ceil( $total_items / $per_page ), |
|
594 | + ) ); |
|
595 | + } |
|
596 | + |
|
597 | + /** |
|
598 | + * Prints the available statuses so the user can click to filter. |
|
599 | + */ |
|
600 | + protected function display_filter_by_status() { |
|
601 | + $this->status_counts = $this->store->action_counts(); |
|
602 | + parent::display_filter_by_status(); |
|
603 | + } |
|
604 | + |
|
605 | + /** |
|
606 | + * Get the text to display in the search box on the list table. |
|
607 | + */ |
|
608 | + protected function get_search_box_button_text() { |
|
609 | + return __( 'Search hook, args and claim ID', 'action-scheduler' ); |
|
610 | + } |
|
611 | 611 | } |
@@ -80,26 +80,26 @@ discard block |
||
80 | 80 | * @param ActionScheduler_Logger $logger |
81 | 81 | * @param ActionScheduler_QueueRunner $runner |
82 | 82 | */ |
83 | - public function __construct( ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner ) { |
|
83 | + public function __construct(ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner) { |
|
84 | 84 | |
85 | 85 | $this->store = $store; |
86 | 86 | $this->logger = $logger; |
87 | 87 | $this->runner = $runner; |
88 | 88 | |
89 | - $this->table_header = __( 'Scheduled Actions', 'action-scheduler' ); |
|
89 | + $this->table_header = __('Scheduled Actions', 'action-scheduler'); |
|
90 | 90 | |
91 | 91 | $this->bulk_actions = array( |
92 | - 'delete' => __( 'Delete', 'action-scheduler' ), |
|
92 | + 'delete' => __('Delete', 'action-scheduler'), |
|
93 | 93 | ); |
94 | 94 | |
95 | 95 | $this->columns = array( |
96 | - 'hook' => __( 'Hook', 'action-scheduler' ), |
|
97 | - 'status' => __( 'Status', 'action-scheduler' ), |
|
98 | - 'args' => __( 'Arguments', 'action-scheduler' ), |
|
99 | - 'group' => __( 'Group', 'action-scheduler' ), |
|
100 | - 'recurrence' => __( 'Recurrence', 'action-scheduler' ), |
|
101 | - 'schedule' => __( 'Scheduled Date', 'action-scheduler' ), |
|
102 | - 'log_entries' => __( 'Log', 'action-scheduler' ), |
|
96 | + 'hook' => __('Hook', 'action-scheduler'), |
|
97 | + 'status' => __('Status', 'action-scheduler'), |
|
98 | + 'args' => __('Arguments', 'action-scheduler'), |
|
99 | + 'group' => __('Group', 'action-scheduler'), |
|
100 | + 'recurrence' => __('Recurrence', 'action-scheduler'), |
|
101 | + 'schedule' => __('Scheduled Date', 'action-scheduler'), |
|
102 | + 'log_entries' => __('Log', 'action-scheduler'), |
|
103 | 103 | ); |
104 | 104 | |
105 | 105 | $this->sort_by = array( |
@@ -116,22 +116,22 @@ discard block |
||
116 | 116 | |
117 | 117 | $request_status = $this->get_request_status(); |
118 | 118 | |
119 | - if ( empty( $request_status ) ) { |
|
119 | + if (empty($request_status)) { |
|
120 | 120 | $this->sort_by[] = 'status'; |
121 | - } elseif ( in_array( $request_status, array( 'in-progress', 'failed' ) ) ) { |
|
122 | - $this->columns += array( 'claim_id' => __( 'Claim ID', 'action-scheduler' ) ); |
|
121 | + } elseif (in_array($request_status, array('in-progress', 'failed'))) { |
|
122 | + $this->columns += array('claim_id' => __('Claim ID', 'action-scheduler')); |
|
123 | 123 | $this->sort_by[] = 'claim_id'; |
124 | 124 | } |
125 | 125 | |
126 | 126 | $this->row_actions = array( |
127 | 127 | 'hook' => array( |
128 | 128 | 'run' => array( |
129 | - 'name' => __( 'Run', 'action-scheduler' ), |
|
130 | - 'desc' => __( 'Process the action now as if it were run as part of a queue', 'action-scheduler' ), |
|
129 | + 'name' => __('Run', 'action-scheduler'), |
|
130 | + 'desc' => __('Process the action now as if it were run as part of a queue', 'action-scheduler'), |
|
131 | 131 | ), |
132 | 132 | 'cancel' => array( |
133 | - 'name' => __( 'Cancel', 'action-scheduler' ), |
|
134 | - 'desc' => __( 'Cancel the action now to avoid it being run in future', 'action-scheduler' ), |
|
133 | + 'name' => __('Cancel', 'action-scheduler'), |
|
134 | + 'desc' => __('Cancel the action now to avoid it being run in future', 'action-scheduler'), |
|
135 | 135 | 'class' => 'cancel trash', |
136 | 136 | ), |
137 | 137 | ), |
@@ -141,45 +141,45 @@ discard block |
||
141 | 141 | array( |
142 | 142 | 'seconds' => YEAR_IN_SECONDS, |
143 | 143 | /* translators: %s: amount of time */ |
144 | - 'names' => _n_noop( '%s year', '%s years', 'action-scheduler' ), |
|
144 | + 'names' => _n_noop('%s year', '%s years', 'action-scheduler'), |
|
145 | 145 | ), |
146 | 146 | array( |
147 | 147 | 'seconds' => MONTH_IN_SECONDS, |
148 | 148 | /* translators: %s: amount of time */ |
149 | - 'names' => _n_noop( '%s month', '%s months', 'action-scheduler' ), |
|
149 | + 'names' => _n_noop('%s month', '%s months', 'action-scheduler'), |
|
150 | 150 | ), |
151 | 151 | array( |
152 | 152 | 'seconds' => WEEK_IN_SECONDS, |
153 | 153 | /* translators: %s: amount of time */ |
154 | - 'names' => _n_noop( '%s week', '%s weeks', 'action-scheduler' ), |
|
154 | + 'names' => _n_noop('%s week', '%s weeks', 'action-scheduler'), |
|
155 | 155 | ), |
156 | 156 | array( |
157 | 157 | 'seconds' => DAY_IN_SECONDS, |
158 | 158 | /* translators: %s: amount of time */ |
159 | - 'names' => _n_noop( '%s day', '%s days', 'action-scheduler' ), |
|
159 | + 'names' => _n_noop('%s day', '%s days', 'action-scheduler'), |
|
160 | 160 | ), |
161 | 161 | array( |
162 | 162 | 'seconds' => HOUR_IN_SECONDS, |
163 | 163 | /* translators: %s: amount of time */ |
164 | - 'names' => _n_noop( '%s hour', '%s hours', 'action-scheduler' ), |
|
164 | + 'names' => _n_noop('%s hour', '%s hours', 'action-scheduler'), |
|
165 | 165 | ), |
166 | 166 | array( |
167 | 167 | 'seconds' => MINUTE_IN_SECONDS, |
168 | 168 | /* translators: %s: amount of time */ |
169 | - 'names' => _n_noop( '%s minute', '%s minutes', 'action-scheduler' ), |
|
169 | + 'names' => _n_noop('%s minute', '%s minutes', 'action-scheduler'), |
|
170 | 170 | ), |
171 | 171 | array( |
172 | 172 | 'seconds' => 1, |
173 | 173 | /* translators: %s: amount of time */ |
174 | - 'names' => _n_noop( '%s second', '%s seconds', 'action-scheduler' ), |
|
174 | + 'names' => _n_noop('%s second', '%s seconds', 'action-scheduler'), |
|
175 | 175 | ), |
176 | 176 | ); |
177 | 177 | |
178 | - parent::__construct( array( |
|
178 | + parent::__construct(array( |
|
179 | 179 | 'singular' => 'action-scheduler', |
180 | 180 | 'plural' => 'action-scheduler', |
181 | 181 | 'ajax' => false, |
182 | - ) ); |
|
182 | + )); |
|
183 | 183 | } |
184 | 184 | |
185 | 185 | /** |
@@ -195,24 +195,24 @@ discard block |
||
195 | 195 | * @param int $periods_to_include Depth of time periods to include, e.g. for an interval of 70, and $periods_to_include of 2, both minutes and seconds would be included. With a value of 1, only minutes would be included. |
196 | 196 | * @return string A human friendly string representation of the interval. |
197 | 197 | */ |
198 | - private static function human_interval( $interval, $periods_to_include = 2 ) { |
|
198 | + private static function human_interval($interval, $periods_to_include = 2) { |
|
199 | 199 | |
200 | - if ( $interval <= 0 ) { |
|
201 | - return __( 'Now!', 'action-scheduler' ); |
|
200 | + if ($interval <= 0) { |
|
201 | + return __('Now!', 'action-scheduler'); |
|
202 | 202 | } |
203 | 203 | |
204 | 204 | $output = ''; |
205 | 205 | |
206 | - for ( $time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count( self::$time_periods ) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++ ) { |
|
206 | + for ($time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count(self::$time_periods) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++) { |
|
207 | 207 | |
208 | - $periods_in_interval = floor( $seconds_remaining / self::$time_periods[ $time_period_index ]['seconds'] ); |
|
208 | + $periods_in_interval = floor($seconds_remaining / self::$time_periods[$time_period_index]['seconds']); |
|
209 | 209 | |
210 | - if ( $periods_in_interval > 0 ) { |
|
211 | - if ( ! empty( $output ) ) { |
|
210 | + if ($periods_in_interval > 0) { |
|
211 | + if (!empty($output)) { |
|
212 | 212 | $output .= ' '; |
213 | 213 | } |
214 | - $output .= sprintf( _n( self::$time_periods[ $time_period_index ]['names'][0], self::$time_periods[ $time_period_index ]['names'][1], $periods_in_interval, 'action-scheduler' ), $periods_in_interval ); |
|
215 | - $seconds_remaining -= $periods_in_interval * self::$time_periods[ $time_period_index ]['seconds']; |
|
214 | + $output .= sprintf(_n(self::$time_periods[$time_period_index]['names'][0], self::$time_periods[$time_period_index]['names'][1], $periods_in_interval, 'action-scheduler'), $periods_in_interval); |
|
215 | + $seconds_remaining -= $periods_in_interval * self::$time_periods[$time_period_index]['seconds']; |
|
216 | 216 | $periods_included++; |
217 | 217 | } |
218 | 218 | } |
@@ -227,20 +227,20 @@ discard block |
||
227 | 227 | * |
228 | 228 | * @return string |
229 | 229 | */ |
230 | - protected function get_recurrence( $action ) { |
|
230 | + protected function get_recurrence($action) { |
|
231 | 231 | $schedule = $action->get_schedule(); |
232 | - if ( $schedule->is_recurring() ) { |
|
232 | + if ($schedule->is_recurring()) { |
|
233 | 233 | $recurrence = $schedule->get_recurrence(); |
234 | 234 | |
235 | - if ( is_numeric( $recurrence ) ) { |
|
235 | + if (is_numeric($recurrence)) { |
|
236 | 236 | /* translators: %s: time interval */ |
237 | - return sprintf( __( 'Every %s', 'action-scheduler' ), self::human_interval( $recurrence ) ); |
|
237 | + return sprintf(__('Every %s', 'action-scheduler'), self::human_interval($recurrence)); |
|
238 | 238 | } else { |
239 | 239 | return $recurrence; |
240 | 240 | } |
241 | 241 | } |
242 | 242 | |
243 | - return __( 'Non-repeating', 'action-scheduler' ); |
|
243 | + return __('Non-repeating', 'action-scheduler'); |
|
244 | 244 | } |
245 | 245 | |
246 | 246 | /** |
@@ -250,18 +250,18 @@ discard block |
||
250 | 250 | * |
251 | 251 | * @return string |
252 | 252 | */ |
253 | - public function column_args( array $row ) { |
|
254 | - if ( empty( $row['args'] ) ) { |
|
255 | - return apply_filters( 'action_scheduler_list_table_column_args', '', $row ); |
|
253 | + public function column_args(array $row) { |
|
254 | + if (empty($row['args'])) { |
|
255 | + return apply_filters('action_scheduler_list_table_column_args', '', $row); |
|
256 | 256 | } |
257 | 257 | |
258 | 258 | $row_html = '<ul>'; |
259 | - foreach ( $row['args'] as $key => $value ) { |
|
260 | - $row_html .= sprintf( '<li><code>%s => %s</code></li>', esc_html( var_export( $key, true ) ), esc_html( var_export( $value, true ) ) ); |
|
259 | + foreach ($row['args'] as $key => $value) { |
|
260 | + $row_html .= sprintf('<li><code>%s => %s</code></li>', esc_html(var_export($key, true)), esc_html(var_export($value, true))); |
|
261 | 261 | } |
262 | 262 | $row_html .= '</ul>'; |
263 | 263 | |
264 | - return apply_filters( 'action_scheduler_list_table_column_args', $row_html, $row ); |
|
264 | + return apply_filters('action_scheduler_list_table_column_args', $row_html, $row); |
|
265 | 265 | } |
266 | 266 | |
267 | 267 | /** |
@@ -270,14 +270,14 @@ discard block |
||
270 | 270 | * @param array $row Action array. |
271 | 271 | * @return string |
272 | 272 | */ |
273 | - public function column_log_entries( array $row ) { |
|
273 | + public function column_log_entries(array $row) { |
|
274 | 274 | |
275 | 275 | $log_entries_html = '<ol>'; |
276 | 276 | |
277 | - $timezone = new DateTimezone( 'UTC' ); |
|
277 | + $timezone = new DateTimezone('UTC'); |
|
278 | 278 | |
279 | - foreach ( $row['log_entries'] as $log_entry ) { |
|
280 | - $log_entries_html .= $this->get_log_entry_html( $log_entry, $timezone ); |
|
279 | + foreach ($row['log_entries'] as $log_entry) { |
|
280 | + $log_entries_html .= $this->get_log_entry_html($log_entry, $timezone); |
|
281 | 281 | } |
282 | 282 | |
283 | 283 | $log_entries_html .= '</ol>'; |
@@ -292,10 +292,10 @@ discard block |
||
292 | 292 | * @param DateTimezone $timezone |
293 | 293 | * @return string |
294 | 294 | */ |
295 | - protected function get_log_entry_html( ActionScheduler_LogEntry $log_entry, DateTimezone $timezone ) { |
|
295 | + protected function get_log_entry_html(ActionScheduler_LogEntry $log_entry, DateTimezone $timezone) { |
|
296 | 296 | $date = $log_entry->get_date(); |
297 | - $date->setTimezone( $timezone ); |
|
298 | - return sprintf( '<li><strong>%s</strong><br/>%s</li>', esc_html( $date->format( 'Y-m-d H:i:s O' ) ), esc_html( $log_entry->get_message() ) ); |
|
297 | + $date->setTimezone($timezone); |
|
298 | + return sprintf('<li><strong>%s</strong><br/>%s</li>', esc_html($date->format('Y-m-d H:i:s O')), esc_html($log_entry->get_message())); |
|
299 | 299 | } |
300 | 300 | |
301 | 301 | /** |
@@ -306,9 +306,9 @@ discard block |
||
306 | 306 | * |
307 | 307 | * @return string |
308 | 308 | */ |
309 | - protected function maybe_render_actions( $row, $column_name ) { |
|
310 | - if ( 'pending' === strtolower( $row['status'] ) ) { |
|
311 | - return parent::maybe_render_actions( $row, $column_name ); |
|
309 | + protected function maybe_render_actions($row, $column_name) { |
|
310 | + if ('pending' === strtolower($row['status'])) { |
|
311 | + return parent::maybe_render_actions($row, $column_name); |
|
312 | 312 | } |
313 | 313 | |
314 | 314 | return ''; |
@@ -325,7 +325,7 @@ discard block |
||
325 | 325 | public function display_admin_notices() { |
326 | 326 | global $wpdb; |
327 | 327 | |
328 | - if ( ( is_a( $this->store, 'ActionScheduler_HybridStore' ) || is_a( $this->store, 'ActionScheduler_DBStore' ) ) && apply_filters( 'action_scheduler_enable_recreate_data_store', true ) ) { |
|
328 | + if ((is_a($this->store, 'ActionScheduler_HybridStore') || is_a($this->store, 'ActionScheduler_DBStore')) && apply_filters('action_scheduler_enable_recreate_data_store', true)) { |
|
329 | 329 | $table_list = array( |
330 | 330 | 'actionscheduler_actions', |
331 | 331 | 'actionscheduler_logs', |
@@ -333,12 +333,12 @@ discard block |
||
333 | 333 | 'actionscheduler_claims', |
334 | 334 | ); |
335 | 335 | |
336 | - $found_tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared |
|
337 | - foreach ( $table_list as $table_name ) { |
|
338 | - if ( ! in_array( $wpdb->prefix . $table_name, $found_tables ) ) { |
|
336 | + $found_tables = $wpdb->get_col("SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'"); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared |
|
337 | + foreach ($table_list as $table_name) { |
|
338 | + if (!in_array($wpdb->prefix . $table_name, $found_tables)) { |
|
339 | 339 | $this->admin_notices[] = array( |
340 | 340 | 'class' => 'error', |
341 | - 'message' => __( 'It appears one or more database tables were missing. Attempting to re-create the missing table(s).' , 'action-scheduler' ), |
|
341 | + 'message' => __('It appears one or more database tables were missing. Attempting to re-create the missing table(s).', 'action-scheduler'), |
|
342 | 342 | ); |
343 | 343 | $this->recreate_tables(); |
344 | 344 | parent::display_admin_notices(); |
@@ -348,7 +348,7 @@ discard block |
||
348 | 348 | } |
349 | 349 | } |
350 | 350 | |
351 | - if ( $this->runner->has_maximum_concurrent_batches() ) { |
|
351 | + if ($this->runner->has_maximum_concurrent_batches()) { |
|
352 | 352 | $claim_count = $this->store->get_claim_count(); |
353 | 353 | $this->admin_notices[] = array( |
354 | 354 | 'class' => 'updated', |
@@ -363,18 +363,18 @@ discard block |
||
363 | 363 | $claim_count |
364 | 364 | ), |
365 | 365 | ); |
366 | - } elseif ( $this->store->has_pending_actions_due() ) { |
|
366 | + } elseif ($this->store->has_pending_actions_due()) { |
|
367 | 367 | |
368 | - $async_request_lock_expiration = ActionScheduler::lock()->get_expiration( 'async-request-runner' ); |
|
368 | + $async_request_lock_expiration = ActionScheduler::lock()->get_expiration('async-request-runner'); |
|
369 | 369 | |
370 | 370 | // No lock set or lock expired |
371 | - if ( false === $async_request_lock_expiration || $async_request_lock_expiration < time() ) { |
|
372 | - $in_progress_url = add_query_arg( 'status', 'in-progress', remove_query_arg( 'status' ) ); |
|
371 | + if (false === $async_request_lock_expiration || $async_request_lock_expiration < time()) { |
|
372 | + $in_progress_url = add_query_arg('status', 'in-progress', remove_query_arg('status')); |
|
373 | 373 | /* translators: %s: process URL */ |
374 | - $async_request_message = sprintf( __( 'A new queue has begun processing. <a href="%s">View actions in-progress »</a>', 'action-scheduler' ), esc_url( $in_progress_url ) ); |
|
374 | + $async_request_message = sprintf(__('A new queue has begun processing. <a href="%s">View actions in-progress »</a>', 'action-scheduler'), esc_url($in_progress_url)); |
|
375 | 375 | } else { |
376 | 376 | /* translators: %d: seconds */ |
377 | - $async_request_message = sprintf( __( 'The next queue will begin processing in approximately %d seconds.', 'action-scheduler' ), $async_request_lock_expiration - time() ); |
|
377 | + $async_request_message = sprintf(__('The next queue will begin processing in approximately %d seconds.', 'action-scheduler'), $async_request_lock_expiration - time()); |
|
378 | 378 | } |
379 | 379 | |
380 | 380 | $this->admin_notices[] = array( |
@@ -383,36 +383,36 @@ discard block |
||
383 | 383 | ); |
384 | 384 | } |
385 | 385 | |
386 | - $notification = get_transient( 'action_scheduler_admin_notice' ); |
|
386 | + $notification = get_transient('action_scheduler_admin_notice'); |
|
387 | 387 | |
388 | - if ( is_array( $notification ) ) { |
|
389 | - delete_transient( 'action_scheduler_admin_notice' ); |
|
388 | + if (is_array($notification)) { |
|
389 | + delete_transient('action_scheduler_admin_notice'); |
|
390 | 390 | |
391 | - $action = $this->store->fetch_action( $notification['action_id'] ); |
|
391 | + $action = $this->store->fetch_action($notification['action_id']); |
|
392 | 392 | $action_hook_html = '<strong><code>' . $action->get_hook() . '</code></strong>'; |
393 | - if ( 1 == $notification['success'] ) { |
|
393 | + if (1 == $notification['success']) { |
|
394 | 394 | $class = 'updated'; |
395 | - switch ( $notification['row_action_type'] ) { |
|
395 | + switch ($notification['row_action_type']) { |
|
396 | 396 | case 'run' : |
397 | 397 | /* translators: %s: action HTML */ |
398 | - $action_message_html = sprintf( __( 'Successfully executed action: %s', 'action-scheduler' ), $action_hook_html ); |
|
398 | + $action_message_html = sprintf(__('Successfully executed action: %s', 'action-scheduler'), $action_hook_html); |
|
399 | 399 | break; |
400 | 400 | case 'cancel' : |
401 | 401 | /* translators: %s: action HTML */ |
402 | - $action_message_html = sprintf( __( 'Successfully canceled action: %s', 'action-scheduler' ), $action_hook_html ); |
|
402 | + $action_message_html = sprintf(__('Successfully canceled action: %s', 'action-scheduler'), $action_hook_html); |
|
403 | 403 | break; |
404 | 404 | default : |
405 | 405 | /* translators: %s: action HTML */ |
406 | - $action_message_html = sprintf( __( 'Successfully processed change for action: %s', 'action-scheduler' ), $action_hook_html ); |
|
406 | + $action_message_html = sprintf(__('Successfully processed change for action: %s', 'action-scheduler'), $action_hook_html); |
|
407 | 407 | break; |
408 | 408 | } |
409 | 409 | } else { |
410 | 410 | $class = 'error'; |
411 | 411 | /* translators: 1: action HTML 2: action ID 3: error message */ |
412 | - $action_message_html = sprintf( __( 'Could not process change for action: "%1$s" (ID: %2$d). Error: %3$s', 'action-scheduler' ), $action_hook_html, esc_html( $notification['action_id'] ), esc_html( $notification['error_message'] ) ); |
|
412 | + $action_message_html = sprintf(__('Could not process change for action: "%1$s" (ID: %2$d). Error: %3$s', 'action-scheduler'), $action_hook_html, esc_html($notification['action_id']), esc_html($notification['error_message'])); |
|
413 | 413 | } |
414 | 414 | |
415 | - $action_message_html = apply_filters( 'action_scheduler_admin_notice_html', $action_message_html, $action, $notification ); |
|
415 | + $action_message_html = apply_filters('action_scheduler_admin_notice_html', $action_message_html, $action, $notification); |
|
416 | 416 | |
417 | 417 | $this->admin_notices[] = array( |
418 | 418 | 'class' => $class, |
@@ -430,8 +430,8 @@ discard block |
||
430 | 430 | * |
431 | 431 | * @return string |
432 | 432 | */ |
433 | - public function column_schedule( $row ) { |
|
434 | - return $this->get_schedule_display_string( $row['schedule'] ); |
|
433 | + public function column_schedule($row) { |
|
434 | + return $this->get_schedule_display_string($row['schedule']); |
|
435 | 435 | } |
436 | 436 | |
437 | 437 | /** |
@@ -440,25 +440,25 @@ discard block |
||
440 | 440 | * @param ActionScheduler_Schedule $schedule |
441 | 441 | * @return string |
442 | 442 | */ |
443 | - protected function get_schedule_display_string( ActionScheduler_Schedule $schedule ) { |
|
443 | + protected function get_schedule_display_string(ActionScheduler_Schedule $schedule) { |
|
444 | 444 | |
445 | 445 | $schedule_display_string = ''; |
446 | 446 | |
447 | - if ( ! $schedule->get_date() ) { |
|
447 | + if (!$schedule->get_date()) { |
|
448 | 448 | return '0000-00-00 00:00:00'; |
449 | 449 | } |
450 | 450 | |
451 | 451 | $next_timestamp = $schedule->get_date()->getTimestamp(); |
452 | 452 | |
453 | - $schedule_display_string .= $schedule->get_date()->format( 'Y-m-d H:i:s O' ); |
|
453 | + $schedule_display_string .= $schedule->get_date()->format('Y-m-d H:i:s O'); |
|
454 | 454 | $schedule_display_string .= '<br/>'; |
455 | 455 | |
456 | - if ( gmdate( 'U' ) > $next_timestamp ) { |
|
456 | + if (gmdate('U') > $next_timestamp) { |
|
457 | 457 | /* translators: %s: date interval */ |
458 | - $schedule_display_string .= sprintf( __( ' (%s ago)', 'action-scheduler' ), self::human_interval( gmdate( 'U' ) - $next_timestamp ) ); |
|
458 | + $schedule_display_string .= sprintf(__(' (%s ago)', 'action-scheduler'), self::human_interval(gmdate('U') - $next_timestamp)); |
|
459 | 459 | } else { |
460 | 460 | /* translators: %s: date interval */ |
461 | - $schedule_display_string .= sprintf( __( ' (%s)', 'action-scheduler' ), self::human_interval( $next_timestamp - gmdate( 'U' ) ) ); |
|
461 | + $schedule_display_string .= sprintf(__(' (%s)', 'action-scheduler'), self::human_interval($next_timestamp - gmdate('U'))); |
|
462 | 462 | } |
463 | 463 | |
464 | 464 | return $schedule_display_string; |
@@ -473,9 +473,9 @@ discard block |
||
473 | 473 | * @param array $ids |
474 | 474 | * @param string $ids_sql Inherited and unused |
475 | 475 | */ |
476 | - protected function bulk_delete( array $ids, $ids_sql ) { |
|
477 | - foreach ( $ids as $id ) { |
|
478 | - $this->store->delete_action( $id ); |
|
476 | + protected function bulk_delete(array $ids, $ids_sql) { |
|
477 | + foreach ($ids as $id) { |
|
478 | + $this->store->delete_action($id); |
|
479 | 479 | } |
480 | 480 | } |
481 | 481 | |
@@ -485,8 +485,8 @@ discard block |
||
485 | 485 | * |
486 | 486 | * @param int $action_id |
487 | 487 | */ |
488 | - protected function row_action_cancel( $action_id ) { |
|
489 | - $this->process_row_action( $action_id, 'cancel' ); |
|
488 | + protected function row_action_cancel($action_id) { |
|
489 | + $this->process_row_action($action_id, 'cancel'); |
|
490 | 490 | } |
491 | 491 | |
492 | 492 | /** |
@@ -495,27 +495,27 @@ discard block |
||
495 | 495 | * |
496 | 496 | * @param int $action_id |
497 | 497 | */ |
498 | - protected function row_action_run( $action_id ) { |
|
499 | - $this->process_row_action( $action_id, 'run' ); |
|
498 | + protected function row_action_run($action_id) { |
|
499 | + $this->process_row_action($action_id, 'run'); |
|
500 | 500 | } |
501 | 501 | |
502 | 502 | /** |
503 | 503 | * Force the data store schema updates. |
504 | 504 | */ |
505 | 505 | protected function recreate_tables() { |
506 | - if ( is_a( $this->store, 'ActionScheduler_HybridStore' ) ) { |
|
506 | + if (is_a($this->store, 'ActionScheduler_HybridStore')) { |
|
507 | 507 | $store = $this->store; |
508 | 508 | } else { |
509 | 509 | $store = new ActionScheduler_HybridStore(); |
510 | 510 | } |
511 | - add_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10, 2 ); |
|
511 | + add_action('action_scheduler/created_table', array($store, 'set_autoincrement'), 10, 2); |
|
512 | 512 | |
513 | 513 | $store_schema = new ActionScheduler_StoreSchema(); |
514 | 514 | $logger_schema = new ActionScheduler_LoggerSchema(); |
515 | - $store_schema->register_tables( true ); |
|
516 | - $logger_schema->register_tables( true ); |
|
515 | + $store_schema->register_tables(true); |
|
516 | + $logger_schema->register_tables(true); |
|
517 | 517 | |
518 | - remove_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10 ); |
|
518 | + remove_action('action_scheduler/created_table', array($store, 'set_autoincrement'), 10); |
|
519 | 519 | } |
520 | 520 | /** |
521 | 521 | * Implements the logic behind processing an action once an action link is clicked on the list table. |
@@ -523,24 +523,24 @@ discard block |
||
523 | 523 | * @param int $action_id |
524 | 524 | * @param string $row_action_type The type of action to perform on the action. |
525 | 525 | */ |
526 | - protected function process_row_action( $action_id, $row_action_type ) { |
|
526 | + protected function process_row_action($action_id, $row_action_type) { |
|
527 | 527 | try { |
528 | - switch ( $row_action_type ) { |
|
528 | + switch ($row_action_type) { |
|
529 | 529 | case 'run' : |
530 | - $this->runner->process_action( $action_id, 'Admin List Table' ); |
|
530 | + $this->runner->process_action($action_id, 'Admin List Table'); |
|
531 | 531 | break; |
532 | 532 | case 'cancel' : |
533 | - $this->store->cancel_action( $action_id ); |
|
533 | + $this->store->cancel_action($action_id); |
|
534 | 534 | break; |
535 | 535 | } |
536 | 536 | $success = 1; |
537 | 537 | $error_message = ''; |
538 | - } catch ( Exception $e ) { |
|
538 | + } catch (Exception $e) { |
|
539 | 539 | $success = 0; |
540 | 540 | $error_message = $e->getMessage(); |
541 | 541 | } |
542 | 542 | |
543 | - set_transient( 'action_scheduler_admin_notice', compact( 'action_id', 'success', 'error_message', 'row_action_type' ), 30 ); |
|
543 | + set_transient('action_scheduler_admin_notice', compact('action_id', 'success', 'error_message', 'row_action_type'), 30); |
|
544 | 544 | } |
545 | 545 | |
546 | 546 | /** |
@@ -549,7 +549,7 @@ discard block |
||
549 | 549 | public function prepare_items() { |
550 | 550 | $this->prepare_column_headers(); |
551 | 551 | |
552 | - $per_page = $this->get_items_per_page( $this->package . '_items_per_page', $this->items_per_page ); |
|
552 | + $per_page = $this->get_items_per_page($this->package . '_items_per_page', $this->items_per_page); |
|
553 | 553 | $query = array( |
554 | 554 | 'per_page' => $per_page, |
555 | 555 | 'offset' => $this->get_items_offset(), |
@@ -561,37 +561,37 @@ discard block |
||
561 | 561 | |
562 | 562 | $this->items = array(); |
563 | 563 | |
564 | - $total_items = $this->store->query_actions( $query, 'count' ); |
|
564 | + $total_items = $this->store->query_actions($query, 'count'); |
|
565 | 565 | |
566 | 566 | $status_labels = $this->store->get_status_labels(); |
567 | 567 | |
568 | - foreach ( $this->store->query_actions( $query ) as $action_id ) { |
|
568 | + foreach ($this->store->query_actions($query) as $action_id) { |
|
569 | 569 | try { |
570 | - $action = $this->store->fetch_action( $action_id ); |
|
571 | - } catch ( Exception $e ) { |
|
570 | + $action = $this->store->fetch_action($action_id); |
|
571 | + } catch (Exception $e) { |
|
572 | 572 | continue; |
573 | 573 | } |
574 | - if ( is_a( $action, 'ActionScheduler_NullAction' ) ) { |
|
574 | + if (is_a($action, 'ActionScheduler_NullAction')) { |
|
575 | 575 | continue; |
576 | 576 | } |
577 | - $this->items[ $action_id ] = array( |
|
577 | + $this->items[$action_id] = array( |
|
578 | 578 | 'ID' => $action_id, |
579 | 579 | 'hook' => $action->get_hook(), |
580 | - 'status' => $status_labels[ $this->store->get_status( $action_id ) ], |
|
580 | + 'status' => $status_labels[$this->store->get_status($action_id)], |
|
581 | 581 | 'args' => $action->get_args(), |
582 | 582 | 'group' => $action->get_group(), |
583 | - 'log_entries' => $this->logger->get_logs( $action_id ), |
|
584 | - 'claim_id' => $this->store->get_claim_id( $action_id ), |
|
585 | - 'recurrence' => $this->get_recurrence( $action ), |
|
583 | + 'log_entries' => $this->logger->get_logs($action_id), |
|
584 | + 'claim_id' => $this->store->get_claim_id($action_id), |
|
585 | + 'recurrence' => $this->get_recurrence($action), |
|
586 | 586 | 'schedule' => $action->get_schedule(), |
587 | 587 | ); |
588 | 588 | } |
589 | 589 | |
590 | - $this->set_pagination_args( array( |
|
590 | + $this->set_pagination_args(array( |
|
591 | 591 | 'total_items' => $total_items, |
592 | 592 | 'per_page' => $per_page, |
593 | - 'total_pages' => ceil( $total_items / $per_page ), |
|
594 | - ) ); |
|
593 | + 'total_pages' => ceil($total_items / $per_page), |
|
594 | + )); |
|
595 | 595 | } |
596 | 596 | |
597 | 597 | /** |
@@ -606,6 +606,6 @@ discard block |
||
606 | 606 | * Get the text to display in the search box on the list table. |
607 | 607 | */ |
608 | 608 | protected function get_search_box_button_text() { |
609 | - return __( 'Search hook, args and claim ID', 'action-scheduler' ); |
|
609 | + return __('Search hook, args and claim ID', 'action-scheduler'); |
|
610 | 610 | } |
611 | 611 | } |
@@ -17,103 +17,103 @@ |
||
17 | 17 | */ |
18 | 18 | class ProgressBar { |
19 | 19 | |
20 | - /** @var integer */ |
|
21 | - protected $total_ticks; |
|
22 | - |
|
23 | - /** @var integer */ |
|
24 | - protected $count; |
|
25 | - |
|
26 | - /** @var integer */ |
|
27 | - protected $interval; |
|
28 | - |
|
29 | - /** @var string */ |
|
30 | - protected $message; |
|
31 | - |
|
32 | - /** @var \cli\progress\Bar */ |
|
33 | - protected $progress_bar; |
|
34 | - |
|
35 | - /** |
|
36 | - * ProgressBar constructor. |
|
37 | - * |
|
38 | - * @param string $message Text to display before the progress bar. |
|
39 | - * @param integer $count Total number of ticks to be performed. |
|
40 | - * @param integer $interval Optional. The interval in milliseconds between updates. Default 100. |
|
41 | - * |
|
42 | - * @throws Exception When this is not run within WP CLI |
|
43 | - */ |
|
44 | - public function __construct( $message, $count, $interval = 100 ) { |
|
45 | - if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { |
|
46 | - /* translators: %s php class name */ |
|
47 | - throw new \Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) ); |
|
48 | - } |
|
49 | - |
|
50 | - $this->total_ticks = 0; |
|
51 | - $this->message = $message; |
|
52 | - $this->count = $count; |
|
53 | - $this->interval = $interval; |
|
54 | - } |
|
55 | - |
|
56 | - /** |
|
57 | - * Increment the progress bar ticks. |
|
58 | - */ |
|
59 | - public function tick() { |
|
60 | - if ( null === $this->progress_bar ) { |
|
61 | - $this->setup_progress_bar(); |
|
62 | - } |
|
63 | - |
|
64 | - $this->progress_bar->tick(); |
|
65 | - $this->total_ticks++; |
|
66 | - |
|
67 | - do_action( 'action_scheduler/progress_tick', $this->total_ticks ); |
|
68 | - } |
|
69 | - |
|
70 | - /** |
|
71 | - * Get the progress bar tick count. |
|
72 | - * |
|
73 | - * @return int |
|
74 | - */ |
|
75 | - public function current() { |
|
76 | - return $this->progress_bar ? $this->progress_bar->current() : 0; |
|
77 | - } |
|
78 | - |
|
79 | - /** |
|
80 | - * Finish the current progress bar. |
|
81 | - */ |
|
82 | - public function finish() { |
|
83 | - if ( null !== $this->progress_bar ) { |
|
84 | - $this->progress_bar->finish(); |
|
85 | - } |
|
86 | - |
|
87 | - $this->progress_bar = null; |
|
88 | - } |
|
89 | - |
|
90 | - /** |
|
91 | - * Set the message used when creating the progress bar. |
|
92 | - * |
|
93 | - * @param string $message The message to be used when the next progress bar is created. |
|
94 | - */ |
|
95 | - public function set_message( $message ) { |
|
96 | - $this->message = $message; |
|
97 | - } |
|
98 | - |
|
99 | - /** |
|
100 | - * Set the count for a new progress bar. |
|
101 | - * |
|
102 | - * @param integer $count The total number of ticks expected to complete. |
|
103 | - */ |
|
104 | - public function set_count( $count ) { |
|
105 | - $this->count = $count; |
|
106 | - $this->finish(); |
|
107 | - } |
|
108 | - |
|
109 | - /** |
|
110 | - * Set up the progress bar. |
|
111 | - */ |
|
112 | - protected function setup_progress_bar() { |
|
113 | - $this->progress_bar = \WP_CLI\Utils\make_progress_bar( |
|
114 | - $this->message, |
|
115 | - $this->count, |
|
116 | - $this->interval |
|
117 | - ); |
|
118 | - } |
|
20 | + /** @var integer */ |
|
21 | + protected $total_ticks; |
|
22 | + |
|
23 | + /** @var integer */ |
|
24 | + protected $count; |
|
25 | + |
|
26 | + /** @var integer */ |
|
27 | + protected $interval; |
|
28 | + |
|
29 | + /** @var string */ |
|
30 | + protected $message; |
|
31 | + |
|
32 | + /** @var \cli\progress\Bar */ |
|
33 | + protected $progress_bar; |
|
34 | + |
|
35 | + /** |
|
36 | + * ProgressBar constructor. |
|
37 | + * |
|
38 | + * @param string $message Text to display before the progress bar. |
|
39 | + * @param integer $count Total number of ticks to be performed. |
|
40 | + * @param integer $interval Optional. The interval in milliseconds between updates. Default 100. |
|
41 | + * |
|
42 | + * @throws Exception When this is not run within WP CLI |
|
43 | + */ |
|
44 | + public function __construct( $message, $count, $interval = 100 ) { |
|
45 | + if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { |
|
46 | + /* translators: %s php class name */ |
|
47 | + throw new \Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) ); |
|
48 | + } |
|
49 | + |
|
50 | + $this->total_ticks = 0; |
|
51 | + $this->message = $message; |
|
52 | + $this->count = $count; |
|
53 | + $this->interval = $interval; |
|
54 | + } |
|
55 | + |
|
56 | + /** |
|
57 | + * Increment the progress bar ticks. |
|
58 | + */ |
|
59 | + public function tick() { |
|
60 | + if ( null === $this->progress_bar ) { |
|
61 | + $this->setup_progress_bar(); |
|
62 | + } |
|
63 | + |
|
64 | + $this->progress_bar->tick(); |
|
65 | + $this->total_ticks++; |
|
66 | + |
|
67 | + do_action( 'action_scheduler/progress_tick', $this->total_ticks ); |
|
68 | + } |
|
69 | + |
|
70 | + /** |
|
71 | + * Get the progress bar tick count. |
|
72 | + * |
|
73 | + * @return int |
|
74 | + */ |
|
75 | + public function current() { |
|
76 | + return $this->progress_bar ? $this->progress_bar->current() : 0; |
|
77 | + } |
|
78 | + |
|
79 | + /** |
|
80 | + * Finish the current progress bar. |
|
81 | + */ |
|
82 | + public function finish() { |
|
83 | + if ( null !== $this->progress_bar ) { |
|
84 | + $this->progress_bar->finish(); |
|
85 | + } |
|
86 | + |
|
87 | + $this->progress_bar = null; |
|
88 | + } |
|
89 | + |
|
90 | + /** |
|
91 | + * Set the message used when creating the progress bar. |
|
92 | + * |
|
93 | + * @param string $message The message to be used when the next progress bar is created. |
|
94 | + */ |
|
95 | + public function set_message( $message ) { |
|
96 | + $this->message = $message; |
|
97 | + } |
|
98 | + |
|
99 | + /** |
|
100 | + * Set the count for a new progress bar. |
|
101 | + * |
|
102 | + * @param integer $count The total number of ticks expected to complete. |
|
103 | + */ |
|
104 | + public function set_count( $count ) { |
|
105 | + $this->count = $count; |
|
106 | + $this->finish(); |
|
107 | + } |
|
108 | + |
|
109 | + /** |
|
110 | + * Set up the progress bar. |
|
111 | + */ |
|
112 | + protected function setup_progress_bar() { |
|
113 | + $this->progress_bar = \WP_CLI\Utils\make_progress_bar( |
|
114 | + $this->message, |
|
115 | + $this->count, |
|
116 | + $this->interval |
|
117 | + ); |
|
118 | + } |
|
119 | 119 | } |
@@ -41,10 +41,10 @@ discard block |
||
41 | 41 | * |
42 | 42 | * @throws Exception When this is not run within WP CLI |
43 | 43 | */ |
44 | - public function __construct( $message, $count, $interval = 100 ) { |
|
45 | - if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { |
|
44 | + public function __construct($message, $count, $interval = 100) { |
|
45 | + if (!(defined('WP_CLI') && WP_CLI)) { |
|
46 | 46 | /* translators: %s php class name */ |
47 | - throw new \Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) ); |
|
47 | + throw new \Exception(sprintf(__('The %s class can only be run within WP CLI.', 'action-scheduler'), __CLASS__)); |
|
48 | 48 | } |
49 | 49 | |
50 | 50 | $this->total_ticks = 0; |
@@ -57,14 +57,14 @@ discard block |
||
57 | 57 | * Increment the progress bar ticks. |
58 | 58 | */ |
59 | 59 | public function tick() { |
60 | - if ( null === $this->progress_bar ) { |
|
60 | + if (null === $this->progress_bar) { |
|
61 | 61 | $this->setup_progress_bar(); |
62 | 62 | } |
63 | 63 | |
64 | 64 | $this->progress_bar->tick(); |
65 | 65 | $this->total_ticks++; |
66 | 66 | |
67 | - do_action( 'action_scheduler/progress_tick', $this->total_ticks ); |
|
67 | + do_action('action_scheduler/progress_tick', $this->total_ticks); |
|
68 | 68 | } |
69 | 69 | |
70 | 70 | /** |
@@ -80,7 +80,7 @@ discard block |
||
80 | 80 | * Finish the current progress bar. |
81 | 81 | */ |
82 | 82 | public function finish() { |
83 | - if ( null !== $this->progress_bar ) { |
|
83 | + if (null !== $this->progress_bar) { |
|
84 | 84 | $this->progress_bar->finish(); |
85 | 85 | } |
86 | 86 | |
@@ -92,7 +92,7 @@ discard block |
||
92 | 92 | * |
93 | 93 | * @param string $message The message to be used when the next progress bar is created. |
94 | 94 | */ |
95 | - public function set_message( $message ) { |
|
95 | + public function set_message($message) { |
|
96 | 96 | $this->message = $message; |
97 | 97 | } |
98 | 98 | |
@@ -101,7 +101,7 @@ discard block |
||
101 | 101 | * |
102 | 102 | * @param integer $count The total number of ticks expected to complete. |
103 | 103 | */ |
104 | - public function set_count( $count ) { |
|
104 | + public function set_count($count) { |
|
105 | 105 | $this->count = $count; |
106 | 106 | $this->finish(); |
107 | 107 | } |
@@ -9,189 +9,189 @@ |
||
9 | 9 | */ |
10 | 10 | class ActionScheduler_WPCLI_QueueRunner extends ActionScheduler_Abstract_QueueRunner { |
11 | 11 | |
12 | - /** @var array */ |
|
13 | - protected $actions; |
|
14 | - |
|
15 | - /** @var ActionScheduler_ActionClaim */ |
|
16 | - protected $claim; |
|
17 | - |
|
18 | - /** @var \cli\progress\Bar */ |
|
19 | - protected $progress_bar; |
|
20 | - |
|
21 | - /** |
|
22 | - * ActionScheduler_WPCLI_QueueRunner constructor. |
|
23 | - * |
|
24 | - * @param ActionScheduler_Store $store |
|
25 | - * @param ActionScheduler_FatalErrorMonitor $monitor |
|
26 | - * @param ActionScheduler_QueueCleaner $cleaner |
|
27 | - * |
|
28 | - * @throws Exception When this is not run within WP CLI |
|
29 | - */ |
|
30 | - public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) { |
|
31 | - if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { |
|
32 | - /* translators: %s php class name */ |
|
33 | - throw new Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) ); |
|
34 | - } |
|
35 | - |
|
36 | - parent::__construct( $store, $monitor, $cleaner ); |
|
37 | - } |
|
38 | - |
|
39 | - /** |
|
40 | - * Set up the Queue before processing. |
|
41 | - * |
|
42 | - * @author Jeremy Pry |
|
43 | - * |
|
44 | - * @param int $batch_size The batch size to process. |
|
45 | - * @param array $hooks The hooks being used to filter the actions claimed in this batch. |
|
46 | - * @param string $group The group of actions to claim with this batch. |
|
47 | - * @param bool $force Whether to force running even with too many concurrent processes. |
|
48 | - * |
|
49 | - * @return int The number of actions that will be run. |
|
50 | - * @throws \WP_CLI\ExitException When there are too many concurrent batches. |
|
51 | - */ |
|
52 | - public function setup( $batch_size, $hooks = array(), $group = '', $force = false ) { |
|
53 | - $this->run_cleanup(); |
|
54 | - $this->add_hooks(); |
|
55 | - |
|
56 | - // Check to make sure there aren't too many concurrent processes running. |
|
57 | - if ( $this->has_maximum_concurrent_batches() ) { |
|
58 | - if ( $force ) { |
|
59 | - WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) ); |
|
60 | - } else { |
|
61 | - WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) ); |
|
62 | - } |
|
63 | - } |
|
64 | - |
|
65 | - // Stake a claim and store it. |
|
66 | - $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group ); |
|
67 | - $this->monitor->attach( $this->claim ); |
|
68 | - $this->actions = $this->claim->get_actions(); |
|
69 | - |
|
70 | - return count( $this->actions ); |
|
71 | - } |
|
72 | - |
|
73 | - /** |
|
74 | - * Add our hooks to the appropriate actions. |
|
75 | - * |
|
76 | - * @author Jeremy Pry |
|
77 | - */ |
|
78 | - protected function add_hooks() { |
|
79 | - add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) ); |
|
80 | - add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 ); |
|
81 | - add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 ); |
|
82 | - } |
|
83 | - |
|
84 | - /** |
|
85 | - * Set up the WP CLI progress bar. |
|
86 | - * |
|
87 | - * @author Jeremy Pry |
|
88 | - */ |
|
89 | - protected function setup_progress_bar() { |
|
90 | - $count = count( $this->actions ); |
|
91 | - $this->progress_bar = new ProgressBar( |
|
92 | - /* translators: %d: amount of actions */ |
|
93 | - sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), number_format_i18n( $count ) ), |
|
94 | - $count |
|
95 | - ); |
|
96 | - } |
|
97 | - |
|
98 | - /** |
|
99 | - * Process actions in the queue. |
|
100 | - * |
|
101 | - * @author Jeremy Pry |
|
102 | - * |
|
103 | - * @param string $context Optional runner context. Default 'WP CLI'. |
|
104 | - * |
|
105 | - * @return int The number of actions processed. |
|
106 | - */ |
|
107 | - public function run( $context = 'WP CLI' ) { |
|
108 | - do_action( 'action_scheduler_before_process_queue' ); |
|
109 | - $this->setup_progress_bar(); |
|
110 | - foreach ( $this->actions as $action_id ) { |
|
111 | - // Error if we lost the claim. |
|
112 | - if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) { |
|
113 | - WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) ); |
|
114 | - break; |
|
115 | - } |
|
116 | - |
|
117 | - $this->process_action( $action_id, $context ); |
|
118 | - $this->progress_bar->tick(); |
|
119 | - } |
|
120 | - |
|
121 | - $completed = $this->progress_bar->current(); |
|
122 | - $this->progress_bar->finish(); |
|
123 | - $this->store->release_claim( $this->claim ); |
|
124 | - do_action( 'action_scheduler_after_process_queue' ); |
|
125 | - |
|
126 | - return $completed; |
|
127 | - } |
|
128 | - |
|
129 | - /** |
|
130 | - * Handle WP CLI message when the action is starting. |
|
131 | - * |
|
132 | - * @author Jeremy Pry |
|
133 | - * |
|
134 | - * @param $action_id |
|
135 | - */ |
|
136 | - public function before_execute( $action_id ) { |
|
137 | - /* translators: %s refers to the action ID */ |
|
138 | - WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) ); |
|
139 | - } |
|
140 | - |
|
141 | - /** |
|
142 | - * Handle WP CLI message when the action has completed. |
|
143 | - * |
|
144 | - * @author Jeremy Pry |
|
145 | - * |
|
146 | - * @param int $action_id |
|
147 | - * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility. |
|
148 | - */ |
|
149 | - public function after_execute( $action_id, $action = null ) { |
|
150 | - // backward compatibility |
|
151 | - if ( null === $action ) { |
|
152 | - $action = $this->store->fetch_action( $action_id ); |
|
153 | - } |
|
154 | - /* translators: 1: action ID 2: hook name */ |
|
155 | - WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'action-scheduler' ), $action_id, $action->get_hook() ) ); |
|
156 | - } |
|
157 | - |
|
158 | - /** |
|
159 | - * Handle WP CLI message when the action has failed. |
|
160 | - * |
|
161 | - * @author Jeremy Pry |
|
162 | - * |
|
163 | - * @param int $action_id |
|
164 | - * @param Exception $exception |
|
165 | - * @throws \WP_CLI\ExitException With failure message. |
|
166 | - */ |
|
167 | - public function action_failed( $action_id, $exception ) { |
|
168 | - WP_CLI::error( |
|
169 | - /* translators: 1: action ID 2: exception message */ |
|
170 | - sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ), |
|
171 | - false |
|
172 | - ); |
|
173 | - } |
|
174 | - |
|
175 | - /** |
|
176 | - * Sleep and help avoid hitting memory limit |
|
177 | - * |
|
178 | - * @param int $sleep_time Amount of seconds to sleep |
|
179 | - * @deprecated 3.0.0 |
|
180 | - */ |
|
181 | - protected function stop_the_insanity( $sleep_time = 0 ) { |
|
182 | - _deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' ); |
|
183 | - |
|
184 | - ActionScheduler_DataController::free_memory(); |
|
185 | - } |
|
186 | - |
|
187 | - /** |
|
188 | - * Maybe trigger the stop_the_insanity() method to free up memory. |
|
189 | - */ |
|
190 | - protected function maybe_stop_the_insanity() { |
|
191 | - // The value returned by progress_bar->current() might be padded. Remove padding, and convert to int. |
|
192 | - $current_iteration = intval( trim( $this->progress_bar->current() ) ); |
|
193 | - if ( 0 === $current_iteration % 50 ) { |
|
194 | - $this->stop_the_insanity(); |
|
195 | - } |
|
196 | - } |
|
12 | + /** @var array */ |
|
13 | + protected $actions; |
|
14 | + |
|
15 | + /** @var ActionScheduler_ActionClaim */ |
|
16 | + protected $claim; |
|
17 | + |
|
18 | + /** @var \cli\progress\Bar */ |
|
19 | + protected $progress_bar; |
|
20 | + |
|
21 | + /** |
|
22 | + * ActionScheduler_WPCLI_QueueRunner constructor. |
|
23 | + * |
|
24 | + * @param ActionScheduler_Store $store |
|
25 | + * @param ActionScheduler_FatalErrorMonitor $monitor |
|
26 | + * @param ActionScheduler_QueueCleaner $cleaner |
|
27 | + * |
|
28 | + * @throws Exception When this is not run within WP CLI |
|
29 | + */ |
|
30 | + public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) { |
|
31 | + if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { |
|
32 | + /* translators: %s php class name */ |
|
33 | + throw new Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) ); |
|
34 | + } |
|
35 | + |
|
36 | + parent::__construct( $store, $monitor, $cleaner ); |
|
37 | + } |
|
38 | + |
|
39 | + /** |
|
40 | + * Set up the Queue before processing. |
|
41 | + * |
|
42 | + * @author Jeremy Pry |
|
43 | + * |
|
44 | + * @param int $batch_size The batch size to process. |
|
45 | + * @param array $hooks The hooks being used to filter the actions claimed in this batch. |
|
46 | + * @param string $group The group of actions to claim with this batch. |
|
47 | + * @param bool $force Whether to force running even with too many concurrent processes. |
|
48 | + * |
|
49 | + * @return int The number of actions that will be run. |
|
50 | + * @throws \WP_CLI\ExitException When there are too many concurrent batches. |
|
51 | + */ |
|
52 | + public function setup( $batch_size, $hooks = array(), $group = '', $force = false ) { |
|
53 | + $this->run_cleanup(); |
|
54 | + $this->add_hooks(); |
|
55 | + |
|
56 | + // Check to make sure there aren't too many concurrent processes running. |
|
57 | + if ( $this->has_maximum_concurrent_batches() ) { |
|
58 | + if ( $force ) { |
|
59 | + WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) ); |
|
60 | + } else { |
|
61 | + WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) ); |
|
62 | + } |
|
63 | + } |
|
64 | + |
|
65 | + // Stake a claim and store it. |
|
66 | + $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group ); |
|
67 | + $this->monitor->attach( $this->claim ); |
|
68 | + $this->actions = $this->claim->get_actions(); |
|
69 | + |
|
70 | + return count( $this->actions ); |
|
71 | + } |
|
72 | + |
|
73 | + /** |
|
74 | + * Add our hooks to the appropriate actions. |
|
75 | + * |
|
76 | + * @author Jeremy Pry |
|
77 | + */ |
|
78 | + protected function add_hooks() { |
|
79 | + add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) ); |
|
80 | + add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 ); |
|
81 | + add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 ); |
|
82 | + } |
|
83 | + |
|
84 | + /** |
|
85 | + * Set up the WP CLI progress bar. |
|
86 | + * |
|
87 | + * @author Jeremy Pry |
|
88 | + */ |
|
89 | + protected function setup_progress_bar() { |
|
90 | + $count = count( $this->actions ); |
|
91 | + $this->progress_bar = new ProgressBar( |
|
92 | + /* translators: %d: amount of actions */ |
|
93 | + sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), number_format_i18n( $count ) ), |
|
94 | + $count |
|
95 | + ); |
|
96 | + } |
|
97 | + |
|
98 | + /** |
|
99 | + * Process actions in the queue. |
|
100 | + * |
|
101 | + * @author Jeremy Pry |
|
102 | + * |
|
103 | + * @param string $context Optional runner context. Default 'WP CLI'. |
|
104 | + * |
|
105 | + * @return int The number of actions processed. |
|
106 | + */ |
|
107 | + public function run( $context = 'WP CLI' ) { |
|
108 | + do_action( 'action_scheduler_before_process_queue' ); |
|
109 | + $this->setup_progress_bar(); |
|
110 | + foreach ( $this->actions as $action_id ) { |
|
111 | + // Error if we lost the claim. |
|
112 | + if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) { |
|
113 | + WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) ); |
|
114 | + break; |
|
115 | + } |
|
116 | + |
|
117 | + $this->process_action( $action_id, $context ); |
|
118 | + $this->progress_bar->tick(); |
|
119 | + } |
|
120 | + |
|
121 | + $completed = $this->progress_bar->current(); |
|
122 | + $this->progress_bar->finish(); |
|
123 | + $this->store->release_claim( $this->claim ); |
|
124 | + do_action( 'action_scheduler_after_process_queue' ); |
|
125 | + |
|
126 | + return $completed; |
|
127 | + } |
|
128 | + |
|
129 | + /** |
|
130 | + * Handle WP CLI message when the action is starting. |
|
131 | + * |
|
132 | + * @author Jeremy Pry |
|
133 | + * |
|
134 | + * @param $action_id |
|
135 | + */ |
|
136 | + public function before_execute( $action_id ) { |
|
137 | + /* translators: %s refers to the action ID */ |
|
138 | + WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) ); |
|
139 | + } |
|
140 | + |
|
141 | + /** |
|
142 | + * Handle WP CLI message when the action has completed. |
|
143 | + * |
|
144 | + * @author Jeremy Pry |
|
145 | + * |
|
146 | + * @param int $action_id |
|
147 | + * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility. |
|
148 | + */ |
|
149 | + public function after_execute( $action_id, $action = null ) { |
|
150 | + // backward compatibility |
|
151 | + if ( null === $action ) { |
|
152 | + $action = $this->store->fetch_action( $action_id ); |
|
153 | + } |
|
154 | + /* translators: 1: action ID 2: hook name */ |
|
155 | + WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'action-scheduler' ), $action_id, $action->get_hook() ) ); |
|
156 | + } |
|
157 | + |
|
158 | + /** |
|
159 | + * Handle WP CLI message when the action has failed. |
|
160 | + * |
|
161 | + * @author Jeremy Pry |
|
162 | + * |
|
163 | + * @param int $action_id |
|
164 | + * @param Exception $exception |
|
165 | + * @throws \WP_CLI\ExitException With failure message. |
|
166 | + */ |
|
167 | + public function action_failed( $action_id, $exception ) { |
|
168 | + WP_CLI::error( |
|
169 | + /* translators: 1: action ID 2: exception message */ |
|
170 | + sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ), |
|
171 | + false |
|
172 | + ); |
|
173 | + } |
|
174 | + |
|
175 | + /** |
|
176 | + * Sleep and help avoid hitting memory limit |
|
177 | + * |
|
178 | + * @param int $sleep_time Amount of seconds to sleep |
|
179 | + * @deprecated 3.0.0 |
|
180 | + */ |
|
181 | + protected function stop_the_insanity( $sleep_time = 0 ) { |
|
182 | + _deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' ); |
|
183 | + |
|
184 | + ActionScheduler_DataController::free_memory(); |
|
185 | + } |
|
186 | + |
|
187 | + /** |
|
188 | + * Maybe trigger the stop_the_insanity() method to free up memory. |
|
189 | + */ |
|
190 | + protected function maybe_stop_the_insanity() { |
|
191 | + // The value returned by progress_bar->current() might be padded. Remove padding, and convert to int. |
|
192 | + $current_iteration = intval( trim( $this->progress_bar->current() ) ); |
|
193 | + if ( 0 === $current_iteration % 50 ) { |
|
194 | + $this->stop_the_insanity(); |
|
195 | + } |
|
196 | + } |
|
197 | 197 | } |
@@ -27,13 +27,13 @@ discard block |
||
27 | 27 | * |
28 | 28 | * @throws Exception When this is not run within WP CLI |
29 | 29 | */ |
30 | - public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) { |
|
31 | - if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { |
|
30 | + public function __construct(ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null) { |
|
31 | + if (!(defined('WP_CLI') && WP_CLI)) { |
|
32 | 32 | /* translators: %s php class name */ |
33 | - throw new Exception( sprintf( __( 'The %s class can only be run within WP CLI.', 'action-scheduler' ), __CLASS__ ) ); |
|
33 | + throw new Exception(sprintf(__('The %s class can only be run within WP CLI.', 'action-scheduler'), __CLASS__)); |
|
34 | 34 | } |
35 | 35 | |
36 | - parent::__construct( $store, $monitor, $cleaner ); |
|
36 | + parent::__construct($store, $monitor, $cleaner); |
|
37 | 37 | } |
38 | 38 | |
39 | 39 | /** |
@@ -49,25 +49,25 @@ discard block |
||
49 | 49 | * @return int The number of actions that will be run. |
50 | 50 | * @throws \WP_CLI\ExitException When there are too many concurrent batches. |
51 | 51 | */ |
52 | - public function setup( $batch_size, $hooks = array(), $group = '', $force = false ) { |
|
52 | + public function setup($batch_size, $hooks = array(), $group = '', $force = false) { |
|
53 | 53 | $this->run_cleanup(); |
54 | 54 | $this->add_hooks(); |
55 | 55 | |
56 | 56 | // Check to make sure there aren't too many concurrent processes running. |
57 | - if ( $this->has_maximum_concurrent_batches() ) { |
|
58 | - if ( $force ) { |
|
59 | - WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) ); |
|
57 | + if ($this->has_maximum_concurrent_batches()) { |
|
58 | + if ($force) { |
|
59 | + WP_CLI::warning(__('There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler')); |
|
60 | 60 | } else { |
61 | - WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) ); |
|
61 | + WP_CLI::error(__('There are too many concurrent batches.', 'action-scheduler')); |
|
62 | 62 | } |
63 | 63 | } |
64 | 64 | |
65 | 65 | // Stake a claim and store it. |
66 | - $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group ); |
|
67 | - $this->monitor->attach( $this->claim ); |
|
66 | + $this->claim = $this->store->stake_claim($batch_size, null, $hooks, $group); |
|
67 | + $this->monitor->attach($this->claim); |
|
68 | 68 | $this->actions = $this->claim->get_actions(); |
69 | 69 | |
70 | - return count( $this->actions ); |
|
70 | + return count($this->actions); |
|
71 | 71 | } |
72 | 72 | |
73 | 73 | /** |
@@ -76,9 +76,9 @@ discard block |
||
76 | 76 | * @author Jeremy Pry |
77 | 77 | */ |
78 | 78 | protected function add_hooks() { |
79 | - add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) ); |
|
80 | - add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 ); |
|
81 | - add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 ); |
|
79 | + add_action('action_scheduler_before_execute', array($this, 'before_execute')); |
|
80 | + add_action('action_scheduler_after_execute', array($this, 'after_execute'), 10, 2); |
|
81 | + add_action('action_scheduler_failed_execution', array($this, 'action_failed'), 10, 2); |
|
82 | 82 | } |
83 | 83 | |
84 | 84 | /** |
@@ -87,10 +87,10 @@ discard block |
||
87 | 87 | * @author Jeremy Pry |
88 | 88 | */ |
89 | 89 | protected function setup_progress_bar() { |
90 | - $count = count( $this->actions ); |
|
90 | + $count = count($this->actions); |
|
91 | 91 | $this->progress_bar = new ProgressBar( |
92 | 92 | /* translators: %d: amount of actions */ |
93 | - sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), number_format_i18n( $count ) ), |
|
93 | + sprintf(_n('Running %d action', 'Running %d actions', $count, 'action-scheduler'), number_format_i18n($count)), |
|
94 | 94 | $count |
95 | 95 | ); |
96 | 96 | } |
@@ -104,24 +104,24 @@ discard block |
||
104 | 104 | * |
105 | 105 | * @return int The number of actions processed. |
106 | 106 | */ |
107 | - public function run( $context = 'WP CLI' ) { |
|
108 | - do_action( 'action_scheduler_before_process_queue' ); |
|
107 | + public function run($context = 'WP CLI') { |
|
108 | + do_action('action_scheduler_before_process_queue'); |
|
109 | 109 | $this->setup_progress_bar(); |
110 | - foreach ( $this->actions as $action_id ) { |
|
110 | + foreach ($this->actions as $action_id) { |
|
111 | 111 | // Error if we lost the claim. |
112 | - if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) { |
|
113 | - WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) ); |
|
112 | + if (!in_array($action_id, $this->store->find_actions_by_claim_id($this->claim->get_id()))) { |
|
113 | + WP_CLI::warning(__('The claim has been lost. Aborting current batch.', 'action-scheduler')); |
|
114 | 114 | break; |
115 | 115 | } |
116 | 116 | |
117 | - $this->process_action( $action_id, $context ); |
|
117 | + $this->process_action($action_id, $context); |
|
118 | 118 | $this->progress_bar->tick(); |
119 | 119 | } |
120 | 120 | |
121 | 121 | $completed = $this->progress_bar->current(); |
122 | 122 | $this->progress_bar->finish(); |
123 | - $this->store->release_claim( $this->claim ); |
|
124 | - do_action( 'action_scheduler_after_process_queue' ); |
|
123 | + $this->store->release_claim($this->claim); |
|
124 | + do_action('action_scheduler_after_process_queue'); |
|
125 | 125 | |
126 | 126 | return $completed; |
127 | 127 | } |
@@ -133,9 +133,9 @@ discard block |
||
133 | 133 | * |
134 | 134 | * @param $action_id |
135 | 135 | */ |
136 | - public function before_execute( $action_id ) { |
|
136 | + public function before_execute($action_id) { |
|
137 | 137 | /* translators: %s refers to the action ID */ |
138 | - WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) ); |
|
138 | + WP_CLI::log(sprintf(__('Started processing action %s', 'action-scheduler'), $action_id)); |
|
139 | 139 | } |
140 | 140 | |
141 | 141 | /** |
@@ -146,13 +146,13 @@ discard block |
||
146 | 146 | * @param int $action_id |
147 | 147 | * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility. |
148 | 148 | */ |
149 | - public function after_execute( $action_id, $action = null ) { |
|
149 | + public function after_execute($action_id, $action = null) { |
|
150 | 150 | // backward compatibility |
151 | - if ( null === $action ) { |
|
152 | - $action = $this->store->fetch_action( $action_id ); |
|
151 | + if (null === $action) { |
|
152 | + $action = $this->store->fetch_action($action_id); |
|
153 | 153 | } |
154 | 154 | /* translators: 1: action ID 2: hook name */ |
155 | - WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'action-scheduler' ), $action_id, $action->get_hook() ) ); |
|
155 | + WP_CLI::log(sprintf(__('Completed processing action %1$s with hook: %2$s', 'action-scheduler'), $action_id, $action->get_hook())); |
|
156 | 156 | } |
157 | 157 | |
158 | 158 | /** |
@@ -164,10 +164,10 @@ discard block |
||
164 | 164 | * @param Exception $exception |
165 | 165 | * @throws \WP_CLI\ExitException With failure message. |
166 | 166 | */ |
167 | - public function action_failed( $action_id, $exception ) { |
|
167 | + public function action_failed($action_id, $exception) { |
|
168 | 168 | WP_CLI::error( |
169 | 169 | /* translators: 1: action ID 2: exception message */ |
170 | - sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ), |
|
170 | + sprintf(__('Error processing action %1$s: %2$s', 'action-scheduler'), $action_id, $exception->getMessage()), |
|
171 | 171 | false |
172 | 172 | ); |
173 | 173 | } |
@@ -178,8 +178,8 @@ discard block |
||
178 | 178 | * @param int $sleep_time Amount of seconds to sleep |
179 | 179 | * @deprecated 3.0.0 |
180 | 180 | */ |
181 | - protected function stop_the_insanity( $sleep_time = 0 ) { |
|
182 | - _deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' ); |
|
181 | + protected function stop_the_insanity($sleep_time = 0) { |
|
182 | + _deprecated_function('ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory'); |
|
183 | 183 | |
184 | 184 | ActionScheduler_DataController::free_memory(); |
185 | 185 | } |
@@ -189,8 +189,8 @@ discard block |
||
189 | 189 | */ |
190 | 190 | protected function maybe_stop_the_insanity() { |
191 | 191 | // The value returned by progress_bar->current() might be padded. Remove padding, and convert to int. |
192 | - $current_iteration = intval( trim( $this->progress_bar->current() ) ); |
|
193 | - if ( 0 === $current_iteration % 50 ) { |
|
192 | + $current_iteration = intval(trim($this->progress_bar->current())); |
|
193 | + if (0 === $current_iteration % 50) { |
|
194 | 194 | $this->stop_the_insanity(); |
195 | 195 | } |
196 | 196 | } |
@@ -21,128 +21,128 @@ |
||
21 | 21 | */ |
22 | 22 | class Migration_Command extends WP_CLI_Command { |
23 | 23 | |
24 | - /** @var int */ |
|
25 | - private $total_processed = 0; |
|
26 | - |
|
27 | - /** |
|
28 | - * Register the command with WP-CLI |
|
29 | - */ |
|
30 | - public function register() { |
|
31 | - if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) { |
|
32 | - return; |
|
33 | - } |
|
34 | - |
|
35 | - WP_CLI::add_command( 'action-scheduler migrate', [ $this, 'migrate' ], [ |
|
36 | - 'shortdesc' => 'Migrates actions to the DB tables store', |
|
37 | - 'synopsis' => [ |
|
38 | - [ |
|
39 | - 'type' => 'assoc', |
|
40 | - 'name' => 'batch-size', |
|
41 | - 'optional' => true, |
|
42 | - 'default' => 100, |
|
43 | - 'description' => 'The number of actions to process in each batch', |
|
44 | - ], |
|
45 | - [ |
|
46 | - 'type' => 'assoc', |
|
47 | - 'name' => 'free-memory-on', |
|
48 | - 'optional' => true, |
|
49 | - 'default' => 50, |
|
50 | - 'description' => 'The number of actions to process between freeing memory. 0 disables freeing memory', |
|
51 | - ], |
|
52 | - [ |
|
53 | - 'type' => 'assoc', |
|
54 | - 'name' => 'pause', |
|
55 | - 'optional' => true, |
|
56 | - 'default' => 0, |
|
57 | - 'description' => 'The number of seconds to pause when freeing memory', |
|
58 | - ], |
|
59 | - [ |
|
60 | - 'type' => 'flag', |
|
61 | - 'name' => 'dry-run', |
|
62 | - 'optional' => true, |
|
63 | - 'description' => 'Reports on the actions that would have been migrated, but does not change any data', |
|
64 | - ], |
|
65 | - ], |
|
66 | - ] ); |
|
67 | - } |
|
68 | - |
|
69 | - /** |
|
70 | - * Process the data migration. |
|
71 | - * |
|
72 | - * @param array $positional_args Required for WP CLI. Not used in migration. |
|
73 | - * @param array $assoc_args Optional arguments. |
|
74 | - * |
|
75 | - * @return void |
|
76 | - */ |
|
77 | - public function migrate( $positional_args, $assoc_args ) { |
|
78 | - $this->init_logging(); |
|
79 | - |
|
80 | - $config = $this->get_migration_config( $assoc_args ); |
|
81 | - $runner = new Runner( $config ); |
|
82 | - $runner->init_destination(); |
|
83 | - |
|
84 | - $batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100; |
|
85 | - $free_on = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50; |
|
86 | - $sleep = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0; |
|
87 | - \ActionScheduler_DataController::set_free_ticks( $free_on ); |
|
88 | - \ActionScheduler_DataController::set_sleep_time( $sleep ); |
|
89 | - |
|
90 | - do { |
|
91 | - $actions_processed = $runner->run( $batch_size ); |
|
92 | - $this->total_processed += $actions_processed; |
|
93 | - } while ( $actions_processed > 0 ); |
|
94 | - |
|
95 | - if ( ! $config->get_dry_run() ) { |
|
96 | - // let the scheduler know that there's nothing left to do |
|
97 | - $scheduler = new Scheduler(); |
|
98 | - $scheduler->mark_complete(); |
|
99 | - } |
|
100 | - |
|
101 | - WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) ); |
|
102 | - } |
|
103 | - |
|
104 | - /** |
|
105 | - * Build the config object used to create the Runner |
|
106 | - * |
|
107 | - * @param array $args Optional arguments. |
|
108 | - * |
|
109 | - * @return ActionScheduler\Migration\Config |
|
110 | - */ |
|
111 | - private function get_migration_config( $args ) { |
|
112 | - $args = wp_parse_args( $args, [ |
|
113 | - 'dry-run' => false, |
|
114 | - ] ); |
|
115 | - |
|
116 | - $config = Controller::instance()->get_migration_config_object(); |
|
117 | - $config->set_dry_run( ! empty( $args[ 'dry-run' ] ) ); |
|
118 | - |
|
119 | - return $config; |
|
120 | - } |
|
121 | - |
|
122 | - /** |
|
123 | - * Hook command line logging into migration actions. |
|
124 | - */ |
|
125 | - private function init_logging() { |
|
126 | - add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) { |
|
127 | - WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) ); |
|
128 | - }, 10, 1 ); |
|
129 | - add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) { |
|
130 | - WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) ); |
|
131 | - }, 10, 1 ); |
|
132 | - add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) { |
|
133 | - WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) ); |
|
134 | - }, 10, 1 ); |
|
135 | - add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) { |
|
136 | - WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) ); |
|
137 | - }, 10, 2 ); |
|
138 | - add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) { |
|
139 | - WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) ); |
|
140 | - }, 10, 2 ); |
|
141 | - add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) { |
|
142 | - WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) ); |
|
143 | - }, 10, 1 ); |
|
144 | - add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) { |
|
145 | - WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) ); |
|
146 | - }, 10, 1 ); |
|
147 | - } |
|
24 | + /** @var int */ |
|
25 | + private $total_processed = 0; |
|
26 | + |
|
27 | + /** |
|
28 | + * Register the command with WP-CLI |
|
29 | + */ |
|
30 | + public function register() { |
|
31 | + if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) { |
|
32 | + return; |
|
33 | + } |
|
34 | + |
|
35 | + WP_CLI::add_command( 'action-scheduler migrate', [ $this, 'migrate' ], [ |
|
36 | + 'shortdesc' => 'Migrates actions to the DB tables store', |
|
37 | + 'synopsis' => [ |
|
38 | + [ |
|
39 | + 'type' => 'assoc', |
|
40 | + 'name' => 'batch-size', |
|
41 | + 'optional' => true, |
|
42 | + 'default' => 100, |
|
43 | + 'description' => 'The number of actions to process in each batch', |
|
44 | + ], |
|
45 | + [ |
|
46 | + 'type' => 'assoc', |
|
47 | + 'name' => 'free-memory-on', |
|
48 | + 'optional' => true, |
|
49 | + 'default' => 50, |
|
50 | + 'description' => 'The number of actions to process between freeing memory. 0 disables freeing memory', |
|
51 | + ], |
|
52 | + [ |
|
53 | + 'type' => 'assoc', |
|
54 | + 'name' => 'pause', |
|
55 | + 'optional' => true, |
|
56 | + 'default' => 0, |
|
57 | + 'description' => 'The number of seconds to pause when freeing memory', |
|
58 | + ], |
|
59 | + [ |
|
60 | + 'type' => 'flag', |
|
61 | + 'name' => 'dry-run', |
|
62 | + 'optional' => true, |
|
63 | + 'description' => 'Reports on the actions that would have been migrated, but does not change any data', |
|
64 | + ], |
|
65 | + ], |
|
66 | + ] ); |
|
67 | + } |
|
68 | + |
|
69 | + /** |
|
70 | + * Process the data migration. |
|
71 | + * |
|
72 | + * @param array $positional_args Required for WP CLI. Not used in migration. |
|
73 | + * @param array $assoc_args Optional arguments. |
|
74 | + * |
|
75 | + * @return void |
|
76 | + */ |
|
77 | + public function migrate( $positional_args, $assoc_args ) { |
|
78 | + $this->init_logging(); |
|
79 | + |
|
80 | + $config = $this->get_migration_config( $assoc_args ); |
|
81 | + $runner = new Runner( $config ); |
|
82 | + $runner->init_destination(); |
|
83 | + |
|
84 | + $batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100; |
|
85 | + $free_on = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50; |
|
86 | + $sleep = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0; |
|
87 | + \ActionScheduler_DataController::set_free_ticks( $free_on ); |
|
88 | + \ActionScheduler_DataController::set_sleep_time( $sleep ); |
|
89 | + |
|
90 | + do { |
|
91 | + $actions_processed = $runner->run( $batch_size ); |
|
92 | + $this->total_processed += $actions_processed; |
|
93 | + } while ( $actions_processed > 0 ); |
|
94 | + |
|
95 | + if ( ! $config->get_dry_run() ) { |
|
96 | + // let the scheduler know that there's nothing left to do |
|
97 | + $scheduler = new Scheduler(); |
|
98 | + $scheduler->mark_complete(); |
|
99 | + } |
|
100 | + |
|
101 | + WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) ); |
|
102 | + } |
|
103 | + |
|
104 | + /** |
|
105 | + * Build the config object used to create the Runner |
|
106 | + * |
|
107 | + * @param array $args Optional arguments. |
|
108 | + * |
|
109 | + * @return ActionScheduler\Migration\Config |
|
110 | + */ |
|
111 | + private function get_migration_config( $args ) { |
|
112 | + $args = wp_parse_args( $args, [ |
|
113 | + 'dry-run' => false, |
|
114 | + ] ); |
|
115 | + |
|
116 | + $config = Controller::instance()->get_migration_config_object(); |
|
117 | + $config->set_dry_run( ! empty( $args[ 'dry-run' ] ) ); |
|
118 | + |
|
119 | + return $config; |
|
120 | + } |
|
121 | + |
|
122 | + /** |
|
123 | + * Hook command line logging into migration actions. |
|
124 | + */ |
|
125 | + private function init_logging() { |
|
126 | + add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) { |
|
127 | + WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) ); |
|
128 | + }, 10, 1 ); |
|
129 | + add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) { |
|
130 | + WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) ); |
|
131 | + }, 10, 1 ); |
|
132 | + add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) { |
|
133 | + WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) ); |
|
134 | + }, 10, 1 ); |
|
135 | + add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) { |
|
136 | + WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) ); |
|
137 | + }, 10, 2 ); |
|
138 | + add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) { |
|
139 | + WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) ); |
|
140 | + }, 10, 2 ); |
|
141 | + add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) { |
|
142 | + WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) ); |
|
143 | + }, 10, 1 ); |
|
144 | + add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) { |
|
145 | + WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) ); |
|
146 | + }, 10, 1 ); |
|
147 | + } |
|
148 | 148 | } |
@@ -28,11 +28,11 @@ discard block |
||
28 | 28 | * Register the command with WP-CLI |
29 | 29 | */ |
30 | 30 | public function register() { |
31 | - if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) { |
|
31 | + if (!defined('WP_CLI') || !WP_CLI) { |
|
32 | 32 | return; |
33 | 33 | } |
34 | 34 | |
35 | - WP_CLI::add_command( 'action-scheduler migrate', [ $this, 'migrate' ], [ |
|
35 | + WP_CLI::add_command('action-scheduler migrate', [$this, 'migrate'], [ |
|
36 | 36 | 'shortdesc' => 'Migrates actions to the DB tables store', |
37 | 37 | 'synopsis' => [ |
38 | 38 | [ |
@@ -63,7 +63,7 @@ discard block |
||
63 | 63 | 'description' => 'Reports on the actions that would have been migrated, but does not change any data', |
64 | 64 | ], |
65 | 65 | ], |
66 | - ] ); |
|
66 | + ]); |
|
67 | 67 | } |
68 | 68 | |
69 | 69 | /** |
@@ -74,31 +74,31 @@ discard block |
||
74 | 74 | * |
75 | 75 | * @return void |
76 | 76 | */ |
77 | - public function migrate( $positional_args, $assoc_args ) { |
|
77 | + public function migrate($positional_args, $assoc_args) { |
|
78 | 78 | $this->init_logging(); |
79 | 79 | |
80 | - $config = $this->get_migration_config( $assoc_args ); |
|
81 | - $runner = new Runner( $config ); |
|
80 | + $config = $this->get_migration_config($assoc_args); |
|
81 | + $runner = new Runner($config); |
|
82 | 82 | $runner->init_destination(); |
83 | 83 | |
84 | - $batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100; |
|
85 | - $free_on = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50; |
|
86 | - $sleep = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0; |
|
87 | - \ActionScheduler_DataController::set_free_ticks( $free_on ); |
|
88 | - \ActionScheduler_DataController::set_sleep_time( $sleep ); |
|
84 | + $batch_size = isset($assoc_args['batch-size']) ? (int) $assoc_args['batch-size'] : 100; |
|
85 | + $free_on = isset($assoc_args['free-memory-on']) ? (int) $assoc_args['free-memory-on'] : 50; |
|
86 | + $sleep = isset($assoc_args['pause']) ? (int) $assoc_args['pause'] : 0; |
|
87 | + \ActionScheduler_DataController::set_free_ticks($free_on); |
|
88 | + \ActionScheduler_DataController::set_sleep_time($sleep); |
|
89 | 89 | |
90 | 90 | do { |
91 | - $actions_processed = $runner->run( $batch_size ); |
|
91 | + $actions_processed = $runner->run($batch_size); |
|
92 | 92 | $this->total_processed += $actions_processed; |
93 | - } while ( $actions_processed > 0 ); |
|
93 | + } while ($actions_processed > 0); |
|
94 | 94 | |
95 | - if ( ! $config->get_dry_run() ) { |
|
95 | + if (!$config->get_dry_run()) { |
|
96 | 96 | // let the scheduler know that there's nothing left to do |
97 | 97 | $scheduler = new Scheduler(); |
98 | 98 | $scheduler->mark_complete(); |
99 | 99 | } |
100 | 100 | |
101 | - WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) ); |
|
101 | + WP_CLI::success(sprintf('%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed)); |
|
102 | 102 | } |
103 | 103 | |
104 | 104 | /** |
@@ -108,13 +108,13 @@ discard block |
||
108 | 108 | * |
109 | 109 | * @return ActionScheduler\Migration\Config |
110 | 110 | */ |
111 | - private function get_migration_config( $args ) { |
|
112 | - $args = wp_parse_args( $args, [ |
|
111 | + private function get_migration_config($args) { |
|
112 | + $args = wp_parse_args($args, [ |
|
113 | 113 | 'dry-run' => false, |
114 | - ] ); |
|
114 | + ]); |
|
115 | 115 | |
116 | 116 | $config = Controller::instance()->get_migration_config_object(); |
117 | - $config->set_dry_run( ! empty( $args[ 'dry-run' ] ) ); |
|
117 | + $config->set_dry_run(!empty($args['dry-run'])); |
|
118 | 118 | |
119 | 119 | return $config; |
120 | 120 | } |
@@ -123,26 +123,26 @@ discard block |
||
123 | 123 | * Hook command line logging into migration actions. |
124 | 124 | */ |
125 | 125 | private function init_logging() { |
126 | - add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) { |
|
127 | - WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) ); |
|
128 | - }, 10, 1 ); |
|
129 | - add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) { |
|
130 | - WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) ); |
|
131 | - }, 10, 1 ); |
|
132 | - add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) { |
|
133 | - WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) ); |
|
134 | - }, 10, 1 ); |
|
135 | - add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) { |
|
136 | - WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) ); |
|
137 | - }, 10, 2 ); |
|
138 | - add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) { |
|
139 | - WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) ); |
|
140 | - }, 10, 2 ); |
|
141 | - add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) { |
|
142 | - WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) ); |
|
143 | - }, 10, 1 ); |
|
144 | - add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) { |
|
145 | - WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) ); |
|
146 | - }, 10, 1 ); |
|
126 | + add_action('action_scheduler/migrate_action_dry_run', function($action_id) { |
|
127 | + WP_CLI::debug(sprintf('Dry-run: migrated action %d', $action_id)); |
|
128 | + }, 10, 1); |
|
129 | + add_action('action_scheduler/no_action_to_migrate', function($action_id) { |
|
130 | + WP_CLI::debug(sprintf('No action found to migrate for ID %d', $action_id)); |
|
131 | + }, 10, 1); |
|
132 | + add_action('action_scheduler/migrate_action_failed', function($action_id) { |
|
133 | + WP_CLI::warning(sprintf('Failed migrating action with ID %d', $action_id)); |
|
134 | + }, 10, 1); |
|
135 | + add_action('action_scheduler/migrate_action_incomplete', function($source_id, $destination_id) { |
|
136 | + WP_CLI::warning(sprintf('Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id)); |
|
137 | + }, 10, 2); |
|
138 | + add_action('action_scheduler/migrated_action', function($source_id, $destination_id) { |
|
139 | + WP_CLI::debug(sprintf('Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id)); |
|
140 | + }, 10, 2); |
|
141 | + add_action('action_scheduler/migration_batch_starting', function($batch) { |
|
142 | + WP_CLI::debug('Beginning migration of batch: ' . print_r($batch, true)); |
|
143 | + }, 10, 1); |
|
144 | + add_action('action_scheduler/migration_batch_complete', function($batch) { |
|
145 | + WP_CLI::log(sprintf('Completed migration of %d actions', count($batch))); |
|
146 | + }, 10, 1); |
|
147 | 147 | } |
148 | 148 | } |