PluginProbe
Tiered Pricing Table for WooCommerce / 2.2.3
Tiered Pricing Table for WooCommerce v2.2.3
8.1.0 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 All 92 releases
← All changes | freemius/includes/class-fs-storage.php +74 -108 8.0.2 → 2.2.3 View file →
@@ -14,14 +14,11 @@
14 14 * Class FS_Storage
15 15 *
16 16 * A wrapper class for handling network level and single site level storage.
17 17 *
18 - * @property bool $is_network_activation
19 - * @property int $network_install_blog_id
20 - * @property bool|null $is_extensions_tracking_allowed
21 - * @property bool|null $is_diagnostic_tracking_allowed
22 - * @property object $sync_cron
23 - * @property bool|int $install_timestamp
18 + * @property bool $is_network_activation
19 + * @property int $network_install_blog_id
20 + * @property object $sync_cron
24 21 */
25 22 class FS_Storage {
26 23 /**
27 24 * @var FS_Storage[]
@@ -74,18 +71,8 @@
74 71 * }
75 72 */
76 73 private static $_NETWORK_OPTIONS_MAP;
77 74
78 - const OPTION_LEVEL_UNDEFINED = -1;
79 - // The option should be stored on the network level.
80 - const OPTION_LEVEL_NETWORK = 0;
81 - // The option should be stored on the network level when the plugin is network-activated.
82 - const OPTION_LEVEL_NETWORK_ACTIVATED = 1;
83 - // The option should be stored on the network level when the plugin is network-activated and the opt-in connection was NOT delegated to the sub-site admin.
84 - const OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED = 2;
85 - // The option should be stored on the site level.
86 - const OPTION_LEVEL_SITE = 3;
87 -
88 75 /**
89 76 * @author Leo Fajardo (@leorw)
90 77 *
91 78 * @param string $module_type
@@ -154,19 +141,12 @@
154 141 *
155 142 * @param string $key
156 143 * @param mixed $value
157 144 * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP).
158 - * @param int $option_level Since 2.5.1
159 145 * @param bool $flush
160 146 */
161 - function store(
162 - $key,
163 - $value,
164 - $network_level_or_blog_id = null,
165 - $option_level = self::OPTION_LEVEL_UNDEFINED,
166 - $flush = true
167 - ) {
168 - if ( $this->should_use_network_storage( $key, $network_level_or_blog_id, $option_level ) ) {
147 + function store( $key, $value, $network_level_or_blog_id = null, $flush = true ) {
148 + if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) {
169 149 $this->_network_storage->store( $key, $value, $flush );
170 150 } else {
171 151 $storage = $this->get_site_storage( $network_level_or_blog_id );
172 152 $storage->store( $key, $value, $flush );
@@ -218,19 +198,13 @@
218 198 *
219 199 * @param string $key
220 200 * @param mixed $default
221 201 * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP).
222 - * @param int $option_level Since 2.5.1
223 202 *
224 203 * @return mixed
225 204 */
226 - function get(
227 - $key,
228 - $default = false,
229 - $network_level_or_blog_id = null,
230 - $option_level = self::OPTION_LEVEL_UNDEFINED
231 - ) {
232 - if ( $this->should_use_network_storage( $key, $network_level_or_blog_id, $option_level ) ) {
205 + function get( $key, $default = false, $network_level_or_blog_id = null ) {
206 + if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) {
233 207 return $this->_network_storage->get( $key, $default );
234 208 } else {
235 209 $storage = $this->get_site_storage( $network_level_or_blog_id );
236 210
@@ -314,8 +288,21 @@
314 288 if ( isset( $this->_storage->{$option} ) && ! isset( $this->_network_storage->{$option} ) ) {
315 289 // Migrate option to the network storage.
316 290 $this->_network_storage->store( $option, $this->_storage->{$option}, false );
317 291
292 + /**
293 + * Remove the option from site level storage.
294 + *
295 + * IMPORTANT:
296 + * The line below is intentionally commented since we want to preserve the option
297 + * on the site storage level for "downgrade compatibility". Basically, if the user
298 + * will downgrade to an older version of the plugin with the prev storage structure,
299 + * it will continue working.
300 + *
301 + * @todo After a few releases we can remove this.
302 + */
303 +// $this->_storage->remove($option, false);
304 +
318 305 $updated = true;
319 306 }
320 307 }
321 308
@@ -348,64 +335,59 @@
348 335 */
349 336 private static function load_network_options_map() {
350 337 self::$_NETWORK_OPTIONS_MAP = array(
351 338 // Network level options.
352 - 'affiliate_application_data' => self::OPTION_LEVEL_NETWORK,
353 - 'beta_data' => self::OPTION_LEVEL_NETWORK,
354 - 'connectivity_test' => self::OPTION_LEVEL_NETWORK,
355 - 'handle_gdpr_admin_notice' => self::OPTION_LEVEL_NETWORK,
356 - 'has_trial_plan' => self::OPTION_LEVEL_NETWORK,
357 - 'install_sync_timestamp' => self::OPTION_LEVEL_NETWORK,
358 - 'install_sync_cron' => self::OPTION_LEVEL_NETWORK,
359 - 'is_anonymous_ms' => self::OPTION_LEVEL_NETWORK,
360 - 'is_network_activated' => self::OPTION_LEVEL_NETWORK,
361 - 'is_on' => self::OPTION_LEVEL_NETWORK,
362 - 'is_plugin_new_install' => self::OPTION_LEVEL_NETWORK,
363 - 'last_load_timestamp' => self::OPTION_LEVEL_NETWORK,
364 - 'network_install_blog_id' => self::OPTION_LEVEL_NETWORK,
365 - 'pending_sites_info' => self::OPTION_LEVEL_NETWORK,
366 - 'plugin_last_version' => self::OPTION_LEVEL_NETWORK,
367 - 'plugin_main_file' => self::OPTION_LEVEL_NETWORK,
368 - 'plugin_version' => self::OPTION_LEVEL_NETWORK,
369 - 'sdk_downgrade_mode' => self::OPTION_LEVEL_NETWORK,
370 - 'sdk_last_version' => self::OPTION_LEVEL_NETWORK,
371 - 'sdk_upgrade_mode' => self::OPTION_LEVEL_NETWORK,
372 - 'sdk_version' => self::OPTION_LEVEL_NETWORK,
373 - 'sticky_optin_added_ms' => self::OPTION_LEVEL_NETWORK,
374 - 'subscriptions' => self::OPTION_LEVEL_NETWORK,
375 - 'sync_timestamp' => self::OPTION_LEVEL_NETWORK,
376 - 'sync_cron' => self::OPTION_LEVEL_NETWORK,
377 - 'was_plugin_loaded' => self::OPTION_LEVEL_NETWORK,
378 - 'network_user_id' => self::OPTION_LEVEL_NETWORK,
379 - 'plugin_upgrade_mode' => self::OPTION_LEVEL_NETWORK,
380 - 'plugin_downgrade_mode' => self::OPTION_LEVEL_NETWORK,
381 - 'is_network_connected' => self::OPTION_LEVEL_NETWORK,
339 + 'affiliate_application_data' => 0,
340 + 'beta_data' => 0,
341 + 'connectivity_test' => 0,
342 + 'handle_gdpr_admin_notice' => 0,
343 + 'has_trial_plan' => 0,
344 + 'install_sync_timestamp' => 0,
345 + 'install_sync_cron' => 0,
346 + 'is_anonymous_ms' => 0,
347 + 'is_network_activated' => 0,
348 + 'is_on' => 0,
349 + 'is_plugin_new_install' => 0,
350 + 'network_install_blog_id' => 0,
351 + 'pending_sites_info' => 0,
352 + 'plugin_last_version' => 0,
353 + 'plugin_main_file' => 0,
354 + 'plugin_version' => 0,
355 + 'sdk_downgrade_mode' => 0,
356 + 'sdk_last_version' => 0,
357 + 'sdk_upgrade_mode' => 0,
358 + 'sdk_version' => 0,
359 + 'sticky_optin_added_ms' => 0,
360 + 'subscriptions' => 0,
361 + 'sync_timestamp' => 0,
362 + 'sync_cron' => 0,
363 + 'was_plugin_loaded' => 0,
364 + 'network_user_id' => 0,
365 + 'plugin_upgrade_mode' => 0,
366 + 'plugin_downgrade_mode' => 0,
367 + 'is_network_connected' => 0,
382 368 /**
383 - * Special flag that is used when a super-admin upgrades to the new version of the SDK that supports network level integration, when the connection decision wasn't made for all the sites in the network.
369 + * Special flag that is used when a super-admin upgrades to the new version of the SDK that
370 + * supports network level integration, when the connection decision wasn't made for all of the
371 + * sites in the network.
384 372 */
385 - 'is_network_activation' => self::OPTION_LEVEL_NETWORK,
386 - 'license_migration' => self::OPTION_LEVEL_NETWORK,
373 + 'is_network_activation' => 0,
387 374
388 375 // When network activated, then network level.
389 - 'install_timestamp' => self::OPTION_LEVEL_NETWORK_ACTIVATED,
390 - 'prev_is_premium' => self::OPTION_LEVEL_NETWORK_ACTIVATED,
391 - 'require_license_activation' => self::OPTION_LEVEL_NETWORK_ACTIVATED,
376 + 'install_timestamp' => 1,
377 + 'prev_is_premium' => 1,
378 + 'require_license_activation' => 1,
392 379
393 380 // If not network activated OR delegated, then site level.
394 - 'activation_timestamp' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
395 - 'expired_license_notice_shown' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
396 - 'is_whitelabeled' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
397 - 'last_license_key' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
398 - 'last_license_user_id' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
399 - 'prev_user_id' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
400 - 'sticky_optin_added' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
401 - 'uninstall_reason' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
402 - 'is_pending_activation' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
403 - 'pending_license_key' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED,
381 + 'activation_timestamp' => 2,
382 + 'prev_user_id' => 2,
383 + 'sticky_optin_added' => 2,
384 + 'uninstall_reason' => 2,
385 + 'is_pending_activation' => 2,
386 + 'pending_license_key' => 2,
404 387
405 388 // Site level options.
406 - 'is_anonymous' => self::OPTION_LEVEL_SITE,
407 - 'clone_id' => self::OPTION_LEVEL_SITE,
389 + 'is_anonymous' => 3,
408 390 );
409 391 }
410 392
411 393 /**
@@ -414,35 +396,27 @@
414 396 * @author Vova Feldman (@svovaf)
415 397 * @since 2.0.0
416 398 *
417 399 * @param string $key
418 - * @param int $option_level Since 2.5.1
419 400 *
420 - * @return bool
401 + * @return bool|mixed
421 402 */
422 - private function is_multisite_option( $key, $option_level = self::OPTION_LEVEL_UNDEFINED ) {
403 + private function is_multisite_option( $key ) {
423 404 if ( ! isset( self::$_NETWORK_OPTIONS_MAP ) ) {
424 405 self::load_network_options_map();
425 406 }
426 407
427 - if (
428 - self::OPTION_LEVEL_UNDEFINED === $option_level &&
429 - isset( self::$_NETWORK_OPTIONS_MAP[ $key ] )
430 - ) {
431 - $option_level = self::$_NETWORK_OPTIONS_MAP[ $key ];
432 - }
433 -
434 - if ( self::OPTION_LEVEL_UNDEFINED === $option_level ) {
408 + if ( ! isset( self::$_NETWORK_OPTIONS_MAP[ $key ] ) ) {
435 409 // Option not found -> use site level storage.
436 410 return false;
437 411 }
438 412
439 - if ( self::OPTION_LEVEL_NETWORK === $option_level ) {
413 + if ( 0 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) {
440 414 // Option found and set to always use the network level storage on a multisite.
441 415 return true;
442 416 }
443 417
444 - if ( self::OPTION_LEVEL_SITE === $option_level ) {
418 + if ( 3 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) {
445 419 // Option found and set to always use the site level storage on a multisite.
446 420 return false;
447 421 }
448 422
@@ -449,17 +423,14 @@
449 423 if ( ! $this->_is_network_active ) {
450 424 return false;
451 425 }
452 426
453 - if ( self::OPTION_LEVEL_NETWORK_ACTIVATED === $option_level ) {
427 + if ( 1 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) {
454 428 // Network activated.
455 429 return true;
456 430 }
457 431
458 - if (
459 - self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED === $option_level &&
460 - ! $this->_is_delegated_connection
461 - ) {
432 + if ( 2 === self::$_NETWORK_OPTIONS_MAP[ $key ] && ! $this->_is_delegated_connection ) {
462 433 // Network activated and not delegated.
463 434 return true;
464 435 }
465 436
@@ -470,17 +441,12 @@
470 441 * @author Leo Fajardo
471 442 *
472 443 * @param string $key
473 444 * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP).
474 - * @param int $option_level Since 2.5.1
475 445 *
476 446 * @return bool
477 447 */
478 - private function should_use_network_storage(
479 - $key,
480 - $network_level_or_blog_id = null,
481 - $option_level = self::OPTION_LEVEL_UNDEFINED
482 - ) {
448 + private function should_use_network_storage( $key, $network_level_or_blog_id = null ) {
483 449 if ( ! $this->_is_multisite ) {
484 450 // Not a multisite environment.
485 451 return false;
486 452 }
@@ -490,14 +456,14 @@
490 456 return false;
491 457 }
492 458
493 459 if ( is_bool( $network_level_or_blog_id ) ) {
494 - // Explicitly specified whether it should use the network or blog level storage.
460 + // Explicitly specified whether should use the network or blog level storage.
495 461 return $network_level_or_blog_id;
496 462 }
497 463
498 464 // Determine which storage to use based on the option.
499 - return $this->is_multisite_option( $key, $option_level );
465 + return $this->is_multisite_option( $key );
500 466 }
501 467
502 468 /**
503 469 * @author Vova Feldman (@svovaf)
@@ -556,5 +522,5 @@
556 522 $this->_storage->{$k};
557 523 }
558 524
559 525 #endregion
560 - }
526 + }