PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.0
Independent Analytics – WordPress Analytics Plugin v2.15.0
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 4 days ago Pruning_Scheduler.php 5 months ago
Pruning_Scheduler.php
124 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\Format;
9 use IAWP\Utils\Timezone;
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('now', Timezone::utc_timezone());
39 $scheduled_at->setTimezone(Timezone::site_timezone());
40 $scheduled_at->setTimestamp(\wp_next_scheduled('iawp_prune'));
41 $day = $scheduled_at->format(Format::date());
42 $time = $scheduled_at->format(Format::time());
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(Format::date());
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 private function schedule_pruning(string $cutoff) : void
89 {
90 \wp_unschedule_hook('iawp_prune');
91 if ($cutoff === 'disabled') {
92 return;
93 }
94 $tomorrow = new \DateTime('tomorrow', Timezone::site_timezone());
95 \wp_schedule_event($tomorrow->getTimestamp(), 'daily', 'iawp_prune');
96 }
97 private function convert_cutoff_to_date(string $cutoff, bool $as_site_timezone = \false) : \DateTime
98 {
99 $beginning_of_today = new CarbonImmutable('today', Timezone::site_timezone());
100 if (!$as_site_timezone) {
101 $beginning_of_today = $beginning_of_today->setTimezone(Timezone::utc_timezone());
102 }
103 switch ($cutoff) {
104 case 'thirty-days':
105 return $beginning_of_today->subDays(30)->toDate();
106 case 'sixty-days':
107 return $beginning_of_today->subDays(60)->toDate();
108 case 'ninety-days':
109 return $beginning_of_today->subDays(90)->toDate();
110 case 'one-hundred-and-eighty-days':
111 return $beginning_of_today->subDays(180)->toDate();
112 case 'one-year':
113 return $beginning_of_today->subYearsNoOverflow(1)->toDate();
114 case 'two-years':
115 return $beginning_of_today->subYearsNoOverflow(2)->toDate();
116 case 'three-years':
117 return $beginning_of_today->subYearsNoOverflow(3)->toDate();
118 case 'four-years':
119 return $beginning_of_today->subYearsNoOverflow(4)->toDate();
120 }
121 return $beginning_of_today->toDate();
122 }
123 }
124