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