PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.12.2
Independent Analytics – WordPress Analytics Plugin v2.12.2
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Data_Pruning / Pruning_Scheduler.php
independent-analytics / IAWP / Data_Pruning Last commit date
Pruner.php 1 year ago Pruning_Scheduler.php 1 year ago
Pruning_Scheduler.php
131 lines
1 <?php
2
3 namespace IAWP\Data_Pruning;
4
5 use IAWPSCOPED\Carbon\CarbonImmutable;
6 use IAWP\Illuminate_Builder;
7 use IAWP\Query;
8 use IAWP\Utils\Timezone;
9 use IAWP\Utils\WordPress_Site_Date_Format_Pattern;
10 /** @internal */
11 class Pruning_Scheduler
12 {
13 public static $cutoff_options = [['disabled', 'Keep data forever'], ['thirty-days', 'Keep data for 30 days'], ['sixty-days', 'Keep data for 60 days'], ['ninety-days', 'Keep data for 90 days'], ['one-hundred-and-eighty-days', 'Keep data for 180 days'], ['one-year', 'Keep data for 1 year'], ['two-years', 'Keep data for 2 years'], ['three-years', 'Keep data for 3 years'], ['four-years', 'Keep data for 4 years']];
14 public function cutoff_options() : array
15 {
16 return self::$cutoff_options;
17 }
18 public function is_enabled() : bool
19 {
20 return \get_option('iawp_pruning_cutoff', 'disabled') !== 'disabled';
21 }
22 public function get_pruning_cutoff() : string
23 {
24 return \get_option('iawp_pruning_cutoff', 'disabled');
25 }
26 public function get_pruning_cutoff_as_datetime() : ?\DateTime
27 {
28 if (!$this->is_enabled()) {
29 return null;
30 }
31 return $this->convert_cutoff_to_date($this->get_pruning_cutoff());
32 }
33 public function status_message() : ?string
34 {
35 if (!$this->is_enabled()) {
36 return null;
37 }
38 $scheduled_at = new \DateTime();
39 $scheduled_at->setTimezone(Timezone::site_timezone());
40 $scheduled_at->setTimestamp(\wp_next_scheduled('iawp_prune'));
41 $day = $scheduled_at->format(\get_option('date_format'));
42 $time = $scheduled_at->format(\IAWPSCOPED\iawp()->get_option('time_format', 'g:i a'));
43 return \sprintf(\__('Next data pruning scheduled for %s at %s.', 'independent-analytics'), '<span>' . $day . '</span>', '<span>' . $time . '</span>');
44 }
45 public function get_pruning_description(string $cutoff) : string
46 {
47 $date = $this->convert_cutoff_to_date($cutoff, \true);
48 $utc_date = $this->convert_cutoff_to_date($cutoff);
49 $formatted_date = $date->format(WordPress_Site_Date_Format_Pattern::for_php());
50 $estimates = $this->get_pruning_estimates($utc_date);
51 return \sprintf(\__("All data from before %1\$s will be deleted immediately. This will remove %2\$s of your %3\$s tracked sessions. \n\n This process will repeat daily at midnight.", 'independent-analytics'), $formatted_date, \number_format_i18n($estimates['sessions_to_be_deleted']), \number_format_i18n($estimates['sessions']));
52 }
53 /**
54 * @return array{sessions: int, sessions_to_be_deleted: int}
55 */
56 public function get_pruning_estimates(\DateTime $cutoff_date) : array
57 {
58 $sessions_table = Query::get_table_name(Query::SESSIONS);
59 $sessions = Illuminate_Builder::new()->from($sessions_table)->selectRaw('COUNT(*) as sessions')->value('sessions');
60 $sessions_to_be_deleted = Illuminate_Builder::new()->from($sessions_table)->selectRaw('COUNT(*) as sessions')->where('created_at', '<', $cutoff_date)->value('sessions');
61 return ['sessions' => $sessions, 'sessions_to_be_deleted' => $sessions_to_be_deleted];
62 }
63 public function update_pruning_cutoff(string $cutoff) : bool
64 {
65 $is_valid_cutoff = \false;
66 foreach (self::$cutoff_options as $option) {
67 if ($option[0] === $cutoff) {
68 $is_valid_cutoff = \true;
69 }
70 }
71 if (!$is_valid_cutoff) {
72 return \false;
73 }
74 \update_option('iawp_pruning_cutoff', $cutoff, \true);
75 $this->schedule_pruning($cutoff);
76 return \true;
77 }
78 /**
79 * Attempt to schedule pruning based on whatever existing cutoff option is saved
80 *
81 * @return void
82 */
83 public function schedule() : void
84 {
85 $cutoff = \get_option('iawp_pruning_cutoff', '');
86 $this->update_pruning_cutoff($cutoff);
87 }
88 public function unschedule() : void
89 {
90 $scheduled_at_timestamp = \wp_next_scheduled('iawp_prune');
91 if (\is_int($scheduled_at_timestamp)) {
92 \wp_unschedule_event($scheduled_at_timestamp, 'iawp_prune');
93 }
94 }
95 private function schedule_pruning(string $cutoff) : void
96 {
97 $this->unschedule();
98 if ($cutoff === 'disabled') {
99 return;
100 }
101 $tomorrow = new \DateTime('tomorrow', Timezone::site_timezone());
102 \wp_schedule_event($tomorrow->getTimestamp(), 'daily', 'iawp_prune');
103 }
104 private function convert_cutoff_to_date(string $cutoff, bool $as_site_timezone = \false) : \DateTime
105 {
106 $beginning_of_today = new CarbonImmutable('today', Timezone::site_timezone());
107 if (!$as_site_timezone) {
108 $beginning_of_today = $beginning_of_today->setTimezone(Timezone::utc_timezone());
109 }
110 switch ($cutoff) {
111 case 'thirty-days':
112 return $beginning_of_today->subDays(30)->toDate();
113 case 'sixty-days':
114 return $beginning_of_today->subDays(60)->toDate();
115 case 'ninety-days':
116 return $beginning_of_today->subDays(90)->toDate();
117 case 'one-hundred-and-eighty-days':
118 return $beginning_of_today->subDays(180)->toDate();
119 case 'one-year':
120 return $beginning_of_today->subYearsNoOverflow(1)->toDate();
121 case 'two-years':
122 return $beginning_of_today->subYearsNoOverflow(2)->toDate();
123 case 'three-years':
124 return $beginning_of_today->subYearsNoOverflow(3)->toDate();
125 case 'four-years':
126 return $beginning_of_today->subYearsNoOverflow(4)->toDate();
127 }
128 return $beginning_of_today->toDate();
129 }
130 }
131