PluginProbe
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder / 3.6.0
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder v3.6.0
3.6.0 3.5.0 trunk 1.0.10 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.6.1 1.0.7 1.0.8 1.0.9 1.1 1.1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.5 1.5.1 All 110 releases
← All changes | freemius/includes/class-fs-storage.php +109 -72 1.53.6.0 View file →
@@ -14,11 +14,14 @@
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 object $sync_cron
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
21 24 */
22 25 class FS_Storage {
23 26 /**
24 27 * @var FS_Storage[]
@@ -71,8 +74,18 @@
71 74 * }
72 75 */
73 76 private static $_NETWORK_OPTIONS_MAP;
74 77
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 +
75 88 /**
76 89 * @author Leo Fajardo (@leorw)
77 90 *
78 91 * @param string $module_type
@@ -131,11 +144,10 @@
131 144 *
132 145 * @param int $blog_id
133 146 */
134 147 function set_site_blog_context( $blog_id ) {
148 + $this->_storage = $this->get_site_storage( $blog_id );
135 149 $this->_blog_id = $blog_id;
136 -
137 - $this->_storage = $this->get_site_storage( $this->_blog_id );
138 150 }
139 151
140 152 /**
141 153 * @author Leo Fajardo (@leorw)
@@ -142,12 +154,19 @@
142 154 *
143 155 * @param string $key
144 156 * @param mixed $value
145 157 * @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
146 159 * @param bool $flush
147 160 */
148 - function store( $key, $value, $network_level_or_blog_id = null, $flush = true ) {
149 - if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) {
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 ) ) {
150 169 $this->_network_storage->store( $key, $value, $flush );
151 170 } else {
152 171 $storage = $this->get_site_storage( $network_level_or_blog_id );
153 172 $storage->store( $key, $value, $flush );
@@ -199,13 +218,19 @@
199 218 *
200 219 * @param string $key
201 220 * @param mixed $default
202 221 * @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
203 223 *
204 224 * @return mixed
205 225 */
206 - function get( $key, $default = false, $network_level_or_blog_id = null ) {
207 - if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) {
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 ) ) {
208 233 return $this->_network_storage->get( $key, $default );
209 234 } else {
210 235 $storage = $this->get_site_storage( $network_level_or_blog_id );
211 236
@@ -289,21 +314,8 @@
289 314 if ( isset( $this->_storage->{$option} ) && ! isset( $this->_network_storage->{$option} ) ) {
290 315 // Migrate option to the network storage.
291 316 $this->_network_storage->store( $option, $this->_storage->{$option}, false );
292 317
293 - /**
294 - * Remove the option from site level storage.
295 - *
296 - * IMPORTANT:
297 - * The line below is intentionally commented since we want to preserve the option
298 - * on the site storage level for "downgrade compatibility". Basically, if the user
299 - * will downgrade to an older version of the plugin with the prev storage structure,
300 - * it will continue working.
301 - *
302 - * @todo After a few releases we can remove this.
303 - */
304 -// $this->_storage->remove($option, false);
305 -
306 318 $updated = true;
307 319 }
308 320 }
309 321
@@ -336,55 +348,64 @@
336 348 */
337 349 private static function load_network_options_map() {
338 350 self::$_NETWORK_OPTIONS_MAP = array(
339 351 // Network level options.
340 - 'affiliate_application_data' => 0,
341 - 'connectivity_test' => 0,
342 - 'has_trial_plan' => 0,
343 - 'install_sync_timestamp' => 0,
344 - 'install_sync_cron' => 0,
345 - 'is_anonymous_ms' => 0,
346 - 'is_on' => 0,
347 - 'is_plugin_new_install' => 0,
348 - 'network_install_blog_id' => 0,
349 - 'pending_sites_info' => 0,
350 - 'plugin_last_version' => 0,
351 - 'plugin_main_file' => 0,
352 - 'plugin_version' => 0,
353 - 'sdk_downgrade_mode' => 0,
354 - 'sdk_last_version' => 0,
355 - 'sdk_upgrade_mode' => 0,
356 - 'sdk_version' => 0,
357 - 'sticky_optin_added_ms' => 0,
358 - 'subscriptions' => 0,
359 - 'sync_timestamp' => 0,
360 - 'sync_cron' => 0,
361 - 'was_plugin_loaded' => 0,
362 - 'network_user_id' => 0,
363 - 'plugin_upgrade_mode' => 0,
364 - 'plugin_downgrade_mode' => 0,
365 - 'is_network_connected' => 0,
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,
366 382 /**
367 - * Special flag that is used when a super-admin upgrades to the new version of the SDK that
368 - * supports network level integration, when the connection decision wasn't made for all of the
369 - * sites in the network.
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.
370 384 */
371 - 'is_network_activation' => 0,
385 + 'is_network_activation' => self::OPTION_LEVEL_NETWORK,
386 + 'license_migration' => self::OPTION_LEVEL_NETWORK,
372 387
373 388 // When network activated, then network level.
374 - 'install_timestamp' => 1,
375 - 'prev_is_premium' => 1,
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 392
377 393 // If not network activated OR delegated, then site level.
378 - 'activation_timestamp' => 2,
379 - 'prev_user_id' => 2,
380 - 'sticky_optin_added' => 2,
381 - 'uninstall_reason' => 2,
382 - 'is_pending_activation' => 2,
383 - 'pending_license_key' => 2,
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,
384 404
385 405 // Site level options.
386 - 'is_anonymous' => 3,
406 + 'is_anonymous' => self::OPTION_LEVEL_SITE,
407 + 'clone_id' => self::OPTION_LEVEL_SITE,
387 408 );
388 409 }
389 410
390 411 /**
@@ -393,27 +414,35 @@
393 414 * @author Vova Feldman (@svovaf)
394 415 * @since 2.0.0
395 416 *
396 417 * @param string $key
418 + * @param int $option_level Since 2.5.1
397 419 *
398 - * @return bool|mixed
420 + * @return bool
399 421 */
400 - private function is_multisite_option( $key ) {
422 + private function is_multisite_option( $key, $option_level = self::OPTION_LEVEL_UNDEFINED ) {
401 423 if ( ! isset( self::$_NETWORK_OPTIONS_MAP ) ) {
402 424 self::load_network_options_map();
403 425 }
404 426
405 - if ( ! isset( self::$_NETWORK_OPTIONS_MAP[ $key ] ) ) {
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 ) {
406 435 // Option not found -> use site level storage.
407 436 return false;
408 437 }
409 438
410 - if ( 0 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) {
439 + if ( self::OPTION_LEVEL_NETWORK === $option_level ) {
411 440 // Option found and set to always use the network level storage on a multisite.
412 441 return true;
413 442 }
414 443
415 - if ( 3 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) {
444 + if ( self::OPTION_LEVEL_SITE === $option_level ) {
416 445 // Option found and set to always use the site level storage on a multisite.
417 446 return false;
418 447 }
419 448
@@ -420,14 +449,17 @@
420 449 if ( ! $this->_is_network_active ) {
421 450 return false;
422 451 }
423 452
424 - if ( 1 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) {
453 + if ( self::OPTION_LEVEL_NETWORK_ACTIVATED === $option_level ) {
425 454 // Network activated.
426 455 return true;
427 456 }
428 457
429 - if ( 2 === self::$_NETWORK_OPTIONS_MAP[ $key ] && ! $this->_is_delegated_connection ) {
458 + if (
459 + self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED === $option_level &&
460 + ! $this->_is_delegated_connection
461 + ) {
430 462 // Network activated and not delegated.
431 463 return true;
432 464 }
433 465
@@ -438,12 +470,17 @@
438 470 * @author Leo Fajardo
439 471 *
440 472 * @param string $key
441 473 * @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
442 475 *
443 476 * @return bool
444 477 */
445 - private function should_use_network_storage( $key, $network_level_or_blog_id = null ) {
478 + private function should_use_network_storage(
479 + $key,
480 + $network_level_or_blog_id = null,
481 + $option_level = self::OPTION_LEVEL_UNDEFINED
482 + ) {
446 483 if ( ! $this->_is_multisite ) {
447 484 // Not a multisite environment.
448 485 return false;
449 486 }
@@ -453,14 +490,14 @@
453 490 return false;
454 491 }
455 492
456 493 if ( is_bool( $network_level_or_blog_id ) ) {
457 - // Explicitly specified whether should use the network or blog level storage.
494 + // Explicitly specified whether it should use the network or blog level storage.
458 495 return $network_level_or_blog_id;
459 496 }
460 497
461 498 // Determine which storage to use based on the option.
462 - return $this->is_multisite_option( $key );
499 + return $this->is_multisite_option( $key, $option_level );
463 500 }
464 501
465 502 /**
466 503 * @author Vova Feldman (@svovaf)
@@ -519,5 +556,5 @@
519 556 $this->_storage->{$k};
520 557 }
521 558
522 559 #endregion
523 - }
560 + }