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