PluginProbe ʕ •ᴥ•ʔ
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization / 1.13.0
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization v1.13.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
207 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/Hosting/SpinupWp",
33 "NitroPack/Integration/Server/LiteSpeed",
34 "NitroPack/Integration/Server/Fastly",
35 "NitroPack/Integration/Server/Cloudflare",
36 "NitroPack/Integration/Server/Sucuri",
37 "NitroPack/Integration/Plugin/NginxHelper",
38 "NitroPack/Integration/Plugin/Cloudflare",
39 "NitroPack/Integration/Plugin/ShortPixel",
40 "NitroPack/Integration/Plugin/WPCacheHelper",
41 "NitroPack/Integration/Plugin/CookieNotice",
42 "NitroPack/Integration/Plugin/BeaverBuilder",
43 "NitroPack/Integration/Plugin/FusionBuilder",
44 "NitroPack/Integration/Plugin/ThriveTheme",
45 "NitroPack/Integration/Plugin/AeliaCurrencySwitcher",
46 "NitroPack/Integration/Plugin/Woocommerce",
47 "NitroPack/Integration/Plugin/WoocommerceCacheHandler",
48 "NitroPack/Integration/Plugin/AdvancedMathCaptcha",
49 "NitroPack/Integration/Plugin/TheEventsCalendar",
50 "NitroPack/Integration/Plugin/WCML",
51 "NitroPack/Integration/Plugin/YoastSEO",
52 "NitroPack/Integration/Plugin/JetPackNP",
53 "NitroPack/Integration/Plugin/SquirrlySEO",
54 "NitroPack/Integration/Plugin/RankMathNP",
55 "NitroPack/Integration/Plugin/WPBakeryNP",
56 //"NitroPack/Integration/Plugin/GravityForms",
57 "NitroPack/Integration/Plugin/Elementor",
58 "NitroPack/Integration/Plugin/WPForms",
59 "NitroPack/Integration/Plugin/GeoTargetingWP",
60 ];
61 private static $loadedModules = [];
62 private static $stage = "very_early";
63 private $siteConfig = [];
64 private $purgeUrls = [];
65 private $fullPurge = false;
66
67 public static function getInstance() {
68 if (!self::$instance) {
69 self::$instance = new Integration();
70 }
71 return self::$instance;
72 }
73
74 public static function onCriticalInit($callback) {
75 if (!did_action(self::CRITICAL_INIT_ACTION)) {
76 add_action(self::CRITICAL_INIT_ACTION, $callback);
77 } else {
78 $callback();
79 }
80 }
81
82 public static function onShutdown($callback) {
83 self::$shutdownCallbacks[] = $callback;
84 }
85
86 public static function initSemAcquire() {
87 self::$criticalInitSemaphore++;
88 }
89
90 public static function initSemRelease() {
91 if (--self::$criticalInitSemaphore < 0) {
92 self::$criticalInitSemaphore = 0;
93 }
94 }
95
96 public function __construct() {
97 $this->siteConfig = nitropack_get_site_config();
98 }
99
100 public function getHosting() {
101 return $this->siteConfig && !empty($this->siteConfig["hosting"]) ? $this->siteConfig["hosting"] : "unknown";
102 }
103
104 public function init() {
105 if (self::$isInitialized) return true;
106
107 add_action( 'nitropack_integration_purge_url', [$this, "logUrlPurge"] );
108 add_action( 'nitropack_integration_purge_all', [$this, "logFullPurge"] );
109 self::onShutdown([$this, 'executeIntegrationPurges']);
110 register_shutdown_function(function() {
111 foreach (self::$shutdownCallbacks as $callback) {
112 $callback();
113 }
114 });
115
116 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
117 self::initSemAcquire();
118 }
119
120 $this->initModules(); // very_early init
121
122 $action = $this->getSetupAction(); // can be muplugins_loaded or plugins_loaded
123 if (did_action($action)) {
124 $this->initModules();
125 } else {
126 add_action($action, [$this, 'initModules']);
127 }
128
129 if (did_action('plugins_loaded')) {
130 $this->lateInitModules();
131 } else {
132 add_action('plugins_loaded', [$this, 'lateInitModules']);
133 }
134
135 self::$isInitialized = true;
136 }
137
138 public function logUrlPurge($url) {
139 $this->purgeUrls[] = $url;
140 }
141
142 public function logFullPurge() {
143 $this->fullPurge = true;
144 }
145
146 public function initModules() {
147 if (!empty(self::$isInitializedStage[self::$stage])) return true;
148
149 foreach (self::$modules as $moduleName) {
150 $module = $this->loadModule($moduleName);
151 if ($module && $module->init(self::$stage)) {
152 // Modules which need to be initialized only once return NULL so they don't end up in this array
153 // This array holds only modules which need to have their init method called for each stage
154 self::$loadedModules[$moduleName] = $module;
155 }
156 }
157
158 self::$isInitializedStage[self::$stage] = true;
159
160 if (self::$criticalInitSemaphore < 1 && !did_action(self::CRITICAL_INIT_ACTION)) {
161 do_action(self::CRITICAL_INIT_ACTION);
162 }
163
164 if (self::$stage == "very_early") {
165 self::$stage = "early";
166 }
167 }
168
169 public function lateInitModules() {
170 self::$stage = "late";
171 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
172 self::initSemRelease();
173 }
174 $this->initModules();
175 }
176
177 public function executeIntegrationPurges() {
178 if ($this->fullPurge) {
179 do_action("nitropack_execute_purge_all");
180 } else {
181 foreach (array_unique($this->purgeUrls) as $url) {
182 do_action("nitropack_execute_purge_url", $url);
183 }
184 }
185 }
186
187 private function loadModule($name) {
188 if (isset(self::$loadedModules[$name])) return self::$loadedModules[$name];
189
190 $class = str_replace("/", "\\", $name);
191 if ($class::STAGE == self::$stage) {
192 $module = new $class();
193 return $module;
194 } else {
195 return NULL;
196 }
197 }
198
199 private function getSetupAction() {
200 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
201 return "plugins_loaded";
202 }
203
204 return "muplugins_loaded";
205 }
206 }
207