PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.25
Advanced Ads – Ad Manager & AdSense v2.0.25
2.0.25 2.0.24 2.0.23 2.0.22 2.0.21 1.38.0 1.39.0 1.39.1 1.39.2 1.39.3 1.39.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.40.0 1.40.1 1.40.2 1.41.0 1.42.0 1.42.1 1.42.2 1.43.0 1.44.0 1.44.1 1.45.0 1.45.1 1.46.0 1.47.0 1.47.1 1.47.2 1.47.3 1.47.4 1.47.5 1.48.0 1.48.1 1.49.0 1.5.0 1.5.0.1 1.5.1 1.5.2 1.5.2.1 1.5.4 1.5.4.1 1.5.5 1.50.0 1.51.0 1.51.1 1.51.2 1.51.3 1.52.0 1.52.1 1.52.2 1.52.3 1.52.4 1.53.0 1.53.1 1.53.2 1.54.0 1.54.1 1.55.0 1.56.0 1.56.1 1.56.2 1.56.3 1.56.4 1.6 1.6.1 1.6.10 1.6.10.1 1.6.10.2 1.6.11 1.6.11.1 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.17.1 1.6.17.2 1.6.2 1.6.2.1 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.6 1.6.6.1 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.6.8.3 1.6.9 1.6.9.1 1.6.9.2 1.6.9.3 1.6.9.4 1.7 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.1.1 1.7.1.2 1.7.1.3 1.7.1.4 1.7.1.5 1.7.10 trunk 1.7.11 1.0.1 1.7.12 1.0.2 1.7.13 1.0.3 1.7.14 1.1.0 1.7.15 1.1.1 1.7.16 1.1.2 1.7.17 1.1.3 1.7.18 1.10 1.7.19 1.10.1 1.7.2 1.10.10 1.7.2.1 1.10.11 1.7.20 1.10.12 1.7.21 1.10.2 1.7.22 1.10.3 1.7.23 1.10.4 1.7.24 1.10.5 1.7.25 1.10.6 1.7.3 1.10.7 1.7.4 1.10.8 1.7.4.1 1.10.9 1.7.4.2 1.11 1.7.4.3 1.11.1 1.7.4.4 1.11.2 1.7.4.5 1.12 1.7.5 1.13 1.7.5.1 1.13.1 1.7.6 1.13.2 1.7.7 1.13.3 1.7.8 1.13.4 1.7.9 1.13.5 1.7.9.1 1.13.6 1.7.9.2 1.13.7 1.7.9.3 1.13.8 1.8 1.14 1.8.1 1.14.1 1.8.10 1.14.10 1.8.11 1.14.11 1.8.12 1.14.2 1.8.13 1.14.3 1.8.14 1.14.4 1.8.15 1.14.5 1.8.16 1.14.6 1.8.17 1.14.7 1.8.18 1.14.8 1.8.19 1.14.9 1.8.2 1.15 1.8.20 1.16 1.8.21 1.16.1 1.8.22 1.17 1.8.23 1.17.1 1.8.24 1.17.10 1.8.25 1.17.10-rc.1 1.8.26 1.17.11 1.8.27 1.17.12 1.8.28 1.17.12-rc.1 1.8.29 1.17.2 1.8.3 1.17.3 1.8.30 1.17.4 1.8.4 1.17.5 1.8.5 1.17.6 1.8.6 1.17.7 1.8.7 1.17.8 1.8.8 1.17.9 1.8.9 1.17.9-beta.1 1.9 1.18.0 2.0.0 1.19.0 2.0.1 1.19.1 2.0.10 1.2 2.0.11 1.2.1 2.0.12 1.2.2 2.0.13 1.2.3 2.0.14 1.2.4 2.0.15 1.2.5 2.0.16 1.2.6 2.0.17 1.2.7 2.0.18 1.20.0 2.0.19 1.20.0-rc.1 2.0.2 1.20.0-rc.2 2.0.20 1.20.1 2.0.3 1.20.2 2.0.4 1.20.3 2.0.5 1.21.0 2.0.6 1.21.1 2.0.7 1.22.0 2.0.8 1.22.1 2.0.9 1.22.2 1.23.0 1.23.1 1.23.2 1.24.0 1.24.1 1.24.2 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.29.0 1.29.1 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.30.0 1.30.1 1.30.2 1.30.2-rc.1 1.30.3 1.30.4 1.30.4-rc.1 1.30.5 1.31.0 1.31.1 1.32.0 1.32.0-rc.1 1.33.0 1.33.1 1.33.2 1.34.0 1.35.0 1.35.1 1.36.0 1.36.1 1.36.2 1.36.3 1.37.0 1.37.1 1.37.2
advanced-ads / includes / crons / class-licenses.php
advanced-ads / includes / crons Last commit date
class-ads.php 1 week ago class-licenses.php 2 days ago
class-licenses.php
139 lines
1 <?php
2 /**
3 * License expiry crons via Action Scheduler.
4 *
5 * @package AdvancedAds
6 */
7
8 namespace AdvancedAds\Crons;
9
10 use AdvancedAds\Constants;
11 use AdvancedAds\Framework\Interfaces\Integration_Interface;
12 use AdvancedAds\License\License;
13 use AdvancedAds\License\License_Utils;
14
15 defined( 'ABSPATH' ) || exit;
16
17 /**
18 * Schedules and runs license expiry crons.
19 */
20 class Licenses implements Integration_Interface {
21
22 /**
23 * Register Action Scheduler callbacks for license expiry cron hooks.
24 *
25 * @return void
26 */
27 public function hooks(): void {
28 foreach ( array_keys( Constants::LICENSE_EXPIRY_CRONS ) as $hook ) {
29 add_action( $hook, [ $this, 'run_license_expiry' ], 10, 1 );
30 }
31 }
32
33 /**
34 * Unschedule all license validate and expiry actions (plugin deactivation).
35 *
36 * @return void
37 */
38 public static function unschedule_all(): void {
39 if ( ! function_exists( 'as_unschedule_all_actions' ) ) {
40 return;
41 }
42
43 as_unschedule_all_actions( Constants::CRON_JOB_LICENSE_VALIDATE, [], Constants::CRON_GROUP_ADVANCED_ADS );
44
45 foreach ( array_keys( Constants::LICENSE_EXPIRY_CRONS ) as $hook ) {
46 as_unschedule_all_actions( $hook, null, Constants::CRON_GROUP_ADVANCED_ADS );
47 }
48 }
49
50 /**
51 * Schedule one-time expiry actions for each stored license key.
52 *
53 * Creates up to three pending jobs per license (one month, ten days, grace)
54 * when their scheduled run times are still in the future. Existing jobs for
55 * the same hook, key, and group are replaced.
56 *
57 * @param array<int, array<string, mixed>> $rich Rich license list; loads from storage when empty.
58 *
59 * @return void
60 */
61 public static function schedule_license_expiry( array $rich = [] ): void {
62 if ( ! function_exists( 'as_schedule_single_action' ) || ! function_exists( 'as_unschedule_all_actions' ) ) {
63 return;
64 }
65
66 if ( [] === $rich ) {
67 if ( ! License::has_stored_licenses() ) {
68 return;
69 }
70 $rich = License::get_licenses();
71 }
72
73 $now = time();
74
75 foreach ( License::normalize_list( $rich ) as $row ) {
76 $key = trim( (string) ( $row['licenseKey'] ?? '' ) );
77 if ( '' === $key ) {
78 continue;
79 }
80
81 $ts = License_Utils::license_expiry_timestamps( $row );
82 $args = [ $key ];
83
84 foreach ( Constants::LICENSE_EXPIRY_CRONS as $hook => $level ) {
85 as_unschedule_all_actions( $hook, $args, Constants::CRON_GROUP_ADVANCED_ADS );
86 $t = $ts[ $level ] ?? 0;
87 if ( $t > $now ) {
88 as_schedule_single_action( $t, $hook, $args, Constants::CRON_GROUP_ADVANCED_ADS );
89 }
90 }
91 }
92 }
93
94 /**
95 * Run a scheduled license expiry action for one license key.
96 *
97 * Refreshes the license from the shop, then either sets an admin notice flag
98 * (one month / ten days) or syncs local expiry state after the grace period.
99 *
100 * @param string $license_key License key (Action Scheduler passes indexed args).
101 *
102 * @return void
103 */
104 public function run_license_expiry( string $license_key ): void {
105 $key = trim( $license_key );
106 $level = Constants::LICENSE_EXPIRY_CRONS[ current_action() ] ?? null;
107
108 if ( '' === $key || null === $level ) {
109 return;
110 }
111
112 $rich = License::get_licenses();
113 if ( null === License_Utils::get_rich_license_row_by_key( $rich, $key ) ) {
114 return;
115 }
116
117 $rich = License::sync_persisted_license_from_shop( $key );
118 $row = License_Utils::get_rich_license_row_by_key( $rich, $key );
119 if ( null === $row ) {
120 return;
121 }
122
123 if ( 'grace' === $level ) {
124 if ( ! License_Utils::license_expiry_is_future( $row ) ) {
125 License::sync_local_expiry( $rich, $key );
126 }
127
128 return;
129 }
130
131 if (
132 License_Utils::license_expiry_is_future( $row )
133 && License_Utils::is_license_expiring_soon( $row )
134 ) {
135 License_Utils::set_expiry_notice_flag( $key, $level );
136 }
137 }
138 }
139