PluginProbe ʕ •ᴥ•ʔ
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization / 1.11.0
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization v1.11.0
1.19.8 1.19.7 1.19.6 1.19.5 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.12.0 1.13.0 1.14.0 1.15.0 1.15.1 1.15.2 1.15.3 1.16.0 1.16.1 1.16.2 1.16.3 1.16.4 1.16.5 1.16.6 1.16.7 1.16.8 1.17.0 1.17.6 1.17.7 1.17.8 1.17.9 1.18.0 1.18.1 1.18.2 1.18.3 1.18.4 1.18.5 1.18.6 1.18.7 1.18.8 1.18.9 1.19.0 1.19.1 1.19.2 1.19.3 1.19.4 1.3.19 1.3.20 1.4.0 1.4.1 1.5.0 1.5.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.16 1.5.17 1.5.18 1.5.19 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.7.0 1.7.1 1.8.0 1.8.1 1.8.3 1.9.0 1.9.1 1.9.2
nitropack / classes / Integration.php
nitropack / classes Last commit date
Integration 2 years ago WordPress 2 years ago Integration.php 2 years ago PluginStateHandler.php 3 years ago
Integration.php
206 lines
1 <?php
2
3 namespace NitroPack;
4
5 class Integration {
6 const CRITICAL_INIT_ACTION = "nitropack_integration_critical_init";
7 public static $criticalInitSemaphore = 0;
8
9 private static $instance = NULL;
10 private static $purgeAllPending = false;
11 private static $purgeUrlPending = [];
12 private static $isInitialized = false;
13 private static $isInitializedStage = [];
14 private static $shutdownCallbacks = [];
15 private static $modules = [
16 "NitroPack/Integration/Hosting/Cloudways",
17 "NitroPack/Integration/Hosting/Flywheel",
18 "NitroPack/Integration/Hosting/WPEngine",
19 "NitroPack/Integration/Hosting/SiteGround",
20 "NitroPack/Integration/Hosting/GoDaddyWPaaS",
21 "NitroPack/Integration/Hosting/Kinsta",
22 "NitroPack/Integration/Hosting/Pagely",
23 "NitroPack/Integration/Hosting/Vimexx",
24 "NitroPack/Integration/Hosting/Pressable",
25 "NitroPack/Integration/Hosting/RocketNet",
26 "NitroPack/Integration/Hosting/Savvii",
27 "NitroPack/Integration/Hosting/DreamHost",
28 "NitroPack/Integration/Hosting/WPX",
29 "NitroPack/Integration/Hosting/WPmudev",
30 "NitroPack/Integration/Hosting/Raidboxes",
31 "NitroPack/Integration/Hosting/Pantheon",
32 "NitroPack/Integration/Server/LiteSpeed",
33 "NitroPack/Integration/Server/Fastly",
34 "NitroPack/Integration/Server/Cloudflare",
35 "NitroPack/Integration/Server/Sucuri",
36 "NitroPack/Integration/Plugin/NginxHelper",
37 "NitroPack/Integration/Plugin/Cloudflare",
38 "NitroPack/Integration/Plugin/ShortPixel",
39 "NitroPack/Integration/Plugin/WPCacheHelper",
40 "NitroPack/Integration/Plugin/CookieNotice",
41 "NitroPack/Integration/Plugin/BeaverBuilder",
42 "NitroPack/Integration/Plugin/FusionBuilder",
43 "NitroPack/Integration/Plugin/ThriveTheme",
44 "NitroPack/Integration/Plugin/AeliaCurrencySwitcher",
45 "NitroPack/Integration/Plugin/Woocommerce",
46 "NitroPack/Integration/Plugin/WoocommerceCacheHandler",
47 "NitroPack/Integration/Plugin/AdvancedMathCaptcha",
48 "NitroPack/Integration/Plugin/TheEventsCalendar",
49 "NitroPack/Integration/Plugin/WCML",
50 "NitroPack/Integration/Plugin/YoastSEO",
51 "NitroPack/Integration/Plugin/JetPackNP",
52 "NitroPack/Integration/Plugin/SquirrlySEO",
53 "NitroPack/Integration/Plugin/RankMathNP",
54 "NitroPack/Integration/Plugin/WPBakeryNP",
55 //"NitroPack/Integration/Plugin/GravityForms",
56 "NitroPack/Integration/Plugin/Elementor",
57 "NitroPack/Integration/Plugin/WPForms",
58 "NitroPack/Integration/Plugin/GeoTargetingWP",
59 ];
60 private static $loadedModules = [];
61 private static $stage = "very_early";
62 private $siteConfig = [];
63 private $purgeUrls = [];
64 private $fullPurge = false;
65
66 public static function getInstance() {
67 if (!self::$instance) {
68 self::$instance = new Integration();
69 }
70 return self::$instance;
71 }
72
73 public static function onCriticalInit($callback) {
74 if (!did_action(self::CRITICAL_INIT_ACTION)) {
75 add_action(self::CRITICAL_INIT_ACTION, $callback);
76 } else {
77 $callback();
78 }
79 }
80
81 public static function onShutdown($callback) {
82 self::$shutdownCallbacks[] = $callback;
83 }
84
85 public static function initSemAcquire() {
86 self::$criticalInitSemaphore++;
87 }
88
89 public static function initSemRelease() {
90 if (--self::$criticalInitSemaphore < 0) {
91 self::$criticalInitSemaphore = 0;
92 }
93 }
94
95 public function __construct() {
96 $this->siteConfig = nitropack_get_site_config();
97 }
98
99 public function getHosting() {
100 return $this->siteConfig && !empty($this->siteConfig["hosting"]) ? $this->siteConfig["hosting"] : "unknown";
101 }
102
103 public function init() {
104 if (self::$isInitialized) return true;
105
106 add_action( 'nitropack_integration_purge_url', [$this, "logUrlPurge"] );
107 add_action( 'nitropack_integration_purge_all', [$this, "logFullPurge"] );
108 self::onShutdown([$this, 'executeIntegrationPurges']);
109 register_shutdown_function(function() {
110 foreach (self::$shutdownCallbacks as $callback) {
111 $callback();
112 }
113 });
114
115 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
116 self::initSemAcquire();
117 }
118
119 $this->initModules(); // very_early init
120
121 $action = $this->getSetupAction(); // can be muplugins_loaded or plugins_loaded
122 if (did_action($action)) {
123 $this->initModules();
124 } else {
125 add_action($action, [$this, 'initModules']);
126 }
127
128 if (did_action('plugins_loaded')) {
129 $this->lateInitModules();
130 } else {
131 add_action('plugins_loaded', [$this, 'lateInitModules']);
132 }
133
134 self::$isInitialized = true;
135 }
136
137 public function logUrlPurge($url) {
138 $this->purgeUrls[] = $url;
139 }
140
141 public function logFullPurge() {
142 $this->fullPurge = true;
143 }
144
145 public function initModules() {
146 if (!empty(self::$isInitializedStage[self::$stage])) return true;
147
148 foreach (self::$modules as $moduleName) {
149 $module = $this->loadModule($moduleName);
150 if ($module && $module->init(self::$stage)) {
151 // Modules which need to be initialized only once return NULL so they don't end up in this array
152 // This array holds only modules which need to have their init method called for each stage
153 self::$loadedModules[$moduleName] = $module;
154 }
155 }
156
157 self::$isInitializedStage[self::$stage] = true;
158
159 if (self::$criticalInitSemaphore < 1 && !did_action(self::CRITICAL_INIT_ACTION)) {
160 do_action(self::CRITICAL_INIT_ACTION);
161 }
162
163 if (self::$stage == "very_early") {
164 self::$stage = "early";
165 }
166 }
167
168 public function lateInitModules() {
169 self::$stage = "late";
170 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
171 self::initSemRelease();
172 }
173 $this->initModules();
174 }
175
176 public function executeIntegrationPurges() {
177 if ($this->fullPurge) {
178 do_action("nitropack_execute_purge_all");
179 } else {
180 foreach (array_unique($this->purgeUrls) as $url) {
181 do_action("nitropack_execute_purge_url", $url);
182 }
183 }
184 }
185
186 private function loadModule($name) {
187 if (isset(self::$loadedModules[$name])) return self::$loadedModules[$name];
188
189 $class = str_replace("/", "\\", $name);
190 if ($class::STAGE == self::$stage) {
191 $module = new $class();
192 return $module;
193 } else {
194 return NULL;
195 }
196 }
197
198 private function getSetupAction() {
199 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
200 return "plugins_loaded";
201 }
202
203 return "muplugins_loaded";
204 }
205 }
206