PluginProbe
WindPress – Tailwind CSS integration for WordPress / 3.2.89
WindPress – Tailwind CSS integration for WordPress v3.2.89
3.2.89 3.2.88 3.2.87 3.2.86 3.2.85 3.2.84 3.2.83 3.2.82 3.2.81 trunk 3.0.0 3.0.1 3.0.10 3.0.11 3.0.12 3.0.13 3.0.14 3.0.15 3.0.16 3.0.17 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 All 143 releases
windpress / src / Plugin.php

Plugin.php in WindPress – Tailwind CSS integration for WordPress 3.2.89, at src/Plugin.php

280 lines 10.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /*
4 * This file is part of the WindPress package.
5 *
6 * (c) Joshua Gugun Siagian <suabahasa@gmail.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 declare (strict_types=1);
12 namespace WindPress\WindPress;
13
14 use EasyDigitalDownloads\Updater\Registry;
15 use Exception;
16 use WIND_PRESS;
17 use WindPress\WindPress\Abilities\Loader as AbilitiesLoader;
18 use WindPress\WindPress\Admin\AdminPage;
19 use WindPress\WindPress\Api\Router as ApiRouter;
20 use WindPress\WindPress\Core\Runtime;
21 use WindPress\WindPress\Core\Scanner\SourceRevision;
22 use WindPress\WindPress\Integration\Loader as IntegrationLoader;
23 use WindPress\WindPress\Licensing\Manager as LicenseManager;
24 use WindPress\WindPress\Upgrade\UpgradeManager;
25 use WindPress\WindPress\Utils\Cache as UtilsCache;
26 use WindPress\WindPress\Utils\Common;
27 use WindPress\WindPress\Utils\Notice;
28 use WP_Upgrader;
29 /**
30 * Manage the plugin lifecycle and provides a single point of entry to the plugin.
31 *
32 * @since 3.0.0
33 */
34 final class Plugin
35 {
36 /**
37 * Easy Digital Downloads Software Licensing integration manager.
38 * Pro version only.
39 *
40 * @var LicenseManager|null
41 */
42 public $plugin_updater = null;
43 /**
44 * Stores the instance, implementing a Singleton pattern.
45 */
46 private static self $instance;
47 /**
48 * The Singleton's constructor should always be private to prevent direct
49 * construction calls with the `new` operator.
50 */
51 private function __construct()
52 {
53 }
54 /**
55 * Singletons should not be cloneable.
56 */
57 private function __clone()
58 {
59 }
60 /**
61 * Singletons should not be restorable from strings.
62 *
63 * @throws Exception Cannot unserialize a singleton.
64 */
65 public function __wakeup()
66 {
67 throw new Exception('Cannot unserialize a singleton.');
68 }
69 /**
70 * This is the static method that controls the access to the singleton
71 * instance. On the first run, it creates a singleton object and places it
72 * into the static property. On subsequent runs, it returns the client existing
73 * object stored in the static property.
74 */
75 public static function get_instance(): self
76 {
77 if (!isset(self::$instance)) {
78 self::$instance = new self();
79 }
80 return self::$instance;
81 }
82 /**
83 * Boot the plugin.
84 *
85 * @link https://codex.wordpress.org/Plugin_API/Action_Reference
86 */
87 public function boot(): void
88 {
89 do_action('a!windpress/plugin:boot.start');
90 SourceRevision::register_hooks();
91 $this->boot_license_sdk();
92 // (de)activation hooks.
93 register_activation_hook(WIND_PRESS::FILE, fn() => $this->activate_plugin());
94 register_deactivation_hook(WIND_PRESS::FILE, fn() => $this->deactivate_plugin());
95 // upgrade hooks.
96 add_action('upgrader_process_complete', function (WP_Upgrader $wpUpgrader, array $options): void {
97 if ($options['action'] === 'update' && $options['type'] === 'plugin') {
98 foreach ($options['plugins'] as $plugin) {
99 if ($plugin === plugin_basename(WIND_PRESS::FILE)) {
100 $this->upgrade_plugin();
101 }
102 }
103 }
104 }, 10, 2);
105 add_action('plugins_loaded', fn() => $this->plugins_loaded(), 9);
106 add_action('init', fn() => $this->init_plugin());
107 do_action('a!windpress/plugin:boot.end');
108 }
109 /**
110 * Get the initialized license manager.
111 * Pro version only.
112 */
113 public function maybe_update_plugin(): ?LicenseManager
114 {
115 return $this->plugin_updater instanceof LicenseManager ? $this->plugin_updater : null;
116 }
117 public static function is_pro_edition(): bool
118 {
119 return is_file(self::get_license_sdk_path());
120 }
121 /**
122 * Handle the plugin's activation by (maybe) running database migrations
123 * and initializing the plugin configuration.
124 */
125 private function activate_plugin(): void
126 {
127 do_action('a!windpress/plugin:activate_plugin.start');
128 update_option(WIND_PRESS::WP_OPTION . '_version', WIND_PRESS::VERSION);
129 if ($this->plugin_updater instanceof LicenseManager) {
130 $this->maybe_embedded_license();
131 $this->plugin_updater->clear_cache();
132 }
133 do_action('a!windpress/plugin:activate_plugin.end');
134 }
135 /**
136 * Handle plugin's deactivation by (maybe) cleaning up after ourselves.
137 */
138 private function deactivate_plugin(): void
139 {
140 do_action('a!windpress/plugin:deactivate_plugin.start');
141 do_action('a!windpress/plugin:deactivate_plugin.end');
142 }
143 /**
144 * Handle the plugin's upgrade by (maybe) running database migrations.
145 */
146 private function upgrade_plugin(): void
147 {
148 do_action('a!windpress/plugin:upgrade_plugin.start');
149 UpgradeManager::get_instance()->run();
150 do_action('a!windpress/plugin:upgrade_plugin.end');
151 }
152 /**
153 * Initialize the plugin on WordPress' `init` hook.
154 */
155 private function init_plugin(): void
156 {
157 do_action('a!windpress/plugin:init_plugin.start');
158 // Load translations.
159 if (defined('WindPressDeps\WIND_PRESS_LOAD_TEXT_DOMAIN') && constant('WIND_PRESS_LOAD_TEXT_DOMAIN')) {
160 load_plugin_textdomain(WIND_PRESS::TEXT_DOMAIN, \false, dirname(plugin_basename(WIND_PRESS::FILE)) . '/languages/');
161 }
162 new ApiRouter();
163 Runtime::get_instance()->init();
164 // Instantiate the AdminPage class.
165 new AdminPage();
166 UtilsCache::exclude_optimization();
167 // Initialize Abilities API integration
168 AbilitiesLoader::get_instance()->init();
169 do_action('a!windpress/plugin:init_plugin.end');
170 }
171 /**
172 * Initialize the plugin on WordPress' `plugins_loaded` hook.
173 */
174 private function plugins_loaded(): void
175 {
176 do_action('a!windpress/plugin:plugins_loaded.start');
177 IntegrationLoader::get_instance()->register_integrations();
178 if (is_admin()) {
179 add_action('admin_notices', static fn() => Notice::admin_notices());
180 add_filter('plugin_action_links_' . plugin_basename(WIND_PRESS::FILE), fn($links) => $this->plugin_action_links($links));
181 }
182 do_action('a!windpress/plugin:plugins_loaded.end');
183 }
184 /**
185 * Add plugin action links.
186 *
187 * @param array $links Plugin action links.
188 * @return array Plugin action links.
189 *
190 * @todo Add settings link when the settings page is implemented.
191 */
192 private function plugin_action_links(array $links): array
193 {
194 $base_url = AdminPage::get_page_url();
195 array_unshift($links, sprintf('<a href="%s">%s</a>', esc_url(sprintf('%s#/settings', $base_url)), esc_html__('Settings', 'windpress')));
196 if (!Common::is_updater_library_available()) {
197 array_unshift($links, sprintf('<a href="%s" style="color:#067b34;font-weight:600;" target="_blank">%s</a>', esc_url(Common::plugin_data('PluginURI') . '?utm_source=WordPress&utm_campaign=liteplugin&utm_medium=plugin-action-links&utm_content=Upgrade#pricing'), esc_html__('Upgrade to Pro', 'windpress')));
198 }
199 return $links;
200 }
201 /**
202 * Register the plugin with EDD's official Software Licensing SDK.
203 */
204 private function boot_license_sdk(): void
205 {
206 $sdk_path = self::get_license_sdk_path();
207 if (!is_file($sdk_path)) {
208 return;
209 }
210 $this->plugin_updater = new LicenseManager();
211 add_action('init', [$this->plugin_updater, 'boot_updater']);
212 add_action('edd_sl_sdk_registry', function ($registry): void {
213 $this->register_license_integration($registry);
214 });
215 require_once $sdk_path;
216 // Plugin activation can happen after the SDK initialization hooks ran.
217 if (did_action('after_setup_theme') && class_exists(Registry::class)) {
218 $this->register_license_integration(Registry::instance());
219 }
220 }
221 /**
222 * @param mixed $registry
223 */
224 private function register_license_integration($registry): void
225 {
226 if (!$registry instanceof Registry) {
227 return;
228 }
229 if (!$registry->offsetExists(LicenseManager::INTEGRATION_ID)) {
230 $registry->register(LicenseManager::get_integration_args());
231 }
232 $handler = $registry->offsetGet(LicenseManager::INTEGRATION_ID);
233 if (is_object($handler) && method_exists($handler, 'auto_updater')) {
234 // The SDK registry does not pass wp_override or beta through in
235 // version 1.0.3, so Manager boots the official updater directly.
236 remove_action('init', [$handler, 'auto_updater']);
237 }
238 }
239 private static function get_license_sdk_path(): string
240 {
241 return dirname(WIND_PRESS::FILE) . '/vendor/easy-digital-downloads/edd-sl-sdk/edd-sl-sdk.php';
242 }
243 /**
244 * Check if the plugin distributed with an embedded license and activate the license.
245 * Pro version only.
246 */
247 private function maybe_embedded_license(): void
248 {
249 if (!$this->plugin_updater instanceof LicenseManager) {
250 return;
251 }
252 $license_file = dirname(WIND_PRESS::FILE) . '/license-data.php';
253 if (!file_exists($license_file)) {
254 return;
255 }
256 require_once $license_file;
257 $const_names = [
258 'WIND_PRESS_EMBEDDED_LICENSE_KEY_' . WIND_PRESS::EDD_STORE['item_id'],
259 'JOOOSI_EMBEDDED_LICENSE_KEY_' . WIND_PRESS::EDD_STORE['item_id'],
260 // Preserve the embedded-license constant used by previous releases.
261 'ROSUA_EMBEDDED_LICENSE_KEY_' . WIND_PRESS::EDD_STORE['item_id'],
262 ];
263 $const_name = null;
264 foreach ($const_names as $candidate) {
265 if (defined($candidate)) {
266 $const_name = $candidate;
267 break;
268 }
269 }
270 if ($const_name === null) {
271 return;
272 }
273 $license_key = constant($const_name);
274 update_option(WIND_PRESS::WP_OPTION . '_license', ['key' => $license_key, 'opt_in_pre_release' => \false]);
275 wp_delete_file($license_file);
276 // activate the license.
277 $this->plugin_updater->activate((string) $license_key);
278 }
279 }
280