PluginProbe
Tiered Pricing Table for WooCommerce / 8.0.2
Tiered Pricing Table for WooCommerce v8.0.2
8.0.2 7.1.7 7.1.5 7.1.4 7.1.1 6.5.0 6.4.0 6.1.0 trunk 1.0 1.1 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.2.0 2.2.1 2.2.2 2.2.3 2.3.0 2.3.1 2.3.2 2.3.3 All 91 releases
← All changes | freemius/includes/fs-core-functions.php +433 -250 2.0 → 8.0.2 View file →
@@ -62,64 +62,72 @@
62 62
63 63 /* Scripts and styles including.
64 64 --------------------------------------------------------------------------------------------*/
65 65
66 - /**
67 - * Generates an absolute URL to the given path. This function ensures that the URL will be correct whether the asset
68 - * is inside a plugin's folder or a theme's folder.
69 - *
70 - * Examples:
71 - * 1. "themes" folder
72 - * Path: C:/xampp/htdocs/fswp/wp-content/themes/twentytwelve/freemius/assets/css/admin/common.css
73 - * URL: http://fswp:8080/wp-content/themes/twentytwelve/freemius/assets/css/admin/common.css
74 - *
75 - * 2. "plugins" folder
76 - * Path: C:/xampp/htdocs/fswp/wp-content/plugins/rating-widget-premium/freemius/assets/css/admin/common.css
77 - * URL: http://fswp:8080/wp-content/plugins/rating-widget-premium/freemius/assets/css/admin/common.css
78 - *
79 - * @author Leo Fajardo (@leorw)
80 - * @since 1.2.2
81 - *
82 - * @param string $asset_abs_path Asset's absolute path.
83 - *
84 - * @return string Asset's URL.
85 - */
86 - function fs_asset_url( $asset_abs_path ) {
87 - $wp_content_dir = fs_normalize_path( WP_CONTENT_DIR );
88 - $asset_abs_path = fs_normalize_path( $asset_abs_path );
66 + if ( ! function_exists( 'fs_asset_url' ) ) {
67 + /**
68 + * Generates an absolute URL to the given path. This function ensures that the URL will be correct whether the asset
69 + * is inside a plugin's folder or a theme's folder.
70 + *
71 + * Examples:
72 + * 1. "themes" folder
73 + * Path: C:/xampp/htdocs/fswp/wp-content/themes/twentytwelve/freemius/assets/css/admin/common.css
74 + * URL: http://fswp:8080/wp-content/themes/twentytwelve/freemius/assets/css/admin/common.css
75 + *
76 + * 2. "plugins" folder
77 + * Path: C:/xampp/htdocs/fswp/wp-content/plugins/rating-widget-premium/freemius/assets/css/admin/common.css
78 + * URL: http://fswp:8080/wp-content/plugins/rating-widget-premium/freemius/assets/css/admin/common.css
79 + *
80 + * @author Leo Fajardo (@leorw)
81 + * @since 1.2.2
82 + *
83 + * @param string $asset_abs_path Asset's absolute path.
84 + *
85 + * @return string Asset's URL.
86 + */
87 + function fs_asset_url( $asset_abs_path ) {
88 + $wp_content_dir = fs_normalize_path( WP_CONTENT_DIR );
89 + $asset_abs_path = fs_normalize_path( $asset_abs_path );
89 90
90 - if ( 0 === strpos( $asset_abs_path, $wp_content_dir ) ) {
91 - // Handle both theme and plugin assets located in the standard directories.
92 - $asset_rel_path = str_replace( $wp_content_dir, '', $asset_abs_path );
93 - $asset_url = content_url( fs_normalize_path( $asset_rel_path ) );
94 - } else {
95 - $wp_plugins_dir = fs_normalize_path( WP_PLUGIN_DIR );
96 - if ( 0 === strpos( $asset_abs_path, $wp_plugins_dir ) ) {
97 - // Try to handle plugin assets that may be located in a non-standard plugins directory.
98 - $asset_rel_path = str_replace( $wp_plugins_dir, '', $asset_abs_path );
99 - $asset_url = plugins_url( fs_normalize_path( $asset_rel_path ) );
91 + if ( 0 === strpos( $asset_abs_path, $wp_content_dir ) ) {
92 + // Handle both theme and plugin assets located in the standard directories.
93 + $asset_rel_path = str_replace( $wp_content_dir, '', $asset_abs_path );
94 + $asset_url = content_url( fs_normalize_path( $asset_rel_path ) );
100 95 } else {
101 - // Try to handle theme assets that may be located in a non-standard themes directory.
102 - $active_theme_stylesheet = get_stylesheet();
103 - $wp_themes_dir = fs_normalize_path( trailingslashit( get_theme_root( $active_theme_stylesheet ) ) );
104 - $asset_rel_path = str_replace( $wp_themes_dir, '', fs_normalize_path( $asset_abs_path ) );
105 - $asset_url = trailingslashit( get_theme_root_uri( $active_theme_stylesheet ) ) . fs_normalize_path( $asset_rel_path );
96 + $wp_plugins_dir = fs_normalize_path( WP_PLUGIN_DIR );
97 + if ( 0 === strpos( $asset_abs_path, $wp_plugins_dir ) ) {
98 + // Try to handle plugin assets that may be located in a non-standard plugins directory.
99 + $asset_rel_path = str_replace( $wp_plugins_dir, '', $asset_abs_path );
100 + $asset_url = plugins_url( fs_normalize_path( $asset_rel_path ) );
101 + } else {
102 + // Try to handle theme assets that may be located in a non-standard themes directory.
103 + $active_theme_stylesheet = get_stylesheet();
104 + $wp_themes_dir = fs_normalize_path( trailingslashit( get_theme_root( $active_theme_stylesheet ) ) );
105 + $asset_rel_path = str_replace( $wp_themes_dir, '', fs_normalize_path( $asset_abs_path ) );
106 + $asset_url = trailingslashit( get_theme_root_uri( $active_theme_stylesheet ) ) . fs_normalize_path( $asset_rel_path );
107 + }
106 108 }
109 +
110 + return $asset_url;
107 111 }
108 -
109 - return $asset_url;
110 112 }
111 113
112 - function fs_enqueue_local_style( $handle, $path, $deps = array(), $ver = false, $media = 'all' ) {
113 - wp_enqueue_style( $handle, fs_asset_url( WP_FS__DIR_CSS . '/' . trim( $path, '/' ) ), $deps, $ver, $media );
114 + if ( ! function_exists( 'fs_enqueue_local_style' ) ) {
115 + function fs_enqueue_local_style( $handle, $path, $deps = array(), $ver = false, $media = 'all' ) {
116 + wp_enqueue_style( $handle, fs_asset_url( WP_FS__DIR_CSS . '/' . trim( $path, '/' ) ), $deps, $ver, $media );
117 + }
114 118 }
115 119
116 - function fs_enqueue_local_script( $handle, $path, $deps = array(), $ver = false, $in_footer = 'all' ) {
117 - wp_enqueue_script( $handle, fs_asset_url( WP_FS__DIR_JS . '/' . trim( $path, '/' ) ), $deps, $ver, $in_footer );
120 + if ( ! function_exists( 'fs_enqueue_local_script' ) ) {
121 + function fs_enqueue_local_script( $handle, $path, $deps = array(), $ver = false, $in_footer = true ) {
122 + wp_enqueue_script( $handle, fs_asset_url( WP_FS__DIR_JS . '/' . trim( $path, '/' ) ), $deps, $ver, $in_footer );
123 + }
118 124 }
119 125
120 - function fs_img_url( $path, $img_dir = WP_FS__DIR_IMG ) {
121 - return ( fs_asset_url( $img_dir . '/' . trim( $path, '/' ) ) );
126 + if ( ! function_exists( 'fs_img_url' ) ) {
127 + function fs_img_url( $path, $img_dir = WP_FS__DIR_IMG ) {
128 + return ( fs_asset_url( $img_dir . '/' . trim( $path, '/' ) ) );
129 + }
122 130 }
123 131
124 132 #--------------------------------------------------------------------------------
125 133 #region Request handlers.
@@ -124,57 +132,141 @@
124 132 #--------------------------------------------------------------------------------
125 133 #region Request handlers.
126 134 #--------------------------------------------------------------------------------
127 135
128 - if ( ! function_exists( 'fs_request_get' ) ) {
136 + if ( ! function_exists( 'fs_request_get_raw' ) ) {
129 137 /**
138 + * A helper function to fetch GET/POST user input with an optional default value when the input is not set.
139 + * This function does not do sanitization. It is up to the caller to properly sanitize and validate the input.
140 + *
141 + * The return of this function is always unslashed.
142 + *
143 + * @since 2.5.10
144 + *
130 145 * @param string $key
131 146 * @param mixed $def
132 - * @param string|bool $type Since 1.2.1.7 - when set to 'get' will look for the value passed via querystring, when
133 - * set to 'post' will look for the value passed via the POST request's body, otherwise,
134 - * will check if the parameter was passed in any of the two.
147 + * @param string|bool $type When set to 'get', it will look for the value passed via query string. When
148 + * set to 'post', it will look for the value passed via the POST request's body. Otherwise,
149 + * it will check if the parameter was passed using any of the mentioned two methods.
135 150 *
136 151 * @return mixed
137 152 */
138 - function fs_request_get( $key, $def = false, $type = false ) {
153 + function fs_request_get_raw( $key, $def = false, $type = false ) {
139 154 if ( is_string( $type ) ) {
140 155 $type = strtolower( $type );
141 156 }
142 157
158 + /**
159 + * Note to WordPress.org reviewers:
160 + * This is a helper function to fetch GET/POST user input with an optional default value when the input is not set. The actual sanitization is done in the scope of the function's usage.
161 + */
143 162 switch ( $type ) {
144 163 case 'post':
164 + // phpcs:ignore WordPress.Security.NonceVerification.Missing
145 165 $value = isset( $_POST[ $key ] ) ? $_POST[ $key ] : $def;
146 166 break;
147 167 case 'get':
168 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended
148 169 $value = isset( $_GET[ $key ] ) ? $_GET[ $key ] : $def;
149 170 break;
150 171 default:
172 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended
151 173 $value = isset( $_REQUEST[ $key ] ) ? $_REQUEST[ $key ] : $def;
152 174 break;
153 175 }
154 176
155 - return $value;
177 + // Don't unslash if the value itself is empty (empty string, null, empty array etc).
178 + return empty( $value ) ? $value : wp_unslash( $value );
156 179 }
157 180 }
158 181
182 + if ( ! function_exists( 'fs_sanitize_input' ) ) {
183 + /**
184 + * Sanitizes input recursively (if an array).
185 + *
186 + * @param mixed $input
187 + *
188 + * @return mixed
189 + * @uses sanitize_text_field()
190 + * @since 2.5.10
191 + */
192 + function fs_sanitize_input( $input ) {
193 + if ( is_array( $input ) ) {
194 + foreach ( $input as $key => $value ) {
195 + $input[ $key ] = fs_sanitize_input( $value );
196 + }
197 + } else {
198 + // Allow empty values to pass through as-is, like `null`, `''`, `0`, `'0'` etc.
199 + $input = empty( $input ) ? $input : sanitize_text_field( $input );
200 + }
201 +
202 + return $input;
203 + }
204 + }
205 +
206 + if ( ! function_exists( 'fs_request_get' ) ) {
207 + /**
208 + * A helper method to fetch GET/POST user input with an optional default value when the input is not set.
209 + *
210 + * @author Vova Feldman (@svovaf)
211 + *
212 + * @note The return value is always sanitized with sanitize_text_field().
213 + *
214 + * @param string $key
215 + * @param mixed $def
216 + * @param string|bool $type Since 1.2.1.7 - when set to 'get' will look for the value passed via querystring, when
217 + * set to 'post' will look for the value passed via the POST request's body, otherwise,
218 + * will check if the parameter was passed in any of the two.
219 + *
220 + *
221 + * @return mixed
222 + */
223 + function fs_request_get( $key, $def = false, $type = false ) {
224 + return fs_sanitize_input( fs_request_get_raw( $key, $def, $type ) );
225 + }
226 + }
227 +
159 228 if ( ! function_exists( 'fs_request_has' ) ) {
160 229 function fs_request_has( $key ) {
230 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended
161 231 return isset( $_REQUEST[ $key ] );
162 232 }
163 233 }
164 234
165 235 if ( ! function_exists( 'fs_request_get_bool' ) ) {
236 + /**
237 + * A helper method to fetch GET/POST user boolean input with an optional default value when the input is not set.
238 + *
239 + * @author Vova Feldman (@svovaf)
240 + *
241 + * @param string $key
242 + * @param bool $def
243 + *
244 + * @return bool|mixed
245 + */
166 246 function fs_request_get_bool( $key, $def = false ) {
167 - if ( ! isset( $_REQUEST[ $key ] ) ) {
247 + $val = fs_request_get( $key, null );
248 +
249 + if ( is_null( $val ) ) {
168 250 return $def;
169 251 }
170 252
171 - if ( 1 == $_REQUEST[ $key ] || 'true' === strtolower( $_REQUEST[ $key ] ) ) {
172 - return true;
173 - }
253 + if ( is_bool( $val ) ) {
254 + return $val;
255 + } else if ( is_numeric( $val ) ) {
256 + if ( 1 == $val ) {
257 + return true;
258 + } else if ( 0 == $val ) {
259 + return false;
260 + }
261 + } else if ( is_string( $val ) ) {
262 + $val = strtolower( $val );
174 263
175 - if ( 0 == $_REQUEST[ $key ] || 'false' === strtolower( $_REQUEST[ $key ] ) ) {
176 - return false;
264 + if ( 'true' === $val ) {
265 + return true;
266 + } else if ( 'false' === $val ) {
267 + return false;
268 + }
177 269 }
178 270
179 271 return $def;
180 272 }
@@ -193,8 +285,9 @@
193 285 }
194 286
195 287 if ( ! function_exists( 'fs_get_action' ) ) {
196 288 function fs_get_action( $action_key = 'action' ) {
289 + // phpcs:disable WordPress.Security.NonceVerification.Recommended
197 290 if ( ! empty( $_REQUEST[ $action_key ] ) && is_string( $_REQUEST[ $action_key ] ) ) {
198 291 return strtolower( $_REQUEST[ $action_key ] );
199 292 }
200 293
@@ -206,8 +299,9 @@
206 299 }
207 300 }
208 301
209 302 return false;
303 + // phpcs:enable WordPress.Security.NonceVerification.Recommended
210 304 }
211 305 }
212 306
213 307 if ( ! function_exists( 'fs_request_is_action' ) ) {
@@ -285,141 +379,194 @@
285 379 }
286 380
287 381 /* Core UI.
288 382 --------------------------------------------------------------------------------------------*/
289 - /**
290 - * @param number $module_id
291 - * @param string $page
292 - * @param string $action
293 - * @param string $title
294 - * @param string $button_class
295 - * @param array $params
296 - * @param bool $is_primary
297 - * @param bool $is_small
298 - * @param string|bool $icon_class Optional class for an icon (since 1.1.7).
299 - * @param string|bool $confirmation Optional confirmation message before submit (since 1.1.7).
300 - * @param string $method Since 1.1.7
301 - *
302 - * @uses fs_ui_get_action_button()
303 - */
304 - function fs_ui_action_button(
305 - $module_id,
306 - $page,
307 - $action,
308 - $title,
309 - $button_class = '',
310 - $params = array(),
311 - $is_primary = true,
312 - $is_small = false,
313 - $icon_class = false,
314 - $confirmation = false,
315 - $method = 'GET'
316 - ) {
317 - echo fs_ui_get_action_button(
383 + if ( ! function_exists( 'fs_ui_action_button' ) ) {
384 + /**
385 + * @param number $module_id
386 + * @param string $page
387 + * @param string $action
388 + * @param string $title
389 + * @param string $button_class
390 + * @param array $params
391 + * @param bool $is_primary
392 + * @param bool $is_small
393 + * @param string|bool $icon_class Optional class for an icon (since 1.1.7).
394 + * @param string|bool $confirmation Optional confirmation message before submit (since 1.1.7).
395 + * @param string $method Since 1.1.7
396 + *
397 + * @uses fs_ui_get_action_button()
398 + */
399 + function fs_ui_action_button(
318 400 $module_id,
319 401 $page,
320 402 $action,
321 403 $title,
322 - $button_class,
323 - $params,
324 - $is_primary,
325 - $is_small,
326 - $icon_class,
327 - $confirmation,
328 - $method
329 - );
330 - }
331 -
332 - /**
333 - * @author Vova Feldman (@svovaf)
334 - * @since 1.1.7
335 - *
336 - * @param number $module_id
337 - * @param string $page
338 - * @param string $action
339 - * @param string $title
340 - * @param string $button_class
341 - * @param array $params
342 - * @param bool $is_primary
343 - * @param bool $is_small
344 - * @param string|bool $icon_class Optional class for an icon.
345 - * @param string|bool $confirmation Optional confirmation message before submit.
346 - * @param string $method
347 - *
348 - * @return string
349 - */
350 - function fs_ui_get_action_button(
351 - $module_id,
352 - $page,
353 - $action,
354 - $title,
355 - $button_class = '',
356 - $params = array(),
357 - $is_primary = true,
358 - $is_small = false,
359 - $icon_class = false,
360 - $confirmation = false,
361 - $method = 'GET'
362 - ) {
363 - // Prepend icon (if set).
364 - $title = ( is_string( $icon_class ) ? '<i class="' . $icon_class . '"></i> ' : '' ) . $title;
365 -
366 - if ( is_string( $confirmation ) ) {
367 - return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="if (confirm(\'%s\')) this.parentNode.submit(); return false;">%s</a></form>',
368 - freemius( $module_id )->_get_admin_page_url( $page, $params ),
369 - $method,
404 + $button_class = '',
405 + $params = array(),
406 + $is_primary = true,
407 + $is_small = false,
408 + $icon_class = false,
409 + $confirmation = false,
410 + $method = 'GET'
411 + ) {
412 + echo fs_ui_get_action_button(
413 + $module_id,
414 + $page,
370 415 $action,
371 - wp_nonce_field( $action, '_wpnonce', true, false ),
372 - 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ),
416 + $title,
417 + $button_class,
418 + $params,
419 + $is_primary,
420 + $is_small,
421 + $icon_class,
373 422 $confirmation,
374 - $title
423 + $method
375 424 );
376 - } else if ( 'GET' !== strtoupper( $method ) ) {
377 - return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="this.parentNode.submit(); return false;">%s</a></form>',
378 - freemius( $module_id )->_get_admin_page_url( $page, $params ),
379 - $method,
380 - $action,
381 - wp_nonce_field( $action, '_wpnonce', true, false ),
382 - 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ),
383 - $title
384 - );
385 - } else {
386 - return sprintf( '<a href="%s" class="%s">%s</a></form>',
387 - wp_nonce_url( freemius( $module_id )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ),
388 - 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ),
389 - $title
390 - );
391 425 }
392 426 }
393 427
394 - function fs_ui_action_link( $module_id, $page, $action, $title, $params = array() ) {
395 - ?><a class=""
396 - href="<?php echo wp_nonce_url( freemius( $module_id )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ) ?>"><?php echo $title ?></a><?php
428 + if ( ! function_exists( 'fs_ui_get_action_button' ) ) {
429 + /**
430 + * @author Vova Feldman (@svovaf)
431 + * @since 1.1.7
432 + *
433 + * @param number $module_id
434 + * @param string $page
435 + * @param string $action
436 + * @param string $title
437 + * @param string $button_class
438 + * @param array $params
439 + * @param bool $is_primary
440 + * @param bool $is_small
441 + * @param string|bool $icon_class Optional class for an icon.
442 + * @param string|bool $confirmation Optional confirmation message before submit.
443 + * @param string $method
444 + *
445 + * @return string
446 + */
447 + function fs_ui_get_action_button(
448 + $module_id,
449 + $page,
450 + $action,
451 + $title,
452 + $button_class = '',
453 + $params = array(),
454 + $is_primary = true,
455 + $is_small = false,
456 + $icon_class = false,
457 + $confirmation = false,
458 + $method = 'GET'
459 + ) {
460 + // Prepend icon (if set).
461 + $title = ( is_string( $icon_class ) ? '<i class="' . $icon_class . '"></i> ' : '' ) . $title;
462 +
463 + if ( is_string( $confirmation ) ) {
464 + return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="if (confirm(\'%s\')) this.parentNode.submit(); return false;">%s</a></form>',
465 + freemius( $module_id )->_get_admin_page_url( $page, $params ),
466 + $method,
467 + $action,
468 + wp_nonce_field( $action, '_wpnonce', true, false ),
469 + 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ),
470 + $confirmation,
471 + $title
472 + );
473 + } else if ( 'GET' !== strtoupper( $method ) ) {
474 + return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="this.parentNode.submit(); return false;">%s</a></form>',
475 + freemius( $module_id )->_get_admin_page_url( $page, $params ),
476 + $method,
477 + $action,
478 + wp_nonce_field( $action, '_wpnonce', true, false ),
479 + 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ),
480 + $title
481 + );
482 + } else {
483 + return sprintf( '<a href="%s" class="%s">%s</a></form>',
484 + wp_nonce_url( freemius( $module_id )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ),
485 + 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ),
486 + $title
487 + );
488 + }
489 + }
490 +
491 + function fs_ui_action_link( $module_id, $page, $action, $title, $params = array() ) {
492 + ?><a class=""
493 + href="<?php echo wp_nonce_url( freemius( $module_id )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ) ?>"><?php echo $title ?></a><?php
494 + }
397 495 }
398 496
399 - /*function fs_error_handler($errno, $errstr, $errfile, $errline)
400 - {
401 - if (false === strpos($errfile, 'freemius/'))
402 - {
403 - // @todo Dump Freemius errors to local log.
497 + if ( ! function_exists( 'fs_get_entity' ) ) {
498 + /**
499 + * @author Leo Fajardo (@leorw)
500 + * @since 2.3.1
501 + *
502 + * @param mixed $entity
503 + * @param string $class
504 + *
505 + * @return FS_Plugin|FS_User|FS_Site|FS_Plugin_License|FS_Plugin_Plan|FS_Plugin_Tag|FS_Subscription
506 + */
507 + function fs_get_entity( $entity, $class ) {
508 + if ( ! is_object( $entity ) || $entity instanceof $class ) {
509 + return $entity;
510 + }
511 +
512 + return new $class( $entity );
404 513 }
514 + }
405 515
406 -// switch ($errno) {
407 -// case E_USER_ERROR:
408 -// break;
409 -// case E_WARNING:
410 -// case E_USER_WARNING:
411 -// break;
412 -// case E_NOTICE:
413 -// case E_USER_NOTICE:
414 -// break;
415 -// default:
416 -// break;
417 -// }
516 + if ( ! function_exists( 'fs_get_entities' ) ) {
517 + /**
518 + * @author Leo Fajardo (@leorw)
519 + * @since 2.3.1
520 + *
521 + * @param mixed $entities
522 + * @param string $class_name
523 + *
524 + * @return FS_Plugin[]|FS_User[]|FS_Site[]|FS_Plugin_License[]|FS_Plugin_Plan[]|FS_Plugin_Tag[]|FS_Subscription[]
525 + */
526 + function fs_get_entities( $entities, $class_name ) {
527 + if ( ! is_array( $entities ) || empty( $entities ) ) {
528 + return $entities;
529 + }
530 +
531 + // Get first element.
532 + $first_array_element = reset( $entities );
533 +
534 + if ( $first_array_element instanceof $class_name ) {
535 + /**
536 + * If the first element of the array is an instance of the context class, assume that all other
537 + * elements are instances of the class.
538 + */
539 + return $entities;
540 + }
541 +
542 + if (
543 + is_array( $first_array_element ) &&
544 + ! empty( $first_array_element )
545 + ) {
546 + $first_array_element = reset( $first_array_element );
547 +
548 + if ( $first_array_element instanceof $class_name ) {
549 + /**
550 + * If the first element of the `$entities` array is an array whose first element is an instance of the
551 + * context class, assume that all other objects are instances of the class.
552 + */
553 + return $entities;
554 + }
555 + }
556 +
557 + foreach ( $entities as $key => $entities_or_entity ) {
558 + if ( is_array( $entities_or_entity ) ) {
559 + $entities[ $key ] = fs_get_entities( $entities_or_entity, $class_name );
560 + } else {
561 + $entities[ $key ] = fs_get_entity( $entities_or_entity, $class_name );
562 + }
563 + }
564 +
565 + return $entities;
566 + }
418 567 }
419 568
420 - set_error_handler('fs_error_handler');*/
421 -
422 569 if ( ! function_exists( 'fs_nonce_url' ) ) {
423 570 /**
424 571 * Retrieve URL with nonce added to URL query.
425 572 *
@@ -440,8 +587,35 @@
440 587 return add_query_arg( $name, wp_create_nonce( $action ), $actionurl );
441 588 }
442 589 }
443 590
591 + if ( ! function_exists( 'fs_parse_url_params' ) ) {
592 + /**
593 + * Returns the query parameters of the given URL if there are any.
594 + *
595 + * @param string $url
596 + * @param bool $html_entity_decode
597 + *
598 + * @return array<string, string> Key value pair where key represents the parameter name and value represents the parameter value.
599 + */
600 + function fs_parse_url_params( $url, $html_entity_decode = false ) {
601 + $query_str = parse_url( $url, PHP_URL_QUERY );
602 + $url_params = array();
603 +
604 + if ( empty( $query_str ) ) {
605 + return $url_params;
606 + }
607 +
608 + if ( $html_entity_decode ) {
609 + $query_str = html_entity_decode( $query_str );
610 + }
611 +
612 + parse_str( $query_str, $url_params );
613 +
614 + return $url_params;
615 + }
616 + }
617 +
444 618 if ( ! function_exists( 'fs_starts_with' ) ) {
445 619 /**
446 620 * Check if string starts with.
447 621 *
@@ -604,73 +778,77 @@
604 778 }
605 779
606 780 #endregion Url Canonization ------------------------------------------------------------------
607 781
608 - /**
609 - * @author Vova Feldman (@svovaf)
610 - *
611 - * @since 1.2.2 Changed to usage of WP_Filesystem_Direct.
612 - *
613 - * @param string $from URL
614 - * @param string $to File path.
615 - *
616 - * @return bool Is successfully downloaded.
617 - */
618 - function fs_download_image( $from, $to ) {
619 - $dir = dirname( $to );
782 + if ( ! function_exists( 'fs_download_image' ) ) {
783 + /**
784 + * @author Vova Feldman (@svovaf)
785 + *
786 + * @since 1.2.2 Changed to usage of WP_Filesystem_Direct.
787 + *
788 + * @param string $from URL
789 + * @param string $to File path.
790 + *
791 + * @return bool Is successfully downloaded.
792 + */
793 + function fs_download_image( $from, $to ) {
794 + $dir = dirname( $to );
620 795
621 - if ( 'direct' !== get_filesystem_method( array(), $dir ) ) {
622 - return false;
623 - }
796 + if ( 'direct' !== get_filesystem_method( array(), $dir ) ) {
797 + return false;
798 + }
624 799
625 - if ( ! class_exists( 'WP_Filesystem_Direct' ) ) {
626 - require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
627 - require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
628 - }
800 + if ( ! class_exists( 'WP_Filesystem_Direct' ) ) {
801 + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
802 + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
803 + }
629 804
630 - $fs = new WP_Filesystem_Direct( '' );
631 - $tmpfile = download_url( $from );
805 + $fs = new WP_Filesystem_Direct( '' );
806 + $tmpfile = download_url( $from );
632 807
633 - if ( $tmpfile instanceof WP_Error ) {
634 - // Issue downloading the file.
635 - return false;
636 - }
808 + if ( $tmpfile instanceof WP_Error ) {
809 + // Issue downloading the file.
810 + return false;
811 + }
637 812
638 - $fs->copy( $tmpfile, $to );
639 - $fs->delete( $tmpfile );
813 + $fs->copy( $tmpfile, $to );
814 + $fs->delete( $tmpfile );
640 815
641 - return true;
816 + return true;
817 + }
642 818 }
643 819
644 820 /* General Utilities
645 821 --------------------------------------------------------------------------------------------*/
646 822
647 - /**
648 - * Sorts an array by the value of the priority key.
649 - *
650 - * @author Daniel Iser (@danieliser)
651 - * @since 1.1.7
652 - *
653 - * @param $a
654 - * @param $b
655 - *
656 - * @return int
657 - */
658 - function fs_sort_by_priority( $a, $b ) {
823 + if ( ! function_exists( 'fs_sort_by_priority' ) ) {
824 + /**
825 + * Sorts an array by the value of the priority key.
826 + *
827 + * @author Daniel Iser (@danieliser)
828 + * @since 1.1.7
829 + *
830 + * @param $a
831 + * @param $b
832 + *
833 + * @return int
834 + */
835 + function fs_sort_by_priority( $a, $b ) {
659 836
660 - // If b has a priority and a does not, b wins.
661 - if ( ! isset( $a['priority'] ) && isset( $b['priority'] ) ) {
662 - return 1;
663 - } // If b has a priority and a does not, b wins.
664 - elseif ( isset( $a['priority'] ) && ! isset( $b['priority'] ) ) {
665 - return - 1;
666 - } // If neither has a priority or both priorities are equal its a tie.
667 - elseif ( ( ! isset( $a['priority'] ) && ! isset( $b['priority'] ) ) || $a['priority'] === $b['priority'] ) {
668 - return 0;
837 + // If b has a priority and a does not, b wins.
838 + if ( ! isset( $a['priority'] ) && isset( $b['priority'] ) ) {
839 + return 1;
840 + } // If b has a priority and a does not, b wins.
841 + elseif ( isset( $a['priority'] ) && ! isset( $b['priority'] ) ) {
842 + return - 1;
843 + } // If neither has a priority or both priorities are equal it's a tie.
844 + elseif ( ( ! isset( $a['priority'] ) && ! isset( $b['priority'] ) ) || $a['priority'] === $b['priority'] ) {
845 + return 0;
846 + }
847 +
848 + // If both have priority return the winner.
849 + return ( $a['priority'] < $b['priority'] ) ? - 1 : 1;
669 850 }
670 -
671 - // If both have priority return the winner.
672 - return ( $a['priority'] < $b['priority'] ) ? - 1 : 1;
673 851 }
674 852
675 853 #--------------------------------------------------------------------------------
676 854 #region Localization
@@ -675,8 +853,14 @@
675 853 #--------------------------------------------------------------------------------
676 854 #region Localization
677 855 #--------------------------------------------------------------------------------
678 856
857 + global $fs_text_overrides;
858 +
859 + if ( ! isset( $fs_text_overrides ) ) {
860 + $fs_text_overrides = array();
861 + }
862 +
679 863 if ( ! function_exists( 'fs_text' ) ) {
680 864 /**
681 865 * Retrieve a translated text by key.
682 866 *
@@ -687,14 +871,12 @@
687 871 * @param string $slug
688 872 *
689 873 * @return string
690 874 *
691 - * @global $fs_text , $fs_text_overrides
875 + * @global $fs_text_overrides
692 876 */
693 877 function fs_text( $key, $slug = 'freemius' ) {
694 - global $fs_text,
695 - $fs_module_info_text,
696 - $fs_text_overrides;
878 + global $fs_text_overrides;
697 879
698 880 if ( isset( $fs_text_overrides[ $slug ] ) ) {
699 881 if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) {
700 882 return $fs_text_overrides[ $slug ][ $key ];
@@ -705,24 +887,8 @@
705 887 return $fs_text_overrides[ $slug ][ $lower_key ];
706 888 }
707 889 }
708 890
709 - if ( ! isset( $fs_text ) ) {
710 - $dir = defined( 'WP_FS__DIR_INCLUDES' ) ?
711 - WP_FS__DIR_INCLUDES :
712 - dirname( __FILE__ );
713 -
714 - require_once $dir . '/i18n.php';
715 - }
716 -
717 - if ( isset( $fs_text[ $key ] ) ) {
718 - return $fs_text[ $key ];
719 - }
720 -
721 - if ( isset( $fs_module_info_text[ $key ] ) ) {
722 - return $fs_module_info_text[ $key ];
723 - }
724 -
725 891 return $key;
726 892 }
727 893
728 894 #region Private
@@ -1064,9 +1230,9 @@
1064 1230 * @param string $context Context information for the translators.
1065 1231 * @param string $key String key for overrides.
1066 1232 * @param string $slug Module slug for overrides.
1067 1233 *
1068 - * @return string
1234 + * @return void
1069 1235 */
1070 1236 function fs_esc_js_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) {
1071 1237 echo esc_js( _fs_text_x_inline( $text, $context, $key, $slug ) );
1072 1238 }
@@ -1254,9 +1420,9 @@
1254 1420 */
1255 1421 function fs_is_plugin_uninstall() {
1256 1422 return (
1257 1423 defined( 'WP_UNINSTALL_PLUGIN' ) ||
1258 - ( 0 < did_action( 'update_option_uninstall_plugins' ) )
1424 + ( 0 < did_action( 'pre_uninstall_plugin' ) )
1259 1425 );
1260 1426 }
1261 1427 }
1262 1428
@@ -1318,5 +1484,22 @@
1318 1484 array( "fs_{$tag}_{$module_unique_affix}" ),
1319 1485 array_slice( $args, 2 ) )
1320 1486 );
1321 1487 }
1322 - }
1488 + }
1489 +
1490 + if ( ! function_exists( 'fs_get_optional_constant' ) ) {
1491 + /**
1492 + * Gets the value of an optional constant. If the constant is not defined, the default value will be returned.
1493 + *
1494 + * @author Swashata Ghosh (@swashata)
1495 + * @since 2.5.12.5
1496 + *
1497 + * @param string $constant_name
1498 + * @param mixed $default_value
1499 + *
1500 + * @return mixed
1501 + */
1502 + function fs_get_optional_constant( $constant_name, $default_value = null ) {
1503 + return defined( $constant_name ) ? constant( $constant_name ) : $default_value;
1504 + }
1505 + }