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/Utils/Common.php +191 -27 3.0.153.2.89 View file →
@@ -10,11 +10,11 @@
10 10 */
11 11 declare (strict_types=1);
12 12 namespace WindPress\WindPress\Utils;
13 13
14 -use WindPressDeps\EDD_SL\PluginUpdater;
15 14 use Exception;
16 15 use WIND_PRESS;
16 +use WindPress\WindPress\Plugin;
17 17 /**
18 18 * Common utility functions for the plugin.
19 19 *
20 20 * @since 3.0.0
@@ -25,27 +25,27 @@
25 25 * Check the type of the current request.
26 26 *
27 27 * @param string $type The type of the request. Available values: `admin`, `ajax`, `frontend`, `rest`, `cron`.
28 28 */
29 - public static function is_request(string $type) : bool
29 + public static function is_request(string $type): bool
30 30 {
31 31 switch ($type) {
32 32 case 'admin':
33 - return \is_admin();
33 + return is_admin();
34 34 case 'ajax':
35 - return \wp_doing_ajax();
35 + return wp_doing_ajax();
36 36 case 'rest':
37 - return \defined('REST_REQUEST') && \REST_REQUEST;
37 + return defined('REST_REQUEST') && \REST_REQUEST;
38 38 case 'cron':
39 - return \wp_doing_cron();
39 + return wp_doing_cron();
40 40 case 'json':
41 - return \wp_is_json_request();
41 + return wp_is_json_request();
42 42 case 'xmlrpc':
43 - return \defined('XMLRPC_REQUEST') && \XMLRPC_REQUEST;
43 + return defined('XMLRPC_REQUEST') && \XMLRPC_REQUEST;
44 44 case 'xml':
45 - return \wp_is_xml_request();
45 + return wp_is_xml_request();
46 46 case 'frontend':
47 - return (!\is_admin() || \wp_doing_ajax()) && !\wp_doing_cron();
47 + return (!is_admin() || wp_doing_ajax()) && !wp_doing_cron();
48 48 default:
49 49 return \false;
50 50 }
51 51 }
@@ -56,23 +56,28 @@
56 56 * @return mixed
57 57 */
58 58 public static function plugin_data(?string $key = null)
59 59 {
60 - if (!\function_exists('get_plugin_data')) {
60 + if (!function_exists('get_plugin_data')) {
61 61 require_once \ABSPATH . 'wp-admin/includes/plugin.php';
62 62 }
63 - $plugin_data = \wp_cache_get('plugin_data', WIND_PRESS::WP_OPTION);
63 + $plugin_data = wp_cache_get('plugin_data', WIND_PRESS::WP_OPTION);
64 64 if (!$plugin_data) {
65 - $plugin_data = \get_plugin_data(WIND_PRESS::FILE);
66 - \wp_cache_set('plugin_data', $plugin_data, WIND_PRESS::WP_OPTION);
65 + $plugin_data = get_plugin_data(WIND_PRESS::FILE);
66 + wp_cache_set('plugin_data', $plugin_data, WIND_PRESS::WP_OPTION);
67 67 }
68 68 return $key ? $plugin_data[$key] : $plugin_data;
69 69 }
70 - public static function is_updater_library_available() : bool
70 + public static function is_updater_library_available(): bool
71 71 {
72 - return \class_exists(PluginUpdater::class);
72 + if (method_exists(Plugin::class, 'is_pro_edition')) {
73 + return Plugin::is_pro_edition();
74 + }
75 + // WordPress can run the old Plugin class against the newly installed files during an upgrade.
76 + $plugin_directory = dirname(WIND_PRESS::FILE);
77 + return is_file($plugin_directory . '/vendor/easy-digital-downloads/edd-sl-sdk/edd-sl-sdk.php') || is_file($plugin_directory . '/vendor/rosua/edd-sl-plugin-updater/src/PluginUpdater.php');
73 78 }
74 - public static function random_slug(int $length = 21) : string
79 + public static function random_slug(int $length = 21): string
75 80 {
76 81 return (new \WindPressDeps\Hidehalo\Nanoid\Client())->generateId($length, \WindPressDeps\Hidehalo\Nanoid\Client::MODE_DYNAMIC);
77 82 }
78 83 /**
@@ -82,16 +87,16 @@
82 87 * @param bool $safe Whether to use wp_safe_redirect() or not.
83 88 */
84 89 public static function redirect(string $location, bool $safe = \false, int $status = 302, string $x_redirect_by = 'WordPress')
85 90 {
86 - if (!\headers_sent()) {
91 + if (!headers_sent()) {
87 92 if ($safe) {
88 - \wp_safe_redirect($location, $status, $x_redirect_by);
93 + wp_safe_redirect($location, $status, $x_redirect_by);
89 94 } else {
90 - \wp_redirect($location, $status, $x_redirect_by);
95 + wp_redirect($location, $status, $x_redirect_by);
91 96 }
92 97 } else {
93 - echo '<meta http-equiv="refresh" content="0;url=' . \esc_url($location) . '">';
98 + echo '<meta http-equiv="refresh" content="0;url=' . esc_url($location) . '">';
94 99 }
95 100 exit;
96 101 }
97 102 /**
@@ -101,20 +106,20 @@
101 106 * @param string $file_path The file path.
102 107 * @param int $flags The flags to pass to the file_put_contents() function.
103 108 * @throws Exception
104 109 */
105 - public static function save_file($content, string $file_path, int $flags = 0) : void
110 + public static function save_file($content, string $file_path, int $flags = 0): void
106 111 {
107 112 /**
108 113 * @var \WP_Filesystem_Base $wp_filesystem
109 114 */
110 115 global $wp_filesystem;
111 - if (!\file_exists($file_path)) {
112 - \wp_mkdir_p(\dirname($file_path));
116 + if (!file_exists($file_path)) {
117 + wp_mkdir_p(dirname($file_path));
113 118 }
114 119 if (!$wp_filesystem) {
115 120 require_once \ABSPATH . 'wp-admin/includes/file.php';
116 - \WP_Filesystem();
121 + WP_Filesystem();
117 122 }
118 123 $result = $wp_filesystem->put_contents($file_path, $content, $flags);
119 124 if ($result === \false) {
120 125 throw new Exception('Failed to save to file.', 500);
@@ -135,9 +140,9 @@
135 140 * Default false.
136 141 * @param string|false $type Type of resource. 'f' for file, 'd' for directory.
137 142 * Default false.
138 143 */
139 - public static function delete_file($file_path, $recursive = \false, $type = \false) : void
144 + public static function delete_file($file_path, $recursive = \false, $type = \false): void
140 145 {
141 146 /**
142 147 * @var \WP_Filesystem_Base $wp_filesystem
143 148 */
@@ -143,12 +148,171 @@
143 148 */
144 149 global $wp_filesystem;
145 150 if (!$wp_filesystem) {
146 151 require_once \ABSPATH . 'wp-admin/includes/file.php';
147 - \WP_Filesystem();
152 + WP_Filesystem();
148 153 }
149 154 $result = $wp_filesystem->delete($file_path, $recursive, $type);
150 155 if ($result === \false) {
151 156 throw new Exception('Failed to delete the file.', 500);
152 157 }
158 + }
159 + /**
160 + * Get all installed plugins
161 + *
162 + * @return array Array of installed plugins
163 + */
164 + public static function get_all_plugins()
165 + {
166 + require_once \ABSPATH . 'wp-admin/includes/plugin.php';
167 + return get_plugins();
168 + }
169 + /**
170 + * Check if a plugin is installed by name or slug
171 + * Supports wildcard patterns (e.g., "GreenShift*") and regex patterns (e.g., "/^GreenShift/i")
172 + *
173 + * @param string|array $plugin_name The name, slug, or array of aliases of the plugin to check. Can be:
174 + * - Exact match: "GreenShift" or "greenshift/greenshift.php"
175 + * - Wildcard: "GreenShift*" or "greenshift/*"
176 + * - Regex: "/^GreenShift/i" or "/^greenshift\//i"
177 + * - Array: ['GreenShift', 'greenshift/*', '/^GreenShift/i']
178 + * @return bool True if the plugin is installed, false otherwise
179 + */
180 + public static function is_plugin_installed($plugin_name)
181 + {
182 + // Handle array input - check if any alias matches
183 + if (is_array($plugin_name)) {
184 + foreach ($plugin_name as $alias) {
185 + if (self::is_plugin_installed($alias)) {
186 + return \true;
187 + }
188 + }
189 + return \false;
190 + }
191 + $all_plugins = self::get_all_plugins();
192 + // Check if it's a regex pattern (starts and ends with /)
193 + $is_regex = preg_match('/^\/.*\/[imsxeADSUXJu]*$/', $plugin_name);
194 + if ($is_regex) {
195 + // Use regex pattern directly - check both name and slug
196 + foreach ($all_plugins as $plugin_path => $plugin_data) {
197 + if (preg_match($plugin_name, $plugin_data['Name']) || preg_match($plugin_name, $plugin_path)) {
198 + return \true;
199 + }
200 + }
201 + } else {
202 + // Check if contains wildcards (* or ?)
203 + $has_wildcards = strpos($plugin_name, '*') !== \false || strpos($plugin_name, '?') !== \false;
204 + if ($has_wildcards) {
205 + // Convert wildcard pattern to regex
206 + // First replace wildcards with placeholders, then escape, then convert placeholders to regex
207 + $pattern = str_replace(['*', '?'], ['__WILDCARD_ASTERISK__', '__WILDCARD_QUESTION__'], $plugin_name);
208 + $pattern = preg_quote($pattern, '/');
209 + $pattern = str_replace(['__WILDCARD_ASTERISK__', '__WILDCARD_QUESTION__'], ['.*', '.'], $pattern);
210 + $pattern = '/^' . $pattern . '$/i';
211 + foreach ($all_plugins as $plugin_path => $plugin_data) {
212 + if (preg_match($pattern, $plugin_data['Name']) || preg_match($pattern, $plugin_path)) {
213 + return \true;
214 + }
215 + }
216 + } else {
217 + // Exact match - check both name and slug
218 + foreach ($all_plugins as $plugin_path => $plugin_data) {
219 + if ($plugin_data['Name'] == $plugin_name || $plugin_path == $plugin_name) {
220 + return \true;
221 + }
222 + }
223 + }
224 + }
225 + return \false;
226 + }
227 + /**
228 + * Check if a plugin is active by name or slug
229 + * Supports wildcard patterns (e.g., "GreenShift*") and regex patterns (e.g., "/^GreenShift/i")
230 + *
231 + * @param string|array $plugin_name The name, slug, or array of aliases of the plugin to check. Can be:
232 + * - Exact match: "GreenShift" or "greenshift/greenshift.php"
233 + * - Wildcard: "GreenShift*" or "greenshift/*"
234 + * - Regex: "/^GreenShift/i" or "/^greenshift\//i"
235 + * - Array: ['GreenShift', 'greenshift/*', '/^GreenShift/i']
236 + * @return bool True if the plugin is active, false otherwise
237 + */
238 + public static function is_plugin_active_by_name($plugin_name)
239 + {
240 + // Handle array input - check if any alias matches
241 + if (is_array($plugin_name)) {
242 + foreach ($plugin_name as $alias) {
243 + if (self::is_plugin_active_by_name($alias)) {
244 + return \true;
245 + }
246 + }
247 + return \false;
248 + }
249 + $all_plugins = self::get_all_plugins();
250 + // Check if it's a regex pattern (starts and ends with /)
251 + $is_regex = preg_match('/^\/.*\/[imsxeADSUXJu]*$/', $plugin_name);
252 + if ($is_regex) {
253 + // Use regex pattern directly - check both name and slug
254 + foreach ($all_plugins as $plugin_path => $plugin_data) {
255 + if ((preg_match($plugin_name, $plugin_data['Name']) || preg_match($plugin_name, $plugin_path)) && is_plugin_active($plugin_path)) {
256 + return \true;
257 + }
258 + }
259 + } else {
260 + // Check if contains wildcards (* or ?)
261 + $has_wildcards = strpos($plugin_name, '*') !== \false || strpos($plugin_name, '?') !== \false;
262 + if ($has_wildcards) {
263 + // Convert wildcard pattern to regex
264 + // First replace wildcards with placeholders, then escape, then convert placeholders to regex
265 + $pattern = str_replace(['*', '?'], ['__WILDCARD_ASTERISK__', '__WILDCARD_QUESTION__'], $plugin_name);
266 + $pattern = preg_quote($pattern, '/');
267 + $pattern = str_replace(['__WILDCARD_ASTERISK__', '__WILDCARD_QUESTION__'], ['.*', '.'], $pattern);
268 + $pattern = '/^' . $pattern . '$/i';
269 + foreach ($all_plugins as $plugin_path => $plugin_data) {
270 + if ((preg_match($pattern, $plugin_data['Name']) || preg_match($pattern, $plugin_path)) && is_plugin_active($plugin_path)) {
271 + return \true;
272 + }
273 + }
274 + } else {
275 + // Exact match - check both name and slug
276 + foreach ($all_plugins as $plugin_path => $plugin_data) {
277 + if (($plugin_data['Name'] == $plugin_name || $plugin_path == $plugin_name) && is_plugin_active($plugin_path)) {
278 + return \true;
279 + }
280 + }
281 + }
282 + }
283 + return \false;
284 + }
285 + /**
286 + * Check if a theme is installed by name
287 + *
288 + * @param string $theme_name The name of the theme to check
289 + * @return bool True if the theme is installed, false otherwise
290 + */
291 + public static function is_theme_installed($theme_name)
292 + {
293 + $all_themes = wp_get_themes();
294 + foreach ($all_themes as $theme) {
295 + if ($theme->get('Name') == $theme_name) {
296 + return \true;
297 + }
298 + }
299 + return \false;
300 + }
301 + /**
302 + * Check if a theme is active by name
303 + *
304 + * @param string $theme_name The name of the theme or parent theme to check
305 + * @return bool True if the theme is active, false otherwise
306 + */
307 + public static function is_theme_active_by_name($theme_name)
308 + {
309 + $current_theme = wp_get_theme();
310 + if ($current_theme->get('Name') == $theme_name) {
311 + return \true;
312 + }
313 + if ($current_theme->parent() && $current_theme->parent()->get('Name') == $theme_name) {
314 + return \true;
315 + }
316 + return \false;
153 317 }
154 318 }