PluginProbe ʕ •ᴥ•ʔ
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization / 1.5.5
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization v1.5.5
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 4 years ago Integration.php 4 years ago
Integration.php
146 lines
1 <?php
2
3 namespace NitroPack;
4
5 class Integration {
6 private static $instance = NULL;
7 private static $purgeAllPending = false;
8 private static $purgeUrlPending = [];
9 private static $isInitialized = false;
10 private static $isInitializedStage = [];
11 private static $modules = [
12 "NitroPack/Integration/Hosting/Cloudways",
13 "NitroPack/Integration/Hosting/Flywheel",
14 "NitroPack/Integration/Hosting/WPEngine",
15 "NitroPack/Integration/Hosting/SiteGround",
16 "NitroPack/Integration/Hosting/GoDaddyWPaaS",
17 "NitroPack/Integration/Hosting/Kinsta",
18 "NitroPack/Integration/Hosting/Pagely",
19 "NitroPack/Integration/Server/LiteSpeed",
20 "NitroPack/Integration/Server/Fastly",
21 "NitroPack/Integration/Server/Cloudflare",
22 "NitroPack/Integration/Plugin/NginxHelper",
23 "NitroPack/Integration/Plugin/Cloudflare",
24 "NitroPack/Integration/Plugin/ShortPixel",
25 "NitroPack/Integration/Plugin/WPCacheHelper",
26 "NitroPack/Integration/Plugin/CookieNotice",
27 "NitroPack/Integration/Plugin/BeaverBuilder"
28 ];
29 private static $loadedModules = [];
30 private static $stage = "very_early";
31 private $siteConfig = [];
32 private $purgeUrls = [];
33 private $fullPurge = false;
34
35 public static function getInstance() {
36 if (!self::$instance) {
37 self::$instance = new Integration();
38 }
39 return self::$instance;
40 }
41
42 public function __construct() {
43 $this->siteConfig = nitropack_get_site_config();
44 }
45
46 public function getHosting() {
47 return $this->siteConfig && !empty($this->siteConfig["hosting"]) ? $this->siteConfig["hosting"] : "unknown";
48 }
49
50 public function init() {
51 if (self::$isInitialized) return true;
52
53 add_action( 'nitropack_integration_purge_url', [$this, "logUrlPurge"] );
54 add_action( 'nitropack_integration_purge_all', [$this, "logFullPurge"] );
55 add_action( 'shutdown', [$this, 'executeIntegrationPurges'], -999 );
56
57 $this->initModules(); // very_early init
58
59 $action = $this->getSetupAction();
60 if (did_action($action)) {
61 $this->initModules();
62 } else {
63 add_action($action, [$this, 'initModules']);
64 }
65
66 self::$isInitialized = true;
67 }
68
69 public function logUrlPurge($url) {
70 $this->purgeUrls[] = $url;
71 }
72
73 public function logFullPurge() {
74 $this->fullPurge = true;
75 }
76
77 public function initModules() {
78 if (!empty(self::$isInitializedStage[self::$stage])) return true;
79
80 foreach (self::$modules as $moduleName) {
81 $module = $this->loadModule($moduleName);
82 if ($module && $module->init(self::$stage)) {
83 // Modules which need to be initialized only once return NULL so they don't end up in this array
84 // This array holds only modules which need to have their init method called for each stage
85 self::$loadedModules[$moduleName] = $module;
86 }
87 }
88
89 self::$isInitializedStage[self::$stage] = true;
90
91 if (self::$stage == "very_early") {
92 self::$stage = "early";
93 } else if (self::$stage == "early") {
94 if ($this->siteConfig && empty($this->siteConfig["isLateIntegrationInitRequired"])) {
95 do_action(NITROPACK_INTEGRATIONS_ACTION);
96 }
97
98 // This is needed in order to load non-cache-related integrations like the one with ShortPixel and WooCommerce Geo Location.
99 if (did_action('plugins_loaded')) {
100 $this->lateInitModules();
101 } else {
102 add_action('plugins_loaded', [$this, 'lateInitModules']);
103 }
104 } else {
105 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
106 do_action(NITROPACK_INTEGRATIONS_ACTION);
107 }
108 }
109 }
110
111 public function lateInitModules() {
112 self::$stage = "late";
113 $this->initModules();
114 }
115
116 public function executeIntegrationPurges() {
117 if ($this->fullPurge) {
118 do_action("nitropack_execute_purge_all");
119 } else {
120 foreach (array_unique($this->purgeUrls) as $url) {
121 do_action("nitropack_execute_purge_url", $url);
122 }
123 }
124 }
125
126 private function loadModule($name) {
127 if (isset(self::$loadedModules[$name])) return self::$loadedModules[$name];
128
129 $class = str_replace("/", "\\", $name);
130 if ($class::STAGE == self::$stage) {
131 $module = new $class();
132 return $module;
133 } else {
134 return NULL;
135 }
136 }
137
138 private function getSetupAction() {
139 if ($this->siteConfig && !empty($this->siteConfig["isLateIntegrationInitRequired"])) {
140 return "plugins_loaded";
141 }
142
143 return "muplugins_loaded";
144 }
145 }
146