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