PluginProbe
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs / 5.0.1
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs v5.0.1
5.0.1 4.1.0 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.1.2 2.5.0 2.5.3 All 39 releases
← All changes | freemius/includes/fs-essential-functions.php +217 -279 1.2.2 → 5.0.1 View file →
@@ -9,8 +9,11 @@
9 9 * @copyright Copyright (c) 2015, Freemius, Inc.
10 10 * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
11 11 * @since 1.1.5
12 12 */
13 + if ( ! defined( 'ABSPATH' ) ) {
14 + exit;
15 + }
13 16
14 17 if ( ! function_exists( 'fs_normalize_path' ) ) {
15 18 if ( function_exists( 'wp_normalize_path' ) ) {
16 19 /**
@@ -148,90 +151,14 @@
148 151 }
149 152
150 153 #endregion Core Redirect (copied from BuddyPress) -----------------------------------------
151 154
152 - if ( ! function_exists( '__fs' ) ) {
153 - global $fs_text_overrides;
154 -
155 - if ( ! isset( $fs_text_overrides ) ) {
156 - $fs_text_overrides = array();
157 - }
158 -
155 + if ( ! function_exists( 'fs_get_ip' ) ) {
159 156 /**
160 - * Retrieve a translated text by key.
161 - *
162 - * @deprecated Use `fs_text()` instead since methods starting with `__` trigger warnings in Php 7.
163 - * @todo Remove this method in the future.
164 - *
165 - * @author Vova Feldman (@svovaf)
166 - * @since 1.1.4
167 - *
168 - * @param string $key
169 - * @param string $slug
170 - *
171 - * @return string
172 - *
173 - * @global $fs_text, $fs_text_overrides
174 - */
175 - function __fs( $key, $slug = 'freemius' ) {
176 - _deprecated_function( __FUNCTION__, '2.0.0', 'fs_text()' );
177 -
178 - global $fs_text,
179 - $fs_module_info_text,
180 - $fs_text_overrides;
181 -
182 - if ( isset( $fs_text_overrides[ $slug ] ) ) {
183 - if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) {
184 - return $fs_text_overrides[ $slug ][ $key ];
185 - }
186 -
187 - $lower_key = strtolower( $key );
188 - if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) {
189 - return $fs_text_overrides[ $slug ][ $lower_key ];
190 - }
191 - }
192 -
193 - if ( ! isset( $fs_text ) ) {
194 - $dir = defined( 'WP_FS__DIR_INCLUDES' ) ?
195 - WP_FS__DIR_INCLUDES :
196 - dirname( __FILE__ );
197 -
198 - require_once $dir . '/i18n.php';
199 - }
200 -
201 - if ( isset( $fs_text[ $key ] ) ) {
202 - return $fs_text[ $key ];
203 - }
204 -
205 - if ( isset( $fs_module_info_text[ $key ] ) ) {
206 - return $fs_module_info_text[ $key ];
207 - }
208 -
209 - return $key;
210 - }
211 -
212 - /**
213 - * Output a translated text by key.
214 - *
215 - * @deprecated Use `fs_echo()` instead for consistency with `fs_text()`.
216 - *
217 - * @todo Remove this method in the future.
157 + * Get server IP.
218 158 *
219 - * @author Vova Feldman (@svovaf)
220 - * @since 1.1.4
221 - *
222 - * @param string $key
223 - * @param string $slug
224 - */
225 - function _efs( $key, $slug = 'freemius' ) {
226 - fs_echo( $key, $slug );
227 - }
228 - }
229 -
230 - if ( ! function_exists( 'fs_get_ip' ) ) {
231 - /**
232 - * Get client IP.
233 - *
159 + * @since 2.5.1 This method returns the server IP.
160 + *
234 161 * @author Vova Feldman (@svovaf)
235 162 * @since 1.1.2
236 163 *
237 164 * @return string|null
@@ -236,248 +163,259 @@
236 163 *
237 164 * @return string|null
238 165 */
239 166 function fs_get_ip() {
240 - $fields = array(
241 - 'HTTP_CF_CONNECTING_IP',
242 - 'HTTP_CLIENT_IP',
243 - 'HTTP_X_FORWARDED_FOR',
244 - 'HTTP_X_FORWARDED',
245 - 'HTTP_FORWARDED_FOR',
246 - 'HTTP_FORWARDED',
247 - 'REMOTE_ADDR',
248 - );
249 -
250 - foreach ( $fields as $ip_field ) {
251 - if ( ! empty( $_SERVER[ $ip_field ] ) ) {
252 - return $_SERVER[ $ip_field ];
253 - }
254 - }
255 -
256 - return null;
167 + return empty( $_SERVER[ 'SERVER_ADDR' ] ) ?
168 + null :
169 + $_SERVER[ 'SERVER_ADDR' ];
257 170 }
258 171 }
259 172
260 - /**
261 - * Leverage backtrace to find caller plugin main file path.
262 - *
263 - * @author Vova Feldman (@svovaf)
264 - * @since 1.0.6
265 - *
266 - * @return string
267 - */
268 - function fs_find_caller_plugin_file() {
269 - /**
270 - * All the code below will be executed once on activation.
271 - * If the user changes the main plugin's file name, the file_exists()
272 - * will catch it.
273 - */
274 - if ( ! function_exists( 'get_plugins' ) ) {
275 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
276 - }
173 + if ( ! function_exists( 'fs_find_caller_plugin_file' ) ) {
174 + /**
175 + * Leverage backtrace to find caller plugin main file path.
176 + *
177 + * @author Vova Feldman (@svovaf)
178 + * @since 1.0.6
179 + *
180 + * @return string
181 + */
182 + function fs_find_caller_plugin_file() {
183 + /**
184 + * All the code below will be executed once on activation.
185 + * If the user changes the main plugin's file name, the file_exists()
186 + * will catch it.
187 + */
188 + if ( ! function_exists( 'get_plugins' ) ) {
189 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
190 + }
277 191
278 - $all_plugins = fs_get_plugins( true );
279 - $all_plugins_paths = array();
192 + $all_plugins = fs_get_plugins( true );
193 + $all_plugins_paths = array();
280 194
281 - // Get active plugin's main files real full names (might be symlinks).
282 - foreach ( $all_plugins as $relative_path => $data ) {
283 - $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) );
284 - }
195 + // Get active plugin's main files real full names (might be symlinks).
196 + foreach ( $all_plugins as $relative_path => $data ) {
197 + $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) );
198 + }
285 199
286 - $plugin_file = null;
287 - for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) {
288 - if ( empty( $bt[ $i ]['file'] ) ) {
289 - continue;
290 - }
200 + $plugin_file = null;
201 + for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) {
202 + if ( empty( $bt[ $i ]['file'] ) ) {
203 + continue;
204 + }
291 205
292 - if ( in_array( fs_normalize_path( $bt[ $i ]['file'] ), $all_plugins_paths ) ) {
293 - $plugin_file = $bt[ $i ]['file'];
294 - break;
295 - }
296 - }
206 + if ( in_array( fs_normalize_path( $bt[ $i ]['file'] ), $all_plugins_paths ) ) {
207 + $plugin_file = $bt[ $i ]['file'];
208 + break;
209 + }
210 + }
297 211
298 - if ( is_null( $plugin_file ) ) {
299 - // Throw an error to the developer in case of some edge case dev environment.
300 - wp_die(
301 - 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact [email protected] with the current error.',
302 - 'Error',
303 - array( 'back_link' => true )
304 - );
305 - }
212 + if ( is_null( $plugin_file ) ) {
213 + // Throw an error to the developer in case of some edge case dev environment.
214 + wp_die(
215 + 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact [email protected] with the current error.',
216 + 'Error',
217 + array( 'back_link' => true )
218 + );
219 + }
306 220
307 - return $plugin_file;
308 - }
221 + return $plugin_file;
222 + }
223 + }
309 224
310 225 require_once dirname( __FILE__ ) . '/supplements/fs-essential-functions-1.1.7.1.php';
311 226
312 - /**
313 - * Update SDK newest version reference.
314 - *
315 - * @author Vova Feldman (@svovaf)
316 - * @since 1.1.6
317 - *
318 - * @param string $sdk_relative_path
319 - * @param string|bool $plugin_file
320 - *
321 - * @global $fs_active_plugins
322 - */
323 - function fs_update_sdk_newest_version( $sdk_relative_path, $plugin_file = false ) {
324 - /**
325 - * If there is a plugin running an older version of FS (1.2.1 or below), the `fs_update_sdk_newest_version()`
326 - * function in the older version will be used instead of this one. But since the older version is using
327 - * the `is_plugin_active` function to check if a plugin is active, passing the theme's `plugin_path` to the
328 - * `is_plugin_active` function will return false since the path is not a plugin path, so `in_activation` will be
329 - * `true` for theme modules and the upgrading of the SDK version to 1.2.2 or newer version will work fine.
330 - *
331 - * Future versions that will call this function will use the proper logic here instead of just relying on the
332 - * `is_plugin_active` function to fail for themes.
333 - *
334 - * @author Leo Fajardo (@leorw)
335 - * @since 1.2.2
336 - */
227 + if ( ! function_exists( 'fs_update_sdk_newest_version' ) ) {
228 + /**
229 + * Update SDK newest version reference.
230 + *
231 + * @author Vova Feldman (@svovaf)
232 + * @since 1.1.6
233 + *
234 + * @param string $sdk_relative_path
235 + * @param string|bool $plugin_file
236 + *
237 + * @global $fs_active_plugins
238 + */
239 + function fs_update_sdk_newest_version( $sdk_relative_path, $plugin_file = false ) {
240 + /**
241 + * If there is a plugin running an older version of FS (1.2.1 or below), the `fs_update_sdk_newest_version()`
242 + * function in the older version will be used instead of this one. But since the older version is using
243 + * the `is_plugin_active` function to check if a plugin is active, passing the theme's `plugin_path` to the
244 + * `is_plugin_active` function will return false since the path is not a plugin path, so `in_activation` will be
245 + * `true` for theme modules and the upgrading of the SDK version to 1.2.2 or newer version will work fine.
246 + *
247 + * Future versions that will call this function will use the proper logic here instead of just relying on the
248 + * `is_plugin_active` function to fail for themes.
249 + *
250 + * @author Leo Fajardo (@leorw)
251 + * @since 1.2.2
252 + */
337 253
338 - global $fs_active_plugins;
254 + global $fs_active_plugins;
339 255
340 - $newest_sdk = $fs_active_plugins->plugins[ $sdk_relative_path ];
256 + $newest_sdk = $fs_active_plugins->plugins[ $sdk_relative_path ];
341 257
342 - if ( ! is_string( $plugin_file ) ) {
343 - $plugin_file = plugin_basename( fs_find_caller_plugin_file() );
344 - }
345 -
346 - if ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) {
347 - if ( ! function_exists( 'is_plugin_active' ) ) {
348 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
258 + if ( ! is_string( $plugin_file ) ) {
259 + $plugin_file = plugin_basename( fs_find_caller_plugin_file() );
349 260 }
350 261
351 - $in_activation = ( ! is_plugin_active( $plugin_file ) );
352 - } else {
353 - $theme = wp_get_theme();
354 - $in_activation = ( $newest_sdk->plugin_path == $theme->stylesheet );
355 - }
262 + if ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) {
263 + if ( ! function_exists( 'is_plugin_active' ) ) {
264 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
265 + }
356 266
357 - $fs_active_plugins->newest = (object) array(
358 - 'plugin_path' => $plugin_file,
359 - 'sdk_path' => $sdk_relative_path,
360 - 'version' => $newest_sdk->version,
361 - 'in_activation' => $in_activation,
362 - 'timestamp' => time(),
363 - );
267 + $in_activation = ( ! is_plugin_active( $plugin_file ) );
268 + } else {
269 + $theme = wp_get_theme();
270 + $in_activation = ( $newest_sdk->plugin_path == $theme->stylesheet );
271 + }
364 272
365 - // Update DB with latest SDK version and path.
366 - update_option( 'fs_active_plugins', $fs_active_plugins );
367 - }
273 + $fs_active_plugins->newest = (object) array(
274 + 'plugin_path' => $plugin_file,
275 + 'sdk_path' => $sdk_relative_path,
276 + 'version' => $newest_sdk->version,
277 + 'in_activation' => $in_activation,
278 + 'timestamp' => time(),
279 + );
368 280
369 - /**
370 - * Reorder the plugins load order so the plugin with the newest Freemius SDK is loaded first.
371 - *
372 - * @author Vova Feldman (@svovaf)
373 - * @since 1.1.6
374 - *
375 - * @return bool Was plugin order changed. Return false if plugin was loaded first anyways.
376 - *
377 - * @global $fs_active_plugins
378 - */
379 - function fs_newest_sdk_plugin_first() {
380 - global $fs_active_plugins;
281 + // Update DB with latest SDK version and path.
282 + update_option( 'fs_active_plugins', $fs_active_plugins );
283 + }
284 + }
381 285
286 + if ( ! function_exists( 'fs_newest_sdk_plugin_first' ) ) {
382 287 /**
383 - * @todo Multi-site network activated plugin are always loaded prior to site plugins so if there's a a plugin activated in the network mode that has an older version of the SDK of another plugin which is site activated that has new SDK version, the fs-essential-functions.php will be loaded from the older SDK. Same thing about MU plugins (loaded even before network activated plugins).
288 + * Reorder the plugins load order so the plugin with the newest Freemius SDK is loaded first.
384 289 *
385 - * @link https://github.com/Freemius/wordpress-sdk/issues/26
290 + * @author Vova Feldman (@svovaf)
291 + * @since 1.1.6
292 + *
293 + * @return bool Was plugin order changed. Return false if plugin was loaded first anyways.
294 + *
295 + * @global $fs_active_plugins
386 296 */
297 + function fs_newest_sdk_plugin_first() {
298 + global $fs_active_plugins;
387 299
388 - $newest_sdk_plugin_path = $fs_active_plugins->newest->plugin_path;
300 + /**
301 + * @todo Multi-site network activated plugin are always loaded prior to site plugins so if there's a plugin activated in the network mode that has an older version of the SDK of another plugin which is site activated that has new SDK version, the fs-essential-functions.php will be loaded from the older SDK. Same thing about MU plugins (loaded even before network activated plugins).
302 + *
303 + * @link https://github.com/Freemius/wordpress-sdk/issues/26
304 + */
389 305
390 - $active_plugins = get_option( 'active_plugins', array() );
391 - $newest_sdk_plugin_key = array_search( $newest_sdk_plugin_path, $active_plugins );
392 - if ( 0 === $newest_sdk_plugin_key ) {
393 - // if it's 0 it's the first plugin already, no need to continue
394 - return false;
395 - } else if ( is_numeric( $newest_sdk_plugin_key ) ) {
396 - // Remove plugin from its current position.
397 - array_splice( $active_plugins, $newest_sdk_plugin_key, 1 );
306 + $newest_sdk_plugin_path = $fs_active_plugins->newest->plugin_path;
398 307
399 - // Set it to be included first.
400 - array_unshift( $active_plugins, $newest_sdk_plugin_path );
308 + $active_plugins = get_option( 'active_plugins', array() );
309 + $updated_active_plugins = array( $newest_sdk_plugin_path );
401 310
402 - update_option( 'active_plugins', $active_plugins );
311 + $plugin_found = false;
312 + $is_first_path = true;
403 313
404 - return true;
405 - } else if ( is_multisite() && false === $newest_sdk_plugin_key ) {
406 - // Plugin is network active.
407 - $network_active_plugins = get_site_option( 'active_sitewide_plugins', array() );
314 + foreach ( $active_plugins as $key => $plugin_path ) {
315 + if ( $plugin_path === $newest_sdk_plugin_path ) {
316 + if ( $is_first_path ) {
317 + // if it's the first plugin already, no need to continue
318 + return false;
319 + }
408 320
409 - if (isset($network_active_plugins[$newest_sdk_plugin_path])) {
410 - reset($network_active_plugins);
411 - if ( $newest_sdk_plugin_path === key($network_active_plugins) ) {
412 - // Plugin is already activated first on the network level.
413 - return false;
414 - } else if ( is_numeric( $newest_sdk_plugin_key ) ) {
415 - $time = $network_active_plugins[$newest_sdk_plugin_path];
321 + $plugin_found = true;
416 322
417 - // Remove plugin from its current position.
418 - unset($network_active_plugins[$newest_sdk_plugin_path]);
323 + // Skip the plugin (it is already added as the 1st item of $updated_active_plugins).
324 + continue;
325 + }
419 326
420 - // Set it to be included first.
421 - $network_active_plugins = array($newest_sdk_plugin_path => $time) + $network_active_plugins;
327 + $updated_active_plugins[] = $plugin_path;
422 328
423 - update_site_option( 'active_sitewide_plugins', $network_active_plugins );
329 + if ( $is_first_path ) {
330 + $is_first_path = false;
331 + }
332 + }
424 333
425 - return true;
334 + if ( $plugin_found ) {
335 + update_option( 'active_plugins', $updated_active_plugins );
336 +
337 + return true;
338 + }
339 +
340 + if ( is_multisite() ) {
341 + // Plugin is network active.
342 + $network_active_plugins = get_site_option( 'active_sitewide_plugins', array() );
343 +
344 + if ( isset( $network_active_plugins[ $newest_sdk_plugin_path ] ) ) {
345 + reset( $network_active_plugins );
346 + if ( $newest_sdk_plugin_path === key( $network_active_plugins ) ) {
347 + // Plugin is already activated first on the network level.
348 + return false;
349 + } else {
350 + $time = $network_active_plugins[ $newest_sdk_plugin_path ];
351 +
352 + // Remove plugin from its current position.
353 + unset( $network_active_plugins[ $newest_sdk_plugin_path ] );
354 +
355 + // Set it to be included first.
356 + $network_active_plugins = array( $newest_sdk_plugin_path => $time ) + $network_active_plugins;
357 +
358 + update_site_option( 'active_sitewide_plugins', $network_active_plugins );
359 +
360 + return true;
361 + }
426 362 }
427 363 }
364 +
365 + return false;
428 366 }
429 -
430 - return false;
431 367 }
432 368
433 - /**
434 - * Go over all Freemius SDKs in the system and find and "remember"
435 - * the newest SDK which is associated with an active plugin.
436 - *
437 - * @author Vova Feldman (@svovaf)
438 - * @since 1.1.6
439 - *
440 - * @global $fs_active_plugins
441 - */
442 - function fs_fallback_to_newest_active_sdk() {
443 - global $fs_active_plugins;
369 + if ( ! function_exists( 'fs_fallback_to_newest_active_sdk' ) ) {
370 + /**
371 + * Go over all Freemius SDKs in the system and find and "remember"
372 + * the newest SDK which is associated with an active plugin.
373 + *
374 + * @author Vova Feldman (@svovaf)
375 + * @since 1.1.6
376 + *
377 + * @global $fs_active_plugins
378 + */
379 + function fs_fallback_to_newest_active_sdk() {
380 + global $fs_active_plugins;
444 381
445 - /**
446 - * @var object $newest_sdk_data
447 - */
448 - $newest_sdk_data = null;
449 - $newest_sdk_path = null;
382 + /**
383 + * @var object $newest_sdk_data
384 + */
385 + $newest_sdk_data = null;
386 + $newest_sdk_path = null;
450 387
451 - foreach ( $fs_active_plugins->plugins as $sdk_relative_path => $data ) {
452 - if ( is_null( $newest_sdk_data ) || version_compare( $data->version, $newest_sdk_data->version, '>' )
453 - ) {
454 - // If plugin inactive or SDK starter file doesn't exist, remove SDK reference.
455 - if ( 'plugin' === $data->type ) {
456 - $is_module_active = is_plugin_active( $data->plugin_path );
457 - } else {
458 - $active_theme = wp_get_theme();
459 - $is_module_active = ( $data->plugin_path === $active_theme->get_template() );
460 - }
388 + foreach ( $fs_active_plugins->plugins as $sdk_relative_path => $data ) {
389 + if ( is_null( $newest_sdk_data ) || version_compare( $data->version, $newest_sdk_data->version, '>' )
390 + ) {
391 + // If plugin inactive or SDK starter file doesn't exist, remove SDK reference.
392 + if ( 'plugin' === $data->type ) {
393 + $is_module_active = is_plugin_active( $data->plugin_path );
394 + } else {
395 + $active_theme = wp_get_theme();
396 + $is_module_active = ( $data->plugin_path === $active_theme->get_template() );
397 + }
461 398
462 - $is_sdk_exists = file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $sdk_relative_path . '/start.php' ) );
399 + $is_sdk_exists = file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $sdk_relative_path . '/start.php' ) );
463 400
464 - if ( ! $is_module_active || ! $is_sdk_exists ) {
465 - unset( $fs_active_plugins->plugins[ $sdk_relative_path ] );
401 + if ( ! $is_module_active || ! $is_sdk_exists ) {
402 + unset( $fs_active_plugins->plugins[ $sdk_relative_path ] );
466 403
467 - // No need to store the data since it will be stored in fs_update_sdk_newest_version()
468 - // or explicitly with update_option().
469 - } else {
470 - $newest_sdk_data = $data;
471 - $newest_sdk_path = $sdk_relative_path;
472 - }
473 - }
474 - }
404 + // No need to store the data since it will be stored in fs_update_sdk_newest_version()
405 + // or explicitly with update_option().
406 + } else {
407 + $newest_sdk_data = $data;
408 + $newest_sdk_path = $sdk_relative_path;
409 + }
410 + }
411 + }
475 412
476 - if ( is_null( $newest_sdk_data ) ) {
477 - // Couldn't find any SDK reference.
478 - $fs_active_plugins = new stdClass();
479 - update_option( 'fs_active_plugins', $fs_active_plugins );
480 - } else {
481 - fs_update_sdk_newest_version( $newest_sdk_path, $newest_sdk_data->plugin_path );
482 - }
483 - }
413 + if ( is_null( $newest_sdk_data ) ) {
414 + // Couldn't find any SDK reference.
415 + $fs_active_plugins = new stdClass();
416 + update_option( 'fs_active_plugins', $fs_active_plugins );
417 + } else {
418 + fs_update_sdk_newest_version( $newest_sdk_path, $newest_sdk_data->plugin_path );
419 + }
420 + }
421 + }