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
← All changes | src/Plugin.php +127 -60 3.0.33.2.89 View file →
@@ -10,17 +10,23 @@
10 10 */
11 11 declare (strict_types=1);
12 12 namespace WindPress\WindPress;
13 13
14 -use WindPressPackages\EDD_SL\PluginUpdater;
14 +use EasyDigitalDownloads\Updater\Registry;
15 15 use Exception;
16 16 use WIND_PRESS;
17 -use WP_Upgrader;
17 +use WindPress\WindPress\Abilities\Loader as AbilitiesLoader;
18 18 use WindPress\WindPress\Admin\AdminPage;
19 19 use WindPress\WindPress\Api\Router as ApiRouter;
20 20 use WindPress\WindPress\Core\Runtime;
21 +use WindPress\WindPress\Core\Scanner\SourceRevision;
21 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;
22 27 use WindPress\WindPress\Utils\Notice;
28 +use WP_Upgrader;
23 29 /**
24 30 * Manage the plugin lifecycle and provides a single point of entry to the plugin.
25 31 *
26 32 * @since 3.0.0
@@ -27,12 +33,12 @@
27 33 */
28 34 final class Plugin
29 35 {
30 36 /**
31 - * Easy Digital Downloads Software Licensing integration wrapper.
37 + * Easy Digital Downloads Software Licensing integration manager.
32 38 * Pro version only.
33 39 *
34 - * @var PluginUpdater|null
40 + * @var LicenseManager|null
35 41 */
36 42 public $plugin_updater = null;
37 43 /**
38 44 * Stores the instance, implementing a Singleton pattern.
@@ -65,9 +71,9 @@
65 71 * instance. On the first run, it creates a singleton object and places it
66 72 * into the static property. On subsequent runs, it returns the client existing
67 73 * object stored in the static property.
68 74 */
69 - public static function get_instance() : self
75 + public static function get_instance(): self
70 76 {
71 77 if (!isset(self::$instance)) {
72 78 self::$instance = new self();
73 79 }
@@ -77,82 +83,104 @@
77 83 * Boot the plugin.
78 84 *
79 85 * @link https://codex.wordpress.org/Plugin_API/Action_Reference
80 86 */
81 - public function boot() : void
87 + public function boot(): void
82 88 {
83 - \do_action('a!windpress/plugin:boot.start');
89 + do_action('a!windpress/plugin:boot.start');
90 + SourceRevision::register_hooks();
91 + $this->boot_license_sdk();
84 92 // (de)activation hooks.
85 - \register_activation_hook(WIND_PRESS::FILE, fn() => $this->activate_plugin());
86 - \register_deactivation_hook(WIND_PRESS::FILE, fn() => $this->deactivate_plugin());
93 + register_activation_hook(WIND_PRESS::FILE, fn() => $this->activate_plugin());
94 + register_deactivation_hook(WIND_PRESS::FILE, fn() => $this->deactivate_plugin());
87 95 // upgrade hooks.
88 - \add_action('upgrader_process_complete', function (WP_Upgrader $wpUpgrader, array $options) : void {
96 + add_action('upgrader_process_complete', function (WP_Upgrader $wpUpgrader, array $options): void {
89 97 if ($options['action'] === 'update' && $options['type'] === 'plugin') {
90 98 foreach ($options['plugins'] as $plugin) {
91 - if ($plugin === \plugin_basename(WIND_PRESS::FILE)) {
99 + if ($plugin === plugin_basename(WIND_PRESS::FILE)) {
92 100 $this->upgrade_plugin();
93 101 }
94 102 }
95 103 }
96 104 }, 10, 2);
97 - $this->maybe_update_plugin();
98 - \add_action('plugins_loaded', fn() => $this->plugins_loaded(), 9);
99 - \add_action('init', fn() => $this->init_plugin());
100 - \do_action('a!windpress/plugin:boot.end');
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');
101 108 }
102 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 + /**
103 122 * Handle the plugin's activation by (maybe) running database migrations
104 123 * and initializing the plugin configuration.
105 124 */
106 - private function activate_plugin() : void
125 + private function activate_plugin(): void
107 126 {
108 - \do_action('a!windpress/plugin:activate_plugin.start');
109 - \update_option(WIND_PRESS::WP_OPTION . '_version', WIND_PRESS::VERSION);
110 - $this->maybe_embedded_license();
111 - \do_action('a!windpress/plugin:activate_plugin.end');
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');
112 134 }
113 135 /**
114 136 * Handle plugin's deactivation by (maybe) cleaning up after ourselves.
115 137 */
116 - private function deactivate_plugin() : void
138 + private function deactivate_plugin(): void
117 139 {
118 - \do_action('a!windpress/plugin:deactivate_plugin.start');
119 - \do_action('a!windpress/plugin:deactivate_plugin.end');
140 + do_action('a!windpress/plugin:deactivate_plugin.start');
141 + do_action('a!windpress/plugin:deactivate_plugin.end');
120 142 }
121 143 /**
122 144 * Handle the plugin's upgrade by (maybe) running database migrations.
123 145 */
124 - private function upgrade_plugin() : void
146 + private function upgrade_plugin(): void
125 147 {
126 - \do_action('a!windpress/plugin:upgrade_plugin.start');
127 - \do_action('a!windpress/plugin:upgrade_plugin.end');
148 + do_action('a!windpress/plugin:upgrade_plugin.start');
149 + UpgradeManager::get_instance()->run();
150 + do_action('a!windpress/plugin:upgrade_plugin.end');
128 151 }
129 152 /**
130 153 * Initialize the plugin on WordPress' `init` hook.
131 154 */
132 - private function init_plugin() : void
155 + private function init_plugin(): void
133 156 {
134 - \do_action('a!windpress/plugin:init_plugin.start');
157 + do_action('a!windpress/plugin:init_plugin.start');
135 158 // Load translations.
136 - // load_plugin_textdomain(WIND_PRESS::TEXT_DOMAIN, false, dirname(plugin_basename(WIND_PRESS::FILE)) . '/languages/');
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 + }
137 162 new ApiRouter();
138 163 Runtime::get_instance()->init();
139 164 // Instantiate the AdminPage class.
140 165 new AdminPage();
141 - \do_action('a!windpress/plugin:init_plugin.end');
166 + UtilsCache::exclude_optimization();
167 + // Initialize Abilities API integration
168 + AbilitiesLoader::get_instance()->init();
169 + do_action('a!windpress/plugin:init_plugin.end');
142 170 }
143 171 /**
144 172 * Initialize the plugin on WordPress' `plugins_loaded` hook.
145 173 */
146 - private function plugins_loaded() : void
174 + private function plugins_loaded(): void
147 175 {
148 - \do_action('a!windpress/plugin:plugins_loaded.start');
176 + do_action('a!windpress/plugin:plugins_loaded.start');
149 177 IntegrationLoader::get_instance()->register_integrations();
150 - if (\is_admin()) {
151 - \add_action('admin_notices', static fn() => Notice::admin_notices());
152 - \add_filter('plugin_action_links_' . \plugin_basename(WIND_PRESS::FILE), fn($links) => $this->plugin_action_links($links));
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));
153 181 }
154 - \do_action('a!windpress/plugin:plugins_loaded.end');
182 + do_action('a!windpress/plugin:plugins_loaded.end');
155 183 }
156 184 /**
157 185 * Add plugin action links.
158 186 *
@@ -160,53 +188,92 @@
160 188 * @return array Plugin action links.
161 189 *
162 190 * @todo Add settings link when the settings page is implemented.
163 191 */
164 - private function plugin_action_links(array $links) : array
192 + private function plugin_action_links(array $links): array
165 193 {
166 194 $base_url = AdminPage::get_page_url();
167 - \array_unshift($links, \sprintf('<a href="%s">%s</a>', \esc_url(\sprintf('%s#/settings', $base_url)), \esc_html__('Settings', 'windpress')));
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 + }
168 199 return $links;
169 200 }
170 201 /**
171 - * Initialize the plugin updater.
172 - * Pro version only.
173 - *
174 - * @return PluginUpdater
202 + * Register the plugin with EDD's official Software Licensing SDK.
175 203 */
176 - public function maybe_update_plugin()
204 + private function boot_license_sdk(): void
177 205 {
178 - if (!\class_exists(PluginUpdater::class)) {
179 - return null;
206 + $sdk_path = self::get_license_sdk_path();
207 + if (!is_file($sdk_path)) {
208 + return;
180 209 }
181 - if ($this->plugin_updater instanceof \WindPressPackages\EDD_SL\PluginUpdater) {
182 - return $this->plugin_updater;
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());
183 219 }
184 - $license = \get_option(WIND_PRESS::WP_OPTION . '_license', ['key' => '', 'opt_in_pre_release' => \false]);
185 - $this->plugin_updater = new PluginUpdater(WIND_PRESS::WP_OPTION, ['version' => WIND_PRESS::VERSION, 'license' => $license['key'] ? \trim($license['key']) : \false, 'beta' => $license['opt_in_pre_release'], 'plugin_file' => WIND_PRESS::FILE, 'item_id' => WIND_PRESS::EDD_STORE['item_id'], 'store_url' => WIND_PRESS::EDD_STORE['store_url'], 'author' => WIND_PRESS::EDD_STORE['author']]);
186 - return $this->plugin_updater;
187 220 }
188 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 + /**
189 244 * Check if the plugin distributed with an embedded license and activate the license.
190 245 * Pro version only.
191 246 */
192 - private function maybe_embedded_license() : void
247 + private function maybe_embedded_license(): void
193 248 {
194 - if (!\class_exists(PluginUpdater::class)) {
249 + if (!$this->plugin_updater instanceof LicenseManager) {
195 250 return;
196 251 }
197 - $license_file = \dirname(WIND_PRESS::FILE) . '/license-data.php';
198 - if (!\file_exists($license_file)) {
252 + $license_file = dirname(WIND_PRESS::FILE) . '/license-data.php';
253 + if (!file_exists($license_file)) {
199 254 return;
200 255 }
201 256 require_once $license_file;
202 - $const_name = 'ROSUA_EMBEDDED_LICENSE_KEY_' . WIND_PRESS::EDD_STORE['item_id'];
203 - if (!\defined($const_name)) {
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) {
204 271 return;
205 272 }
206 - $license_key = \constant($const_name);
207 - \update_option(WIND_PRESS::WP_OPTION . '_license', ['key' => $license_key, 'opt_in_pre_release' => \false]);
208 - \wp_delete_file($license_file);
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);
209 276 // activate the license.
210 - $this->maybe_update_plugin()->activate($license_key);
277 + $this->plugin_updater->activate((string) $license_key);
211 278 }
212 279 }