Premmerce Permalink Manager for WooCommerce - Version 2.3.0

Version Description

Release Date: December 15, 2020

  • Added new feature "Breadcrumbs Support"
  • Added new feature "Replace the product slug with an SKU"
  • Updated WooCommerce compatibility version to 4.8
  • Updated WordPress compatibility version to 5.6
  • Updated Freemius SDK to 2.4.1
  • Minor improvements and fixes
Download this release

Release Info

Developer premmerce
Plugin Icon 128x128 Premmerce Permalink Manager for WooCommerce
Version 2.3.0
Comparing to
See all releases

Code changes from version 2.2.0 to 2.3.0

Files changed (108) hide show
  1. freemius.php +48 -45
  2. freemius/LICENSE.txt +0 -0
  3. freemius/assets/css/admin/account.css +1 -1
  4. freemius/assets/css/admin/add-ons.css +1 -1
  5. freemius/assets/css/admin/connect.css +0 -0
  6. freemius/assets/js/nojquery.ba-postmessage.js +0 -0
  7. freemius/assets/js/nojquery.ba-postmessage.min.js +0 -0
  8. freemius/assets/js/postmessage.js +0 -0
  9. freemius/config.php +4 -1
  10. freemius/includes/class-freemius-abstract.php +0 -0
  11. freemius/includes/class-freemius.php +840 -105
  12. freemius/includes/class-fs-api.php +1 -1
  13. freemius/includes/class-fs-plugin-updater.php +49 -6
  14. freemius/includes/class-fs-security.php +0 -0
  15. freemius/includes/class-fs-storage.php +1 -0
  16. freemius/includes/customizer/class-fs-customizer-support-section.php +2 -2
  17. freemius/includes/entities/class-fs-entity.php +0 -0
  18. freemius/includes/entities/class-fs-payment.php +2 -2
  19. freemius/includes/entities/class-fs-plugin-info.php +0 -0
  20. freemius/includes/entities/class-fs-plugin-license.php +7 -0
  21. freemius/includes/entities/class-fs-plugin-plan.php +0 -0
  22. freemius/includes/entities/class-fs-plugin-tag.php +0 -0
  23. freemius/includes/entities/class-fs-plugin.php +0 -0
  24. freemius/includes/entities/class-fs-pricing.php +0 -0
  25. freemius/includes/entities/class-fs-scope-entity.php +0 -0
  26. freemius/includes/entities/class-fs-site.php +4 -1
  27. freemius/includes/entities/class-fs-subscription.php +0 -0
  28. freemius/includes/entities/class-fs-user.php +0 -0
  29. freemius/includes/fs-core-functions.php +0 -0
  30. freemius/includes/fs-essential-functions.php +37 -20
  31. freemius/includes/fs-plugin-info-dialog.php +36 -23
  32. freemius/includes/i18n.php +2 -0
  33. freemius/includes/managers/class-fs-admin-menu-manager.php +6 -1
  34. freemius/includes/managers/class-fs-cache-manager.php +0 -0
  35. freemius/includes/managers/class-fs-key-value-storage.php +0 -0
  36. freemius/includes/managers/class-fs-license-manager.php +0 -0
  37. freemius/includes/managers/class-fs-option-manager.php +0 -0
  38. freemius/includes/managers/class-fs-plan-manager.php +0 -0
  39. freemius/includes/managers/class-fs-plugin-manager.php +0 -0
  40. freemius/includes/sdk/Exceptions/ArgumentNotExistException.php +0 -0
  41. freemius/includes/sdk/Exceptions/EmptyArgumentException.php +0 -0
  42. freemius/includes/sdk/Exceptions/Exception.php +0 -0
  43. freemius/includes/sdk/Exceptions/InvalidArgumentException.php +0 -0
  44. freemius/includes/sdk/Exceptions/OAuthException.php +0 -0
  45. freemius/includes/sdk/FreemiusBase.php +1 -1
  46. freemius/includes/sdk/FreemiusWordPress.php +20 -12
  47. freemius/includes/sdk/LICENSE.txt +0 -0
  48. freemius/includes/supplements/fs-essential-functions-1.1.7.1.php +1 -1
  49. freemius/languages/freemius-cs_CZ.mo +0 -0
  50. freemius/languages/freemius-da_DK.mo +0 -0
  51. freemius/languages/freemius-en.mo +0 -0
  52. freemius/languages/freemius-es_ES.mo +0 -0
  53. freemius/languages/freemius-fr_FR.mo +0 -0
  54. freemius/languages/freemius-he_IL.mo +0 -0
  55. freemius/languages/freemius-hu_HU.mo +0 -0
  56. freemius/languages/freemius-it_IT.mo +0 -0
  57. freemius/languages/freemius-ja.mo +0 -0
  58. freemius/languages/freemius-nl_NL.mo +0 -0
  59. freemius/languages/freemius-ru_RU.mo +0 -0
  60. freemius/languages/freemius-ta.mo +0 -0
  61. freemius/languages/freemius-zh_CN.mo +0 -0
  62. freemius/languages/freemius.pot +390 -358
  63. freemius/start.php +529 -521
  64. freemius/templates/account.php +84 -24
  65. freemius/templates/account/partials/addon.php +2 -2
  66. freemius/templates/account/payments.php +1 -1
  67. freemius/templates/add-ons.php +2 -2
  68. freemius/templates/auto-installation.php +1 -1
  69. freemius/templates/checkout.php +0 -0
  70. freemius/templates/connect.php +12 -11
  71. freemius/templates/contact.php +0 -0
  72. freemius/templates/firewall-issues-js.php +0 -0
  73. freemius/templates/forms/affiliation.php +28 -5
  74. freemius/templates/forms/deactivation/form.php +18 -14
  75. freemius/templates/forms/license-activation.php +10 -8
  76. freemius/templates/forms/optout.php +17 -10
  77. freemius/templates/forms/subscription-cancellation.php +1 -1
  78. freemius/templates/forms/trial-start.php +1 -1
  79. freemius/templates/partials/index.php +2 -0
  80. freemius/templates/powered-by.php +0 -0
  81. freemius/templates/pricing.php +208 -176
  82. freemius/templates/secure-https-header.php +1 -1
  83. freemius/templates/sticky-admin-notice-js.php +0 -0
  84. languages/premmerce-url-manager-ru_RU.mo +0 -0
  85. languages/premmerce-url-manager-ru_RU.po +0 -0
  86. languages/premmerce-url-manager-uk.mo +0 -0
  87. languages/premmerce-url-manager-uk.po +0 -0
  88. license.txt +0 -0
  89. premmerce-url-manager.php +2 -2
  90. readme.txt +25 -9
  91. src/Addons/AddonInterface.php +14 -0
  92. src/Addons/AddonManager.php +26 -0
  93. src/Addons/BreadcrumbsAddon.php +161 -0
  94. src/Addons/YoastBreadcrumbsAddon.php +49 -0
  95. src/Admin/Settings.php +14 -1
  96. src/Frontend/Frontend.php +82 -1
  97. src/PermalinkListener.php +55 -1
  98. src/UrlManagerPlugin.php +3 -1
  99. vendor/composer/ClassLoader.php +3 -3
  100. vendor/composer/autoload_real.php +3 -0
  101. views/admin/banner.php +6 -6
  102. views/admin/main.php +5 -5
  103. views/admin/section/additional.php +64 -10
  104. views/admin/section/category.php +8 -8
  105. views/admin/section/product.php +15 -15
  106. views/admin/section/sku.php +78 -0
  107. views/admin/section/suffix.php +9 -7
  108. views/admin/tabs/settings.php +1 -1
freemius.php CHANGED
@@ -1,52 +1,55 @@
1
  <?php
2
 
3
  // Create a helper function for easy SDK access.
4
- function premmerce_wpm_fs()
5
- {
6
- global $premmerce_wpm_fs ;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
- if ( !isset( $premmerce_wpm_fs ) ) {
9
- // Include Freemius SDK.
10
- require_once dirname( __FILE__ ) . '/freemius/start.php';
11
- $premmerce_wpm_fs = fs_dynamic_init( array(
12
- 'id' => '1504',
13
- 'slug' => 'woo-permalink-manager',
14
- 'type' => 'plugin',
15
- 'public_key' => 'pk_99e9eb56c52475602e368258aec99',
16
- 'is_premium' => false,
17
- 'has_addons' => false,
18
- 'has_paid_plans' => true,
19
- 'trial' => array(
20
- 'days' => 7,
21
- 'is_require_payment' => true,
22
- ),
23
- 'menu' => array(
24
- 'slug' => 'premmerce-url-manager-admin',
25
- 'override_exact' => true,
26
- 'support' => false,
27
- 'contact' => false,
28
- 'account' => false,
29
- 'parent' => array(
30
- 'slug' => 'premmerce',
31
- ),
32
- ),
33
- 'is_live' => true,
34
- ) );
35
  }
36
 
37
- return $premmerce_wpm_fs;
 
 
 
38
  }
39
-
40
- // Init Freemius.
41
- premmerce_wpm_fs();
42
- // Signal that SDK was initiated.
43
- do_action( 'premmerce_wpm_fs_loaded' );
44
- function premmerce_wpm_fs_settings_url()
45
- {
46
- return admin_url( 'admin.php?page=premmerce-url-manager-admin' );
47
- }
48
-
49
- premmerce_wpm_fs()->add_filter( 'connect_url', 'premmerce_wpm_fs_settings_url' );
50
- premmerce_wpm_fs()->add_filter( 'after_skip_url', 'premmerce_wpm_fs_settings_url' );
51
- premmerce_wpm_fs()->add_filter( 'after_connect_url', 'premmerce_wpm_fs_settings_url' );
52
- premmerce_wpm_fs()->add_filter( 'after_pending_connect_url', 'premmerce_wpm_fs_settings_url' );
1
  <?php
2
 
3
  // Create a helper function for easy SDK access.
4
+
5
+ if ( !function_exists( 'premmerce_wpm_fs' ) ) {
6
+ // Create a helper function for easy SDK access.
7
+ function premmerce_wpm_fs()
8
+ {
9
+ global $premmerce_wpm_fs ;
10
+
11
+ if ( !isset( $premmerce_wpm_fs ) ) {
12
+ // Include Freemius SDK.
13
+ require_once dirname( __FILE__ ) . '/freemius/start.php';
14
+ $premmerce_wpm_fs = fs_dynamic_init( array(
15
+ 'id' => '1504',
16
+ 'slug' => 'woo-permalink-manager',
17
+ 'type' => 'plugin',
18
+ 'public_key' => 'pk_99e9eb56c52475602e368258aec99',
19
+ 'is_premium' => false,
20
+ 'premium_suffix' => '',
21
+ 'has_addons' => false,
22
+ 'has_paid_plans' => true,
23
+ 'trial' => array(
24
+ 'days' => 14,
25
+ 'is_require_payment' => true,
26
+ ),
27
+ 'menu' => array(
28
+ 'slug' => 'premmerce-url-manager-admin',
29
+ 'override_exact' => true,
30
+ 'support' => false,
31
+ 'parent' => array(
32
+ 'slug' => 'premmerce',
33
+ ),
34
+ ),
35
+ 'is_live' => true,
36
+ ) );
37
+ }
38
+
39
+ return $premmerce_wpm_fs;
40
+ }
41
 
42
+ // Init Freemius.
43
+ premmerce_wpm_fs();
44
+ // Signal that SDK was initiated.
45
+ do_action( 'premmerce_wpm_fs_loaded' );
46
+ function premmerce_wpm_fs_settings_url()
47
+ {
48
+ return admin_url( 'admin.php?page=premmerce-url-manager-admin' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  }
50
 
51
+ premmerce_wpm_fs()->add_filter( 'connect_url', 'premmerce_wpm_fs_settings_url' );
52
+ premmerce_wpm_fs()->add_filter( 'after_skip_url', 'premmerce_wpm_fs_settings_url' );
53
+ premmerce_wpm_fs()->add_filter( 'after_connect_url', 'premmerce_wpm_fs_settings_url' );
54
+ premmerce_wpm_fs()->add_filter( 'after_pending_connect_url', 'premmerce_wpm_fs_settings_url' );
55
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
freemius/LICENSE.txt CHANGED
File without changes
freemius/assets/css/admin/account.css CHANGED
@@ -1 +1 @@
1
- label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}#fs_account .postbox,#fs_account .widefat{max-width:800px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #F1F1F1}#fs_account h3 .dashicons{width:26px;height:26px;font-size:1.3em}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:0.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:bold}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table var,.fs-key-value-table code,.fs-key-value-table input[type="text"]{color:#0073AA;font-size:16px;background:none}.fs-key-value-table input[type="text"]{width:100%;font-weight:bold}.fs-field-beta_program label{margin-left:7px}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_sites .fs-scrollable-table .fs-table-body{max-height:200px;overflow:auto;border:1px solid #e5e5e5}#fs_sites .fs-scrollable-table .fs-table-body>table.widefat{border:none !important}#fs_sites .fs-scrollable-table .fs-main-column{width:100%}#fs_sites .fs-scrollable-table .fs-site-details td:first-of-type{text-align:right;color:grey;width:1px}#fs_sites .fs-scrollable-table .fs-site-details td:last-of-type{text-align:right}#fs_sites .fs-scrollable-table .fs-install-details table tr td{width:1px;white-space:nowrap}#fs_sites .fs-scrollable-table .fs-install-details table tr td:last-of-type{width:auto}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:bold}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:bold}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:bold}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%}
1
+ label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.fs-notice[data-id="license_not_whitelabeled"].success,.fs-notice[data-id="license_whitelabeled"].success{color:inherit;border-left-color:#00a0d2}.fs-notice[data-id="license_not_whitelabeled"].success label.fs-plugin-title,.fs-notice[data-id="license_whitelabeled"].success label.fs-plugin-title{display:none}#fs_account .postbox,#fs_account .widefat{max-width:800px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #F1F1F1}#fs_account h3 .dashicons{width:26px;height:26px;font-size:1.3em}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:0.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:bold}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table var,.fs-key-value-table code,.fs-key-value-table input[type="text"]{color:#0073AA;font-size:16px;background:none}.fs-key-value-table input[type="text"]{width:100%;font-weight:bold}.fs-field-beta_program label{margin-left:7px}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_sites .fs-scrollable-table .fs-table-body{max-height:200px;overflow:auto;border:1px solid #e5e5e5}#fs_sites .fs-scrollable-table .fs-table-body>table.widefat{border:none !important}#fs_sites .fs-scrollable-table .fs-main-column{width:100%}#fs_sites .fs-scrollable-table .fs-site-details td:first-of-type{text-align:right;color:grey;width:1px}#fs_sites .fs-scrollable-table .fs-site-details td:last-of-type{text-align:right}#fs_sites .fs-scrollable-table .fs-install-details table tr td{width:1px;white-space:nowrap}#fs_sites .fs-scrollable-table .fs-install-details table tr td:last-of-type{width:auto}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:bold}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:bold}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:bold}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%}
freemius/assets/css/admin/add-ons.css CHANGED
@@ -1,2 +1,2 @@
1
  .fs-badge{position:absolute;top:10px;right:0;background:#71ae00;color:white;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);box-shadow:0 2px 1px -1px rgba(0,0,0,0.3)}#fs_addons .fs-cards-list{list-style:none}#fs_addons .fs-cards-list .fs-card{float:left;height:152px;width:310px;padding:0;margin:0 0 30px 30px;font-size:14px;list-style:none;border:1px solid #ddd;cursor:pointer;position:relative}#fs_addons .fs-cards-list .fs-card .fs-overlay{position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#fs_addons .fs-cards-list .fs-card .fs-inner{background-color:#fff;overflow:hidden;height:100%;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner>ul{-moz-transition:all,0.15s;-o-transition:all,0.15s;-ms-transition:all,0.15s;-webkit-transition:all,0.15s;transition:all,0.15s;left:0;right:0;top:0;position:absolute}#fs_addons .fs-cards-list .fs-card .fs-inner>ul>li{list-style:none;line-height:18px;padding:0 15px;width:100%;display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner{padding:0;margin:0;line-height:0;display:block;height:100px;background-repeat:repeat-x;background-size:100% 100%;-moz-transition:all,0.15s;-o-transition:all,0.15s;-ms-transition:all,0.15s;-webkit-transition:all,0.15s;transition:all,0.15s}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner .fs-badge.fs-installed-addon-badge{font-size:1.02em;line-height:1.3em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-title{margin:10px 0 0 0;height:18px;overflow:hidden;color:#000;white-space:nowrap;text-overflow:ellipsis;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-offer{font-size:0.9em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-description{background-color:#f9f9f9;padding:10px 15px 100px 15px;border-top:1px solid #eee;margin:0 0 10px 0;color:#777}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-tag{position:absolute;top:10px;right:0px;background:greenyellow;display:block;padding:2px 10px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.3);box-shadow:1px 1px 1px rgba(0,0,0,0.3);text-transform:uppercase;font-size:0.9em;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button,#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button-group{position:absolute;top:112px;right:10px}@media screen and (min-width: 960px){#fs_addons .fs-cards-list .fs-card:hover .fs-overlay{border:2px solid #29abe1;margin-left:-1px;margin-top:-1px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner ul{top:-100px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-title,#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-offer{color:#29abe1}}
2
- #TB_window,#TB_window iframe{width:821px !important}#plugin-information .fyi{width:266px !important}#plugin-information #section-holder{margin-right:299px}#plugin-information #section-description h2,#plugin-information #section-description h3,#plugin-information #section-description p,#plugin-information #section-description b,#plugin-information #section-description i,#plugin-information #section-description blockquote,#plugin-information #section-description li,#plugin-information #section-description ul,#plugin-information #section-description ol{clear:none}#plugin-information #section-description .fs-selling-points{padding-bottom:10px;border-bottom:1px solid #ddd}#plugin-information #section-description .fs-selling-points ul{margin:0}#plugin-information #section-description .fs-selling-points ul li{padding:0;list-style:none outside none}#plugin-information #section-description .fs-selling-points ul li i.dashicons{color:#71ae00;font-size:3em;vertical-align:middle;line-height:30px;float:left;margin:0 0 0 -15px}#plugin-information #section-description .fs-selling-points ul li h3{margin:1em 30px !important}#plugin-information #section-description .fs-screenshots:after{content:"";display:table;clear:both}#plugin-information #section-description .fs-screenshots ul{list-style:none;margin:0}#plugin-information #section-description .fs-screenshots ul li{width:225px;height:225px;float:left;margin-bottom:20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#plugin-information #section-description .fs-screenshots ul li a{display:block;width:100%;height:100%;border:1px solid;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2);background-size:cover}#plugin-information #section-description .fs-screenshots ul li.odd{margin-right:20px}#plugin-information .plugin-information-pricing{margin:-16px;border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan h3{margin-top:0;padding:20px;font-size:16px}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper{border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab{cursor:pointer;position:relative;padding:0 10px;font-size:0.9em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab label{text-transform:uppercase;color:green;background:greenyellow;position:absolute;left:-1px;right:-1px;bottom:100%;border:1px solid darkgreen;padding:2px;text-align:center;font-size:0.9em;line-height:1em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab.nav-tab-active{cursor:default;background:#fffeec;border-bottom-color:#fffeec}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle h3{background:#fffeec;margin:0;padding-bottom:0;color:#0073aa}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .nav-tab-wrapper,#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .fs-billing-frequency{display:none}#plugin-information .plugin-information-pricing .fs-plan .fs-pricing-body{background:#fffeec;padding:20px}#plugin-information .plugin-information-pricing .fs-plan .button{width:100%;text-align:center;font-weight:bold;text-transform:uppercase;font-size:1.1em}#plugin-information .plugin-information-pricing .fs-plan label{white-space:nowrap}#plugin-information .plugin-information-pricing .fs-plan var{font-style:normal}#plugin-information .plugin-information-pricing .fs-plan .fs-billing-frequency,#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-align:center;display:block;font-weight:bold;margin-bottom:10px;text-transform:uppercase;background:#F3F3F3;padding:2px;border:1px solid #ccc}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-transform:none;color:green;background:greenyellow}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms{font-size:0.9em}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms i{float:left;margin:0 0 0 -15px}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms li{margin:10px 0 0 0}#plugin-information #section-features .fs-features{margin:-20px -26px}#plugin-information #section-features table{width:100%;border-spacing:0;border-collapse:separate}#plugin-information #section-features table thead th{padding:10px 0}#plugin-information #section-features table thead .fs-price{color:#71ae00;font-weight:normal;display:block;text-align:center}#plugin-information #section-features table tbody td{border-top:1px solid #ccc;padding:10px 0;text-align:center;width:100px;color:#71ae00}#plugin-information #section-features table tbody td:first-child{text-align:left;width:auto;color:inherit;padding-left:26px}#plugin-information #section-features table tbody tr.fs-odd td{background:#fefefe}#plugin-information #section-features .dashicons-yes{width:30px;height:30px;font-size:30px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button,#plugin-information .fs-dropdown .button-group .button{position:relative;width:auto;top:0;right:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button:focus,#plugin-information .fs-dropdown .button-group .button:focus{z-index:10}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .fs-dropdown-arrow,#plugin-information .fs-dropdown .button-group .fs-dropdown-arrow{border-top:6px solid white;border-right:4px solid transparent;border-left:4px solid transparent;top:12px;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button){border-bottom-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button{border-bottom-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button){border-top-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active.up .fs-dropdown-arrow-button{border-top-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list,#plugin-information .fs-dropdown .fs-dropdown-list{position:absolute;right:-1px;top:100%;margin-left:auto;padding:3px 0;border:1px solid #bfbfbf;background-color:#fff;z-index:1;width:230px;text-align:left;-moz-box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);-webkit-box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li,#plugin-information .fs-dropdown .fs-dropdown-list li{margin:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li a,#plugin-information .fs-dropdown .fs-dropdown-list li a{display:block;padding:5px 10px;text-decoration:none;text-shadow:none}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover,#plugin-information .fs-dropdown .fs-dropdown-list li:hover{background-color:#0074a3;color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover a,#plugin-information .fs-dropdown .fs-dropdown-list li:hover a{color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown:not(.up) .fs-dropdown-list,#plugin-information .fs-dropdown:not(.up) .fs-dropdown-list{-moz-border-radius:3px 0 3px 3px;-webkit-border-radius:3px 0 3px 3px;border-radius:3px 0 3px 3px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.up .fs-dropdown-list,#plugin-information .fs-dropdown.up .fs-dropdown-list{-moz-border-radius:3px 3px 0 3px;-webkit-border-radius:3px 3px 0 3px;border-radius:3px 3px 0 3px}#plugin-information .fs-dropdown .button-group{width:100%}#plugin-information .fs-dropdown .button-group .button{float:none;font-size:14px;font-weight:normal;text-transform:none}#plugin-information .fs-dropdown .fs-dropdown-list{margin-top:1px}#plugin-information .fs-dropdown.up .fs-dropdown-list{top:auto;bottom:100%;margin-bottom:2px}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group{text-align:center;display:table}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button{display:table-cell}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button:not(.fs-dropdown-arrow-button){left:1px;width:100%}#plugin-information-footer>.button,#plugin-information-footer .fs-dropdown{position:relative;top:3px}#plugin-information-footer>.button.left,#plugin-information-footer .fs-dropdown.left{float:left}#plugin-information-footer>.right,#plugin-information-footer .fs-dropdown{float:right}@media screen and (max-width: 961px){#fs_addons .fs-cards-list .fs-card{height:265px}}
1
  .fs-badge{position:absolute;top:10px;right:0;background:#71ae00;color:white;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);box-shadow:0 2px 1px -1px rgba(0,0,0,0.3)}#fs_addons .fs-cards-list{list-style:none}#fs_addons .fs-cards-list .fs-card{float:left;height:152px;width:310px;padding:0;margin:0 0 30px 30px;font-size:14px;list-style:none;border:1px solid #ddd;cursor:pointer;position:relative}#fs_addons .fs-cards-list .fs-card .fs-overlay{position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#fs_addons .fs-cards-list .fs-card .fs-inner{background-color:#fff;overflow:hidden;height:100%;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner>ul{-moz-transition:all,0.15s;-o-transition:all,0.15s;-ms-transition:all,0.15s;-webkit-transition:all,0.15s;transition:all,0.15s;left:0;right:0;top:0;position:absolute}#fs_addons .fs-cards-list .fs-card .fs-inner>ul>li{list-style:none;line-height:18px;padding:0 15px;width:100%;display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner{padding:0;margin:0;line-height:0;display:block;height:100px;background-repeat:repeat-x;background-size:100% 100%;-moz-transition:all,0.15s;-o-transition:all,0.15s;-ms-transition:all,0.15s;-webkit-transition:all,0.15s;transition:all,0.15s}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner .fs-badge.fs-installed-addon-badge{font-size:1.02em;line-height:1.3em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-title{margin:10px 0 0 0;height:18px;overflow:hidden;color:#000;white-space:nowrap;text-overflow:ellipsis;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-offer{font-size:0.9em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-description{background-color:#f9f9f9;padding:10px 15px 100px 15px;border-top:1px solid #eee;margin:0 0 10px 0;color:#777}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-tag{position:absolute;top:10px;right:0px;background:greenyellow;display:block;padding:2px 10px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.3);box-shadow:1px 1px 1px rgba(0,0,0,0.3);text-transform:uppercase;font-size:0.9em;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button,#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button-group{position:absolute;top:112px;right:10px}@media screen and (min-width: 960px){#fs_addons .fs-cards-list .fs-card:hover .fs-overlay{border:2px solid #29abe1;margin-left:-1px;margin-top:-1px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner ul{top:-100px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-title,#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-offer{color:#29abe1}}
2
+ #TB_window,#TB_window iframe{width:821px !important}#plugin-information .fyi{width:266px !important}#plugin-information #section-holder{margin-right:299px}#plugin-information #section-description h2,#plugin-information #section-description h3,#plugin-information #section-description p,#plugin-information #section-description b,#plugin-information #section-description i,#plugin-information #section-description blockquote,#plugin-information #section-description li,#plugin-information #section-description ul,#plugin-information #section-description ol{clear:none}#plugin-information #section-description iframe{max-width:100%}#plugin-information #section-description .fs-selling-points{padding-bottom:10px;border-bottom:1px solid #ddd}#plugin-information #section-description .fs-selling-points ul{margin:0}#plugin-information #section-description .fs-selling-points ul li{padding:0;list-style:none outside none}#plugin-information #section-description .fs-selling-points ul li i.dashicons{color:#71ae00;font-size:3em;vertical-align:middle;line-height:30px;float:left;margin:0 0 0 -15px}#plugin-information #section-description .fs-selling-points ul li h3{margin:1em 30px !important}#plugin-information #section-description .fs-screenshots:after{content:"";display:table;clear:both}#plugin-information #section-description .fs-screenshots ul{list-style:none;margin:0}#plugin-information #section-description .fs-screenshots ul li{width:225px;height:225px;float:left;margin-bottom:20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#plugin-information #section-description .fs-screenshots ul li a{display:block;width:100%;height:100%;border:1px solid;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2);background-size:cover}#plugin-information #section-description .fs-screenshots ul li.odd{margin-right:20px}#plugin-information .plugin-information-pricing{margin:-16px;border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan h3{margin-top:0;padding:20px;font-size:16px}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper{border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab{cursor:pointer;position:relative;padding:0 10px;font-size:0.9em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab label{text-transform:uppercase;color:green;background:greenyellow;position:absolute;left:-1px;right:-1px;bottom:100%;border:1px solid darkgreen;padding:2px;text-align:center;font-size:0.9em;line-height:1em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab.nav-tab-active{cursor:default;background:#fffeec;border-bottom-color:#fffeec}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle h3{background:#fffeec;margin:0;padding-bottom:0;color:#0073aa}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .nav-tab-wrapper,#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .fs-billing-frequency{display:none}#plugin-information .plugin-information-pricing .fs-plan .fs-pricing-body{background:#fffeec;padding:20px}#plugin-information .plugin-information-pricing .fs-plan .button{width:100%;text-align:center;font-weight:bold;text-transform:uppercase;font-size:1.1em}#plugin-information .plugin-information-pricing .fs-plan label{white-space:nowrap}#plugin-information .plugin-information-pricing .fs-plan var{font-style:normal}#plugin-information .plugin-information-pricing .fs-plan .fs-billing-frequency,#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-align:center;display:block;font-weight:bold;margin-bottom:10px;text-transform:uppercase;background:#F3F3F3;padding:2px;border:1px solid #ccc}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-transform:none;color:green;background:greenyellow}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms{font-size:0.9em}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms i{float:left;margin:0 0 0 -15px}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms li{margin:10px 0 0 0}#plugin-information #section-features .fs-features{margin:-20px -26px}#plugin-information #section-features table{width:100%;border-spacing:0;border-collapse:separate}#plugin-information #section-features table thead th{padding:10px 0}#plugin-information #section-features table thead .fs-price{color:#71ae00;font-weight:normal;display:block;text-align:center}#plugin-information #section-features table tbody td{border-top:1px solid #ccc;padding:10px 0;text-align:center;width:100px;color:#71ae00}#plugin-information #section-features table tbody td:first-child{text-align:left;width:auto;color:inherit;padding-left:26px}#plugin-information #section-features table tbody tr.fs-odd td{background:#fefefe}#plugin-information #section-features .dashicons-yes{width:30px;height:30px;font-size:30px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button,#plugin-information .fs-dropdown .button-group .button{position:relative;width:auto;top:0;right:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button:focus,#plugin-information .fs-dropdown .button-group .button:focus{z-index:10}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .fs-dropdown-arrow,#plugin-information .fs-dropdown .button-group .fs-dropdown-arrow{border-top:6px solid white;border-right:4px solid transparent;border-left:4px solid transparent;top:12px;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button){border-bottom-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button{border-bottom-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button){border-top-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active.up .fs-dropdown-arrow-button{border-top-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list,#plugin-information .fs-dropdown .fs-dropdown-list{position:absolute;right:-1px;top:100%;margin-left:auto;padding:3px 0;border:1px solid #bfbfbf;background-color:#fff;z-index:1;width:230px;text-align:left;-moz-box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);-webkit-box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li,#plugin-information .fs-dropdown .fs-dropdown-list li{margin:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li a,#plugin-information .fs-dropdown .fs-dropdown-list li a{display:block;padding:5px 10px;text-decoration:none;text-shadow:none}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover,#plugin-information .fs-dropdown .fs-dropdown-list li:hover{background-color:#0074a3;color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover a,#plugin-information .fs-dropdown .fs-dropdown-list li:hover a{color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown:not(.up) .fs-dropdown-list,#plugin-information .fs-dropdown:not(.up) .fs-dropdown-list{-moz-border-radius:3px 0 3px 3px;-webkit-border-radius:3px 0 3px 3px;border-radius:3px 0 3px 3px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.up .fs-dropdown-list,#plugin-information .fs-dropdown.up .fs-dropdown-list{-moz-border-radius:3px 3px 0 3px;-webkit-border-radius:3px 3px 0 3px;border-radius:3px 3px 0 3px}#plugin-information .fs-dropdown .button-group{width:100%}#plugin-information .fs-dropdown .button-group .button{float:none;font-size:14px;font-weight:normal;text-transform:none}#plugin-information .fs-dropdown .fs-dropdown-list{margin-top:1px}#plugin-information .fs-dropdown.up .fs-dropdown-list{top:auto;bottom:100%;margin-bottom:2px}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group{text-align:center;display:table}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button{display:table-cell}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button:not(.fs-dropdown-arrow-button){left:1px;width:100%}#plugin-information-footer>.button,#plugin-information-footer .fs-dropdown{position:relative;top:3px}#plugin-information-footer>.button.left,#plugin-information-footer .fs-dropdown.left{float:left}#plugin-information-footer>.right,#plugin-information-footer .fs-dropdown{float:right}@media screen and (max-width: 961px){#fs_addons .fs-cards-list .fs-card{height:265px}}
freemius/assets/css/admin/connect.css CHANGED
File without changes
freemius/assets/js/nojquery.ba-postmessage.js CHANGED
File without changes
freemius/assets/js/nojquery.ba-postmessage.min.js CHANGED
File without changes
freemius/assets/js/postmessage.js CHANGED
File without changes
freemius/config.php CHANGED
@@ -385,4 +385,7 @@
385
 
386
  if ( ! defined( 'WP_FS__DEMO_MODE' ) ) {
387
  define( 'WP_FS__DEMO_MODE', false );
388
- }
 
 
 
385
 
386
  if ( ! defined( 'WP_FS__DEMO_MODE' ) ) {
387
  define( 'WP_FS__DEMO_MODE', false );
388
+ }
389
+ if ( ! defined( 'FS_SDK__SSLVERIFY' ) ) {
390
+ define( 'FS_SDK__SSLVERIFY', false );
391
+ }
freemius/includes/class-freemius-abstract.php CHANGED
File without changes
freemius/includes/class-freemius.php CHANGED
@@ -351,6 +351,14 @@
351
  */
352
  private $is_whitelabeled;
353
 
 
 
 
 
 
 
 
 
354
  #region Uninstall Reasons IDs
355
 
356
  const REASON_NO_LONGER_NEEDED = 1;
@@ -369,6 +377,14 @@
369
  const REASON_DIDNT_WORK_AS_EXPECTED = 14;
370
  const REASON_TEMPORARY_DEACTIVATION = 15;
371
 
 
 
 
 
 
 
 
 
372
  #endregion
373
 
374
  /* Ctor
@@ -816,7 +832,11 @@
816
  return false;
817
  }
818
 
819
- if ( ! $is_tabs_visibility_check && $this->show_settings_with_tabs() ) {
 
 
 
 
820
  /**
821
  * wp.org themes are limited to a single submenu item, and
822
  * sub-submenu items are most likely not allowed (never verified).
@@ -1457,7 +1477,10 @@
1457
  if ( $this->is_plugin() &&
1458
  ! isset( $this->_storage->is_plugin_new_install )
1459
  ) {
1460
- $this->_storage->is_plugin_new_install = false;
 
 
 
1461
  }
1462
  }
1463
 
@@ -1480,6 +1503,13 @@
1480
  -1 < settings.url.indexOf('admin-ajax.php') &&
1481
  ! ( settings.url.indexOf( '<?php echo $admin_param ?>' ) > 0 )
1482
  ) {
 
 
 
 
 
 
 
1483
  if (settings.url.indexOf('?') > 0) {
1484
  settings.url += '&';
1485
  } else {
@@ -1487,7 +1517,6 @@
1487
  }
1488
 
1489
  settings.url += '<?php echo $admin_param ?>=true';
1490
-
1491
  }
1492
  });
1493
  })(jQuery);
@@ -1505,7 +1534,7 @@
1505
  ?>
1506
  <script type="text/javascript">
1507
  (function ($) {
1508
- $('.fs-submenu-item.wp-support-forum').parent().attr('target', '_blank');
1509
  })(jQuery);
1510
  </script>
1511
  <?php
@@ -1601,6 +1630,7 @@
1601
  }
1602
 
1603
  add_action( 'init', array( &$this, '_maybe_add_gdpr_optin_ajax_handler') );
 
1604
  }
1605
 
1606
  if ( $this->is_plugin() ) {
@@ -1632,7 +1662,7 @@
1632
 
1633
  add_action( 'admin_init', array( &$this, '_redirect_on_clicked_menu_link' ), WP_FS__LOWEST_PRIORITY );
1634
 
1635
- if ( $this->is_theme() ) {
1636
  add_action( 'admin_init', array( &$this, '_add_tracking_links' ) );
1637
  }
1638
 
@@ -1644,6 +1674,7 @@
1644
  $this->add_ajax_action( 'update_billing', array( &$this, '_update_billing_ajax_action' ) );
1645
  $this->add_ajax_action( 'start_trial', array( &$this, '_start_trial_ajax_action' ) );
1646
  $this->add_ajax_action( 'set_data_debug_mode', array( &$this, '_set_data_debug_mode' ) );
 
1647
 
1648
  if ( $this->_is_network_active && fs_is_network_admin() ) {
1649
  $this->add_ajax_action( 'network_activate', array( &$this, '_network_activate_ajax_action' ) );
@@ -2006,6 +2037,10 @@
2006
  * @since 2.0.0
2007
  */
2008
  function _hook_action_links_and_register_account_hooks() {
 
 
 
 
2009
  $this->_add_tracking_links();
2010
 
2011
  if ( self::is_plugins_page() && $this->is_plugin() ) {
@@ -2186,6 +2221,12 @@
2186
  );
2187
 
2188
  $store_option = true;
 
 
 
 
 
 
2189
  }
2190
 
2191
  if ( empty( $id_slug_type_path_map[ $module_id ]['path'] ) ||
@@ -4259,7 +4300,7 @@
4259
  )
4260
  ),
4261
  sprintf(
4262
- '<a href="%s" target="_blank"><b>%s</b></a> - %s',
4263
  sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ),
4264
  $install_previous_title,
4265
  $install_previous_desc
@@ -4366,7 +4407,7 @@
4366
  )
4367
  ),
4368
  sprintf(
4369
- '<a href="%s" target="_blank"><b>%s</b></a> - %s',
4370
  sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ),
4371
  $install_previous_title,
4372
  $install_previous_desc
@@ -4887,10 +4928,12 @@
4887
  } else {
4888
  $is_network_admin = fs_is_network_admin();
4889
 
4890
- if (
 
 
 
4891
  $this->_parent->is_registered() &&
4892
  ! $this->is_registered() &&
4893
- $this->has_free_plan() &&
4894
  /**
4895
  * If not registered for add-on and the following conditions for the add-on are met, activate add-on account.
4896
  * * Network active and in network admin - network activate add-on account.
@@ -4904,16 +4947,40 @@
4904
  */
4905
  ( $this->is_network_active() || ! $is_network_admin )
4906
  ) {
4907
- // If parent plugin activated, automatically install add-on for the user.
4908
- $this->_activate_addon_account(
4909
- $this->_parent,
4910
- ( $this->is_network_active() && $is_network_admin ) ?
4911
- true :
4912
- get_current_blog_id()
4913
- );
4914
- } else if ( ! $this->_parent->is_registered() && $this->is_registered() ) {
4915
- // If add-on activated and parent not, automatically install parent for the user.
4916
- $this->activate_parent_account( $this->_parent );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4917
  }
4918
 
4919
  // @todo This should be only executed on activation. It should be migrated to register_activation_hook() together with other activation related logic.
@@ -5415,7 +5482,10 @@
5415
  * @return bool
5416
  */
5417
  function is_extensions_tracking_allowed() {
5418
- return (true === $this->_storage->get( 'is_extensions_tracking_allowed', true ) );
 
 
 
5419
  }
5420
 
5421
  /**
@@ -5601,6 +5671,7 @@
5601
  $this->_anonymous_mode = $this->get_bool_option( $plugin_info, 'anonymous_mode', false );
5602
  }
5603
  $this->_permissions = $this->get_option( $plugin_info, 'permissions', array() );
 
5604
 
5605
  if ( ! empty( $plugin_info['trial'] ) ) {
5606
  $this->_trial_days = $this->get_numeric_option(
@@ -7078,6 +7149,8 @@
7078
  * @since 1.0.7
7079
  */
7080
  function _admin_init_action() {
 
 
7081
  /**
7082
  * Automatically redirect to connect/activation page after plugin activation.
7083
  *
@@ -7090,12 +7163,16 @@
7090
  /**
7091
  * Don't redirect if activating multiple plugins at once (bulk activation).
7092
  */
7093
- } else {
7094
  $this->_redirect_on_activation_hook();
7095
  return;
7096
  }
7097
  }
7098
 
 
 
 
 
7099
  if ( fs_request_is_action( $this->get_unique_affix() . '_skip_activation' ) ) {
7100
  check_admin_referer( $this->get_unique_affix() . '_skip_activation' );
7101
 
@@ -7126,7 +7203,7 @@
7126
  )
7127
  ) {
7128
  if ( ! $this->is_pending_activation() ) {
7129
- if ( ! $this->_menu->is_activation_page( $this->show_opt_in_on_themes_page() ) ) {
7130
  /**
7131
  * If a user visits any other admin page before activating the premium-only theme with a valid
7132
  * license, reactivate the previous theme.
@@ -7660,7 +7737,10 @@
7660
  * @author Leo Fajardo (@leorw)
7661
  * @since 1.2.2
7662
  */
7663
- if ( is_plugin_active( $other_version_basename ) ) {
 
 
 
7664
  deactivate_plugins( $other_version_basename );
7665
  }
7666
  }
@@ -7769,8 +7849,17 @@
7769
  $this->_storage->is_plugin_new_install = empty( $this->_storage->plugin_last_version );
7770
  }
7771
 
 
 
 
 
 
 
 
 
 
7772
  if ( ! $this->_anonymous_mode &&
7773
- $this->has_api_connectivity( WP_FS__DEV_MODE ) &&
7774
  ! $this->_isAutoInstall
7775
  ) {
7776
  // Store hint that the plugin was just activated to enable auto-redirection to settings.
@@ -7803,11 +7892,20 @@
7803
  return;
7804
  }
7805
 
7806
- $license = $this->get_addon_active_parent_license();
7807
  if ( ! is_object( $license ) ) {
7808
  return;
7809
  }
7810
 
 
 
 
 
 
 
 
 
 
7811
  if ( ! $this->is_registered() ) {
7812
  // Opt in with a license key.
7813
  $this->opt_in(
@@ -7830,7 +7928,6 @@
7830
  }
7831
  }
7832
 
7833
-
7834
  /**
7835
  * @author Leo Fajardo (@leorw)
7836
  * @since 2.3.0
@@ -7846,12 +7943,21 @@
7846
 
7847
  $license = ( ! is_null( $license ) ) ?
7848
  $license :
7849
- $this->get_addon_active_parent_license();
7850
 
7851
  if ( ! is_object( $license ) ) {
7852
  return;
7853
  }
7854
 
 
 
 
 
 
 
 
 
 
7855
  if ( ! $this->is_network_registered() ) {
7856
  $sites = $this->get_sites_for_network_level_optin();
7857
 
@@ -7915,16 +8021,217 @@
7915
  }
7916
 
7917
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7918
  * @author Leo Fajardo (@leorw)
7919
  * @since 2.3.0
7920
  *
 
 
 
7921
  * @return FS_Plugin_License
7922
  */
7923
- private function get_addon_active_parent_license() {
7924
  $parent_licenses_endpoint = "/plugins/{$this->get_id()}/parent_licenses.json?filter=activatable";
7925
- $parent_instance = $this->get_parent_instance();
7926
 
7927
- $foreign_licenses = $parent_instance->get_foreign_licenses_info(
 
 
 
 
 
 
 
 
 
 
7928
  self::get_all_licenses( $this->get_parent_id() )
7929
  );
7930
 
@@ -7938,7 +8245,7 @@
7938
  $parent_licenses_endpoint = add_query_arg( $foreign_licenses, $parent_licenses_endpoint );
7939
  }
7940
 
7941
- $result = $parent_instance->get_current_or_network_user_api_scope()->get( $parent_licenses_endpoint, true );
7942
 
7943
  if (
7944
  ! $this->is_api_result_object( $result, 'licenses' ) ||
@@ -7948,9 +8255,24 @@
7948
  return null;
7949
  }
7950
 
7951
- $license = new FS_Plugin_License( $result->licenses[ 0 ] );
7952
 
7953
- return $license;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7954
  }
7955
 
7956
  /**
@@ -8703,12 +9025,25 @@
8703
  'is_uninstalled' => false,
8704
  );
8705
 
8706
- $plugins_update_data[] = $new_plugin;
8707
  $network_plugins_cache->plugins[ $basename ] = $new_plugin;
8708
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8709
  if ( isset( $site_active_plugins[ $basename ] ) ) {
8710
  $site_active_plugins_cache->plugins[ $basename ] = $new_plugin;
8711
- $site_active_plugins_cache->plugins[ $basename ]['is_active'] = true;
8712
  }
8713
  }
8714
  }
@@ -10108,6 +10443,10 @@
10108
 
10109
  $class_name = '';
10110
 
 
 
 
 
10111
  switch ( $option_name ) {
10112
  case 'plugins':
10113
  case 'themes':
@@ -10392,6 +10731,18 @@
10392
  return ( is_object( $this->_site ) && $this->_site->is_tracking_allowed() );
10393
  }
10394
 
 
 
 
 
 
 
 
 
 
 
 
 
10395
  /**
10396
  * @author Vova Feldman (@svovaf)
10397
  * @since 1.0.4
@@ -12675,6 +13026,10 @@
12675
  * @since 1.2.0
12676
  */
12677
  function _add_license_activation() {
 
 
 
 
12678
  if ( ! $this->is_user_admin() ) {
12679
  // Only admins can activate a license.
12680
  return;
@@ -12733,7 +13088,9 @@
12733
  return;
12734
  }
12735
 
12736
- if ( empty( $this->get_installs_ids_with_foreign_licenses() ) ) {
 
 
12737
  // Handle user change only when the parent product or one of its add-ons is activated with a foreign license.
12738
  return;
12739
  }
@@ -12790,6 +13147,61 @@
12790
  }
12791
  }
12792
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12793
  /**
12794
  * @author Leo Fajardo (@leorw)
12795
  * @since 2.3.0
@@ -12869,11 +13281,13 @@
12869
  exit;
12870
  }
12871
 
 
 
 
 
12872
  $result = $this->activate_license(
12873
  $license_key,
12874
- fs_is_network_admin() ?
12875
- fs_request_get( 'sites', array(), 'post' ) :
12876
- array(),
12877
  fs_request_get_bool( 'is_marketing_allowed', null ),
12878
  fs_request_get( 'blog_id', null ),
12879
  fs_request_get( 'module_id', null, 'post' ),
@@ -12881,6 +13295,16 @@
12881
  fs_request_get_bool( 'is_extensions_tracking_allowed', true )
12882
  );
12883
 
 
 
 
 
 
 
 
 
 
 
12884
  echo json_encode( $result );
12885
 
12886
  exit;
@@ -12967,6 +13391,46 @@
12967
  }
12968
 
12969
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12970
  * A helper method to activate migrated licenses. If the product is network activated and integrated, the method will network activate the license.
12971
  *
12972
  * @author Vova Feldman (@svovaf)
@@ -12975,6 +13439,8 @@
12975
  * @param string $license_key
12976
  * @param null|bool $is_marketing_allowed
12977
  * @param null|number $plugin_id
 
 
12978
  *
12979
  * @return array {
12980
  * @var bool $success
@@ -12987,17 +13453,19 @@
12987
  function activate_migrated_license(
12988
  $license_key,
12989
  $is_marketing_allowed = null,
12990
- $plugin_id = null
 
 
12991
  ) {
12992
  $this->_logger->entrance();
12993
 
12994
  $result = $this->activate_license(
12995
  $license_key,
12996
- $this->is_network_active() ?
12997
  $this->get_sites_for_network_level_optin() :
12998
- array(),
12999
  $is_marketing_allowed,
13000
- null,
13001
  $plugin_id
13002
  );
13003
 
@@ -13007,6 +13475,32 @@
13007
  return $result;
13008
  }
13009
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13010
  /**
13011
  * The implementation of this method was previously in `_activate_license_ajax_action()`.
13012
  *
@@ -13039,7 +13533,12 @@
13039
 
13040
  $license_key = trim( $license_key );
13041
 
13042
- if ( ! fs_is_network_admin() ) {
 
 
 
 
 
13043
  // If the license activation is executed outside the context of a network admin, ignore the sites collection.
13044
  $sites = array();
13045
  }
@@ -13068,8 +13567,17 @@
13068
  $user = $fs->get_current_or_network_user();
13069
  }
13070
 
 
 
 
 
 
 
 
 
 
13071
  if ( is_object( $user ) ) {
13072
- if ( fs_is_network_admin() && ! $has_valid_blog_id ) {
13073
  // If no specific blog ID was provided, activate the license for all sites in the network.
13074
  $blog_2_install_map = array();
13075
  $site_ids = array();
@@ -13108,16 +13616,6 @@
13108
  }
13109
  }
13110
  } else {
13111
- if ( $has_valid_blog_id ) {
13112
- /**
13113
- * If a specific blog ID was provided, activate the license only for the install that is
13114
- * associated with the given blog ID.
13115
- *
13116
- * @author Leo Fajardo (@leorw)
13117
- */
13118
- $fs->switch_to_blog( $blog_id );
13119
- }
13120
-
13121
  if ( $fs->is_registered() ) {
13122
  $params = array(
13123
  'license_key' => $fs->apply_filters( 'license_key', $license_key )
@@ -13172,13 +13670,19 @@
13172
  if ( empty( $error ) ) {
13173
  $fs->network_upgrade_mode_completed();
13174
 
 
 
 
 
 
 
13175
  $fs->_sync_license( true, $has_valid_blog_id );
13176
 
13177
  $this->maybe_sync_install_user();
13178
 
13179
  $next_page = $fs->is_addon() ?
13180
  $fs->get_parent_instance()->get_account_url() :
13181
- $fs->get_account_url();
13182
  }
13183
  } else {
13184
  $next_page = $fs->opt_in(
@@ -13196,7 +13700,7 @@
13196
  if ( isset( $next_page->error ) ) {
13197
  $error = $next_page->error;
13198
  } else {
13199
- if ( fs_is_network_admin() ) {
13200
  /**
13201
  * Get the list of sites that were just opted-in (and license activated).
13202
  * This is an optimization for the next part below saving some DB queries.
@@ -14310,7 +14814,12 @@
14310
  * @return bool
14311
  */
14312
  function is_user_in_admin() {
14313
- return is_admin() && ! self::is_ajax() && ! self::is_cron();
 
 
 
 
 
14314
  }
14315
 
14316
  /**
@@ -14622,9 +15131,18 @@
14622
  if ( function_exists( 'get_sites' ) ) {
14623
  // For WP 4.6 and above.
14624
  return get_sites( $args );
14625
- } else if ( function_exists( 'wp_get_sites' ) ) {
14626
  // For WP 3.7 to WP 4.5.
14627
- return wp_get_sites( $args );
 
 
 
 
 
 
 
 
 
14628
  } else {
14629
  // For WP 3.6 and below.
14630
  return get_blog_list( 0, 'all' );
@@ -14801,7 +15319,7 @@
14801
  * @return bool Since 2.3.1 returns if a switch was made.
14802
  */
14803
  function switch_to_blog( $blog_id, FS_Site $install = null ) {
14804
- if ( $blog_id == $this->_context_is_network_or_blog_id ) {
14805
  return false;
14806
  }
14807
 
@@ -16188,6 +16706,8 @@
16188
  'http' => 402
16189
  );
16190
 
 
 
16191
  return $result;
16192
  }
16193
 
@@ -17034,10 +17554,15 @@
17034
  * @author Vova Feldman (@svovaf)
17035
  * @since 1.0.6
17036
  *
17037
- * @param Freemius $parent_fs
17038
- * @param bool|int|null $network_level_or_blog_id True for network level opt-in and integer for opt-in for specified blog in the network.
 
17039
  */
17040
- private function _activate_addon_account( Freemius $parent_fs, $network_level_or_blog_id = null ) {
 
 
 
 
17041
  if ( $this->is_registered() ) {
17042
  // Already activated.
17043
  return;
@@ -17076,6 +17601,10 @@
17076
  }
17077
  }
17078
 
 
 
 
 
17079
  // Activate add-on with parent plugin credentials.
17080
  $result = $parent_fs->get_api_site_scope()->call(
17081
  "/addons/{$this->_plugin->id}/installs.json",
@@ -17084,16 +17613,25 @@
17084
  );
17085
 
17086
  if ( ! $this->is_api_result_object( $result, 'installs' ) ) {
17087
- $error_message = FS_Api::is_api_error_object( $result ) ?
17088
- $result->error->message :
17089
- $this->get_text_inline( 'An unknown error has occurred.', 'unknown-error' );
 
 
 
 
 
 
 
 
17090
 
17091
- $this->_admin_notices->add(
17092
- sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' .
17093
- $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '<b>' . $error_message . '</b>',
17094
- $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...',
17095
- 'error'
17096
- );
 
17097
 
17098
  return;
17099
  }
@@ -17126,21 +17664,29 @@
17126
 
17127
  if ( ! fs_is_network_admin() ) {
17128
  // Try to activate premium license.
17129
- $this->_activate_license( true );
17130
- } else {
17131
- $license_id = fs_request_get( 'license_id' );
17132
 
17133
- if ( is_object( $this->_site ) &&
17134
- FS_Plugin_License::is_valid_id( $license_id ) &&
17135
- $license_id == $this->_site->license_id
17136
- ) {
17137
- // License is already activated.
17138
- return;
17139
  }
 
 
 
 
 
17140
 
17141
- $premium_license = FS_Plugin_License::is_valid_id( $license_id ) ?
17142
- $this->_get_license_by_id( $license_id ) :
17143
- $this->_get_available_premium_license();
 
 
 
 
 
 
 
 
 
17144
 
17145
  if ( is_object( $premium_license ) ) {
17146
  $this->maybe_network_activate_addon_license( $premium_license );
@@ -19438,9 +19984,11 @@
19438
  *
19439
  * @author Vova Feldman (@svovaf)
19440
  * @since 1.2.1
 
 
19441
  */
19442
- function has_active_valid_license() {
19443
- return self::is_active_valid_license( $this->_license );
19444
  }
19445
 
19446
  /**
@@ -19532,15 +20080,16 @@
19532
  * @since 2.1.3
19533
  *
19534
  * @param FS_Plugin_License $license
 
19535
  *
19536
  * @return bool
19537
  */
19538
- private static function is_active_valid_license( $license ) {
19539
  return (
19540
  is_object( $license ) &&
19541
  FS_Plugin_License::is_valid_id( $license->id ) &&
19542
  $license->is_active() &&
19543
- $license->is_valid()
19544
  );
19545
  }
19546
 
@@ -19594,6 +20143,22 @@
19594
  );
19595
  }
19596
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19597
  /**
19598
  * Check if user is a trial or have feature enabled license.
19599
  *
@@ -20186,6 +20751,13 @@
20186
  }
20187
 
20188
  if ( 'none' !== $plan_change ) {
 
 
 
 
 
 
 
20189
  $this->do_action( 'after_license_change', $plan_change, $this->get_plan() );
20190
  }
20191
  }
@@ -20909,7 +21481,7 @@
20909
  */
20910
  private function get_latest_download_link( $label, $plugin_id = false ) {
20911
  return sprintf(
20912
- '<a target="_blank" href="%s">%s</a>',
20913
  $this->_get_latest_download_local_url( $plugin_id ),
20914
  $label
20915
  );
@@ -20980,7 +21552,7 @@
20980
  $this->get_text_inline( 'Version %s was released.', 'version-x-released' ) . ' ' . $this->get_text_inline( 'Please download %s.', 'please-download-x' ),
20981
  $update->version,
20982
  sprintf(
20983
- '<a href="%s" target="_blank">%s</a>',
20984
  $this->get_account_url( 'download_latest' ),
20985
  sprintf(
20986
  /* translators: %s: plan name (e.g. latest "Professional" version) */
@@ -21467,7 +22039,7 @@
21467
  $this->get_plugin_title(),
21468
  fs_strip_url_protocol( get_site_url( $blog_id ) ),
21469
  sprintf(
21470
- '<a href="%s" target="_blank">%s</a>',
21471
  'https://freemius.com',
21472
  'freemius.com'
21473
  )
@@ -21566,6 +22138,18 @@
21566
 
21567
  if ( is_object( $fs ) ) {
21568
  $fs->_activate_license();
 
 
 
 
 
 
 
 
 
 
 
 
21569
  }
21570
 
21571
  return;
@@ -21788,6 +22372,26 @@
21788
 
21789
  $this->_handle_account_edits();
21790
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21791
  $this->do_action( 'account_page_load_before_departure' );
21792
  }
21793
 
@@ -21924,6 +22528,86 @@
21924
  }
21925
  }
21926
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21927
  #----------------------------------------------------------------------------------
21928
  #region Contact Us
21929
  #----------------------------------------------------------------------------------
@@ -22152,6 +22836,43 @@
22152
  $this->get_api_plugin_scope();
22153
  }
22154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22155
  /**
22156
  * Show trial promotional notice (if any trial exist).
22157
  *
@@ -22705,14 +23426,18 @@
22705
  return;
22706
  }
22707
 
22708
- if ( $this->is_registered() && $this->is_tracking_allowed() ) {
22709
- if ( ! $this->is_enable_anonymous() ) {
22710
- // If opted in and tracking is allowed, don't allow to opt out if anonymous mode is disabled.
22711
- return;
22712
- }
 
 
 
22713
 
22714
- if ( ! $this->is_free_plan() ) {
22715
- // Don't allow to opt out if running in paid plan.
 
22716
  return;
22717
  }
22718
  }
@@ -22792,7 +23517,7 @@
22792
  if ( ! empty( $this->_dynamically_added_top_level_page_hook_name ) ) {
22793
  if ( $this->is_network_registered() ) {
22794
  $page = 'account';
22795
- } else if ( $this->is_network_anonymous() ) {
22796
  $this->maybe_set_slug_and_network_menu_exists_flag();
22797
  }
22798
  }
@@ -22827,10 +23552,12 @@
22827
  * @since 1.0.3
22828
  */
22829
  function _redirect_on_activation_hook() {
22830
- $url = $this->get_after_plugin_activation_redirect_url();
 
22831
 
22832
- if ( is_string( $url ) ) {
22833
- fs_redirect( $url );
 
22834
  }
22835
  }
22836
 
@@ -22870,7 +23597,7 @@
22870
 
22871
  foreach ( $this->_action_links as $new_links ) {
22872
  foreach ( $new_links as $link ) {
22873
- $before_deactivate[ $link['key'] ] = '<a href="' . $link['href'] . '"' . ( $link['external'] ? ' target="_blank"' : '' ) . '>' . $link['label'] . '</a>';
22874
  }
22875
  }
22876
 
@@ -22990,7 +23717,7 @@
22990
  '';
22991
 
22992
  return sprintf(
22993
- ' %s: <ol><li>%s.</li>%s<li>%s (<a href="%s" target="_blank">%s</a>).</li></ol>',
22994
  $this->get_text_inline( 'Please follow these steps to complete the upgrade', 'follow-steps-to-complete-upgrade' ),
22995
  ( empty( $activate_license_string ) ? '' : $activate_license_string . '</li><li>' ) .
22996
  $this->get_latest_download_link( sprintf(
@@ -23243,6 +23970,14 @@
23243
  */
23244
  function set_plugin_upgrade_complete() {
23245
  $this->_storage->plugin_upgrade_mode = false;
 
 
 
 
 
 
 
 
23246
  }
23247
 
23248
  #endregion
351
  */
352
  private $is_whitelabeled;
353
 
354
+ /**
355
+ * @author Leo Fajardo (@leorw)
356
+ * @since 2.4.0
357
+ *
358
+ * @var bool
359
+ */
360
+ private $_is_bundle_license_auto_activation_enabled = false;
361
+
362
  #region Uninstall Reasons IDs
363
 
364
  const REASON_NO_LONGER_NEEDED = 1;
377
  const REASON_DIDNT_WORK_AS_EXPECTED = 14;
378
  const REASON_TEMPORARY_DEACTIVATION = 15;
379
 
380
+ /**
381
+ * @author Leo Fajardo (@leorw)
382
+ * @since 2.3.1
383
+ *
384
+ * @var boolean|null
385
+ */
386
+ private $_use_external_pricing = null;
387
+
388
  #endregion
389
 
390
  /* Ctor
832
  return false;
833
  }
834
 
835
+ if (
836
+ ! $is_tabs_visibility_check &&
837
+ $this->is_org_repo_compliant() &&
838
+ $this->show_settings_with_tabs()
839
+ ) {
840
  /**
841
  * wp.org themes are limited to a single submenu item, and
842
  * sub-submenu items are most likely not allowed (never verified).
1477
  if ( $this->is_plugin() &&
1478
  ! isset( $this->_storage->is_plugin_new_install )
1479
  ) {
1480
+ $this->_storage->is_plugin_new_install = (
1481
+ ! is_plugin_active( $this->_plugin_basename ) &&
1482
+ empty( $this->_storage->plugin_last_version )
1483
+ );
1484
  }
1485
  }
1486
 
1503
  -1 < settings.url.indexOf('admin-ajax.php') &&
1504
  ! ( settings.url.indexOf( '<?php echo $admin_param ?>' ) > 0 )
1505
  ) {
1506
+ if (
1507
+ 'string' === typeof settings.data &&
1508
+ settings.data.indexOf( 'action=heartbeat' ) > 0
1509
+ ) {
1510
+ return;
1511
+ }
1512
+
1513
  if (settings.url.indexOf('?') > 0) {
1514
  settings.url += '&';
1515
  } else {
1517
  }
1518
 
1519
  settings.url += '<?php echo $admin_param ?>=true';
 
1520
  }
1521
  });
1522
  })(jQuery);
1534
  ?>
1535
  <script type="text/javascript">
1536
  (function ($) {
1537
+ $('.fs-submenu-item.wp-support-forum').parent().attr( { target: '_blank', rel: 'noopener noreferrer' } );
1538
  })(jQuery);
1539
  </script>
1540
  <?php
1630
  }
1631
 
1632
  add_action( 'init', array( &$this, '_maybe_add_gdpr_optin_ajax_handler') );
1633
+ add_action( 'init', array( &$this, '_maybe_add_pricing_ajax_handler' ) );
1634
  }
1635
 
1636
  if ( $this->is_plugin() ) {
1662
 
1663
  add_action( 'admin_init', array( &$this, '_redirect_on_clicked_menu_link' ), WP_FS__LOWEST_PRIORITY );
1664
 
1665
+ if ( $this->is_theme() && ! $this->is_migration() ) {
1666
  add_action( 'admin_init', array( &$this, '_add_tracking_links' ) );
1667
  }
1668
 
1674
  $this->add_ajax_action( 'update_billing', array( &$this, '_update_billing_ajax_action' ) );
1675
  $this->add_ajax_action( 'start_trial', array( &$this, '_start_trial_ajax_action' ) );
1676
  $this->add_ajax_action( 'set_data_debug_mode', array( &$this, '_set_data_debug_mode' ) );
1677
+ $this->add_ajax_action( 'toggle_whitelabel_mode', array( &$this, '_toggle_whitelabel_mode_ajax_handler' ) );
1678
 
1679
  if ( $this->_is_network_active && fs_is_network_admin() ) {
1680
  $this->add_ajax_action( 'network_activate', array( &$this, '_network_activate_ajax_action' ) );
2037
  * @since 2.0.0
2038
  */
2039
  function _hook_action_links_and_register_account_hooks() {
2040
+ if ( $this->is_migration() ) {
2041
+ return;
2042
+ }
2043
+
2044
  $this->_add_tracking_links();
2045
 
2046
  if ( self::is_plugins_page() && $this->is_plugin() ) {
2221
  );
2222
 
2223
  $store_option = true;
2224
+ } else if (
2225
+ isset( $id_slug_type_path_map[ $module_id ]['slug'] ) &&
2226
+ $slug !== $id_slug_type_path_map[ $module_id ]['slug']
2227
+ ) {
2228
+ $id_slug_type_path_map[ $module_id ]['slug'] = $slug;
2229
+ $store_option = true;
2230
  }
2231
 
2232
  if ( empty( $id_slug_type_path_map[ $module_id ]['path'] ) ||
4300
  )
4301
  ),
4302
  sprintf(
4303
+ '<a href="%s" target="_blank" rel="noopener noreferrer"><b>%s</b></a> - %s',
4304
  sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ),
4305
  $install_previous_title,
4306
  $install_previous_desc
4407
  )
4408
  ),
4409
  sprintf(
4410
+ '<a href="%s" target="_blank" rel="noopener noreferrer"><b>%s</b></a> - %s',
4411
  sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ),
4412
  $install_previous_title,
4413
  $install_previous_desc
4928
  } else {
4929
  $is_network_admin = fs_is_network_admin();
4930
 
4931
+ if ( ! $this->_parent->is_registered() && $this->is_registered() ) {
4932
+ // If add-on activated and parent not, automatically install parent for the user.
4933
+ $this->activate_parent_account( $this->_parent );
4934
+ } else if (
4935
  $this->_parent->is_registered() &&
4936
  ! $this->is_registered() &&
 
4937
  /**
4938
  * If not registered for add-on and the following conditions for the add-on are met, activate add-on account.
4939
  * * Network active and in network admin - network activate add-on account.
4947
  */
4948
  ( $this->is_network_active() || ! $is_network_admin )
4949
  ) {
4950
+ $premium_license = null;
4951
+
4952
+ if (
4953
+ ! $this->has_free_plan() &&
4954
+ $this->is_bundle_license_auto_activation_enabled() &&
4955
+ $this->_parent->is_activated_with_bundle_license()
4956
+ ) {
4957
+ /**
4958
+ * If the add-on has no free plan, try to activate the account only when there's a bundle license.
4959
+ *
4960
+ * @author Leo Fajardo (@leorw)
4961
+ * @since 2.4.0
4962
+ */
4963
+ $bundle_license = $this->get_active_parent_license( $this->_parent->_get_license()->secret_key, false );
4964
+
4965
+ if (
4966
+ is_object( $bundle_license ) &&
4967
+ ! empty( $bundle_license->products ) &&
4968
+ in_array( $this->get_id(), $bundle_license->products )
4969
+ ) {
4970
+ $premium_license = $bundle_license;
4971
+ }
4972
+ }
4973
+
4974
+ if ( $this->has_free_plan() || is_object( $premium_license) ) {
4975
+ // If parent plugin activated, automatically install add-on for the user.
4976
+ $this->_activate_addon_account(
4977
+ $this->_parent,
4978
+ ( $this->is_network_active() && $is_network_admin ) ?
4979
+ true :
4980
+ get_current_blog_id(),
4981
+ $premium_license
4982
+ );
4983
+ }
4984
  }
4985
 
4986
  // @todo This should be only executed on activation. It should be migrated to register_activation_hook() together with other activation related logic.
5482
  * @return bool
5483
  */
5484
  function is_extensions_tracking_allowed() {
5485
+ return ( true === $this->apply_filters(
5486
+ 'is_extensions_tracking_allowed',
5487
+ $this->_storage->get( 'is_extensions_tracking_allowed', true )
5488
+ ) );
5489
  }
5490
 
5491
  /**
5671
  $this->_anonymous_mode = $this->get_bool_option( $plugin_info, 'anonymous_mode', false );
5672
  }
5673
  $this->_permissions = $this->get_option( $plugin_info, 'permissions', array() );
5674
+ $this->_is_bundle_license_auto_activation_enabled = $this->get_option( $plugin_info, 'bundle_license_auto_activation', false );
5675
 
5676
  if ( ! empty( $plugin_info['trial'] ) ) {
5677
  $this->_trial_days = $this->get_numeric_option(
7149
  * @since 1.0.7
7150
  */
7151
  function _admin_init_action() {
7152
+ $is_migration = $this->is_migration();
7153
+
7154
  /**
7155
  * Automatically redirect to connect/activation page after plugin activation.
7156
  *
7163
  /**
7164
  * Don't redirect if activating multiple plugins at once (bulk activation).
7165
  */
7166
+ } else if ( ! $is_migration ) {
7167
  $this->_redirect_on_activation_hook();
7168
  return;
7169
  }
7170
  }
7171
 
7172
+ if ( $is_migration ) {
7173
+ return;
7174
+ }
7175
+
7176
  if ( fs_request_is_action( $this->get_unique_affix() . '_skip_activation' ) ) {
7177
  check_admin_referer( $this->get_unique_affix() . '_skip_activation' );
7178
 
7203
  )
7204
  ) {
7205
  if ( ! $this->is_pending_activation() ) {
7206
+ if ( ! $this->is_activation_page() ) {
7207
  /**
7208
  * If a user visits any other admin page before activating the premium-only theme with a valid
7209
  * license, reactivate the previous theme.
7737
  * @author Leo Fajardo (@leorw)
7738
  * @since 1.2.2
7739
  */
7740
+ if (
7741
+ is_plugin_active( $other_version_basename ) &&
7742
+ $this->apply_filters( 'deactivate_on_activation', true )
7743
+ ) {
7744
  deactivate_plugins( $other_version_basename );
7745
  }
7746
  }
7849
  $this->_storage->is_plugin_new_install = empty( $this->_storage->plugin_last_version );
7850
  }
7851
 
7852
+ /**
7853
+ * Also flush when activating the premium version so that even if Freemius was off before, the API
7854
+ * connectivity test can be run again.
7855
+ *
7856
+ * @author Leo Fajardo (@leorw)
7857
+ * @since 2.2.3.1
7858
+ */
7859
+ $has_api_connectivity = $this->has_api_connectivity( WP_FS__DEV_MODE || $is_premium_version_activation );
7860
+
7861
  if ( ! $this->_anonymous_mode &&
7862
+ $has_api_connectivity &&
7863
  ! $this->_isAutoInstall
7864
  ) {
7865
  // Store hint that the plugin was just activated to enable auto-redirection to settings.
7892
  return;
7893
  }
7894
 
7895
+ $license = $this->get_active_parent_license();
7896
  if ( ! is_object( $license ) ) {
7897
  return;
7898
  }
7899
 
7900
+ if (
7901
+ $this->is_bundle_license_auto_activation_enabled() &&
7902
+ ! empty( $license->products )
7903
+ ) {
7904
+ $this->activate_bundle_license( $license );
7905
+
7906
+ return;
7907
+ }
7908
+
7909
  if ( ! $this->is_registered() ) {
7910
  // Opt in with a license key.
7911
  $this->opt_in(
7928
  }
7929
  }
7930
 
 
7931
  /**
7932
  * @author Leo Fajardo (@leorw)
7933
  * @since 2.3.0
7943
 
7944
  $license = ( ! is_null( $license ) ) ?
7945
  $license :
7946
+ $this->get_active_parent_license();
7947
 
7948
  if ( ! is_object( $license ) ) {
7949
  return;
7950
  }
7951
 
7952
+ if (
7953
+ $this->is_bundle_license_auto_activation_enabled() &&
7954
+ ! empty( $license->products )
7955
+ ) {
7956
+ $this->activate_bundle_license( $license );
7957
+
7958
+ return;
7959
+ }
7960
+
7961
  if ( ! $this->is_network_registered() ) {
7962
  $sites = $this->get_sites_for_network_level_optin();
7963
 
8021
  }
8022
 
8023
  /**
8024
+ * Tries to activate a bundle license for all supported products if the current product is activated with a bundle license. This is called after activating an available license (not via the license activation dialog but by clicking on a license activation button) for a product via its "Account" page.
8025
+ *
8026
+ * @author Leo Fajardo (@leorw)
8027
+ * @since 2.4.0
8028
+ *
8029
+ * @param FS_Plugin_License $license
8030
+ * @param array $sites
8031
+ * @param int $blog_id
8032
+ */
8033
+ private function maybe_activate_bundle_license( FS_Plugin_License $license = null, $sites = array(), $blog_id = 0 ) {
8034
+ if ( ! is_object( $license ) && $this->has_active_valid_license() ) {
8035
+ $license = $this->_license;
8036
+ }
8037
+
8038
+ if ( ! is_object( $license ) ) {
8039
+ return;
8040
+ }
8041
+
8042
+ $parent_license = ( ! empty( $license->products ) ) ?
8043
+ $license :
8044
+ $this->get_active_parent_license( $license->secret_key );
8045
+
8046
+ if ( is_object( $parent_license ) ) {
8047
+ $this->activate_bundle_license( $parent_license, $sites, $blog_id );
8048
+ }
8049
+ }
8050
+
8051
+ /**
8052
+ * Try to activate a bundle license for all the bundle products installed on the site.
8053
+ * (1) If a child product install already has a license, the bundle license won't be activated.
8054
+ * (2) On multi-site networks, if the attempt to activate the bundle license is triggered from the network admin, the bundle license activation will only work for non-delegated sites and only if none of them is associated with a license. Even if one of the sites has the product installed with a license key, skip the bundle license activation for the product.
8055
+ * (3) On multi-site networks, if the attempt to activate the bundle license is triggered from a site-level admin, only activate the license if the product is site-level activated or delegated, and the product installation is not yet associated with a license.
8056
+ *
8057
+ * @author Leo Fajardo (@leorw)
8058
+ * @since 2.4.0
8059
+ *
8060
+ * @param FS_Plugin_License $license
8061
+ * @param array $sites
8062
+ * @param int $current_blog_id
8063
+ */
8064
+ private function activate_bundle_license( $license, $sites = array(), $current_blog_id = 0 ) {
8065
+ $is_network_admin = fs_is_network_admin();
8066
+
8067
+ $installs_by_blog_map = array();
8068
+ $site_info_by_blog_map = array();
8069
+
8070
+ /**
8071
+ * Try to activate the license for all supported products.
8072
+ *
8073
+ * @author Leo Fajardo
8074
+ */
8075
+ foreach ( $license->products as $product_id ) {
8076
+ $fs = self::get_instance_by_id( $product_id );
8077
+
8078
+ if ( ! is_object( $fs ) ) {
8079
+ continue;
8080
+ }
8081
+
8082
+ if ( ! $fs->has_paid_plan() ) {
8083
+ continue;
8084
+ }
8085
+
8086
+ if (
8087
+ ! $fs->is_addon() &&
8088
+ ! FS_Plan_Manager::instance()->has_paid_plan( $fs->_plans )
8089
+ ) {
8090
+ /**
8091
+ * The parent product can be free-only but can have its `has_paid_plan` flag set to `true` when
8092
+ * there is a context bundle.
8093
+ */
8094
+ continue;
8095
+ }
8096
+
8097
+ if ( $current_blog_id > 0 ) {
8098
+ $fs->switch_to_blog( $current_blog_id );
8099
+ }
8100
+
8101
+ if ( $fs->has_active_valid_license() ) {
8102
+ continue;
8103
+ }
8104
+
8105
+ if ( ! $is_network_admin || $current_blog_id > 0 ) {
8106
+ if ( $fs->is_network_active() && ! $fs->is_delegated_connection( $current_blog_id ) ) {
8107
+ // Do not try to activate the license in the site level if the product is network active and the connection was not delegated.
8108
+ continue;
8109
+ }
8110
+ } else {
8111
+ if ( ! $fs->is_network_active() ) {
8112
+ // Do not try to activate the license in the network level if the product is not network active.
8113
+ continue;
8114
+ }
8115
+
8116
+ if ( $fs->is_network_delegated_connection() ) {
8117
+ // Do not try to activate the license in the network level if the activation has been delegated to site admins.
8118
+ continue;
8119
+ }
8120
+
8121
+ $has_install_with_license = false;
8122
+
8123
+ // Collection of sites that have an install entity that is not activated with a license or non-delegated sites that have no install entity, or both types of site.
8124
+ $filtered_sites = array();
8125
+
8126
+ if ( empty( $sites ) ) {
8127
+ $all_sites = self::get_sites();
8128
+
8129
+ foreach ( $all_sites as $site ) {
8130
+ $sites[] = array( 'blog_id' => self::get_site_blog_id( $site ) );
8131
+ }
8132
+ } else {
8133
+ // Populate the map here to avoid calling `$fs->get_site_info( $site );` in the other `for` loop below.
8134
+ foreach ( $sites as $site ) {
8135
+ if ( ! isset( $site['blog_id'] ) || ! is_numeric( $site['blog_id'] ) ) {
8136
+ continue;
8137
+ }
8138
+
8139
+ $site_info_by_blog_map[ $site['blog_id'] ] = $site;
8140
+ }
8141
+ }
8142
+
8143
+ foreach ( $sites as $site ) {
8144
+ if ( ! isset( $site['blog_id'] ) || ! is_numeric( $site['blog_id'] ) ) {
8145
+ continue;
8146
+ }
8147
+
8148
+ $blog_id = $site['blog_id'];
8149
+
8150
+ if ( ! isset( $installs_by_blog_map[ $blog_id ] ) ) {
8151
+ $installs_by_blog_map[ $blog_id ] = self::get_all_sites( $fs->get_module_type(), $blog_id );
8152
+ }
8153
+
8154
+ $installs = $installs_by_blog_map[ $blog_id ];
8155
+ $install = null;
8156
+
8157
+ if ( isset( $installs[ $fs->get_slug() ] ) ) {
8158
+ $install = $installs[ $fs->get_slug() ];
8159
+
8160
+ if (
8161
+ is_object( $install ) &&
8162
+ (
8163
+ ! FS_Site::is_valid_id( $install->id ) ||
8164
+ ! FS_User::is_valid_id( $install->user_id ) ||
8165
+ ! FS_Plugin_Plan::is_valid_id( $install->plan_id )
8166
+ )
8167
+ ) {
8168
+ $install = null;
8169
+ }
8170
+ }
8171
+
8172
+ if (
8173
+ is_object( $install ) &&
8174
+ FS_Plugin_License::is_valid_id( $install->license_id )
8175
+ ) {
8176
+ $has_install_with_license = true;
8177
+ break;
8178
+ }
8179
+
8180
+ if ( $fs->is_site_delegated_connection( $blog_id ) ) {
8181
+ // Site activation delegated, don't activate bundle license on the site in the network admin.
8182
+ continue;
8183
+ }
8184
+
8185
+ if ( ! isset( $site_info_by_blog_map[ $blog_id ] ) ) {
8186
+ $site_info_by_blog_map[ $blog_id ] = $fs->get_site_info( $site );
8187
+ }
8188
+
8189
+ $filtered_sites[] = $site_info_by_blog_map[ $blog_id ];
8190
+ }
8191
+
8192
+ if ( $has_install_with_license || empty( $filtered_sites ) ) {
8193
+ // Do not try to activate the license at the network level if there's any install with a license or there's no site to activate the license on.
8194
+ continue;
8195
+ }
8196
+
8197
+ $sites = $filtered_sites;
8198
+ }
8199
+
8200
+ $fs->activate_migrated_license(
8201
+ $license->secret_key,
8202
+ null,
8203
+ null,
8204
+ $sites,
8205
+ ( $current_blog_id > 0 ? $current_blog_id : null )
8206
+ );
8207
+ }
8208
+ }
8209
+
8210
+ /**
8211
+ * Returns a parent license that can be activated for the context product.
8212
+ *
8213
  * @author Leo Fajardo (@leorw)
8214
  * @since 2.3.0
8215
  *
8216
+ * @param string|null $license_key
8217
+ * @param bool $flush
8218
+ *
8219
  * @return FS_Plugin_License
8220
  */
8221
+ function get_active_parent_license( $license_key = null, $flush = true ) {
8222
  $parent_licenses_endpoint = "/plugins/{$this->get_id()}/parent_licenses.json?filter=activatable";
 
8223
 
8224
+ $fs = $this;
8225
+
8226
+ if ( $this->is_addon() ) {
8227
+ $parent_instance = $this->get_parent_instance();
8228
+
8229
+ if ( is_object( $parent_instance ) && $parent_instance->is_registered() ) {
8230
+ $fs = $parent_instance;
8231
+ }
8232
+ }
8233
+
8234
+ $foreign_licenses = $fs->get_foreign_licenses_info(
8235
  self::get_all_licenses( $this->get_parent_id() )
8236
  );
8237
 
8245
  $parent_licenses_endpoint = add_query_arg( $foreign_licenses, $parent_licenses_endpoint );
8246
  }
8247
 
8248
+ $result = $fs->get_current_or_network_user_api_scope()->get( $parent_licenses_endpoint, $flush );
8249
 
8250
  if (
8251
  ! $this->is_api_result_object( $result, 'licenses' ) ||
8255
  return null;
8256
  }
8257
 
8258
+ $parent_license = null;
8259
 
8260
+ if ( empty( $license_key ) ) {
8261
+ $parent_license = $result->licenses[0];
8262
+ } else {
8263
+ foreach ( $result->licenses as $license ) {
8264
+ if ( $license_key === $license->secret_key ) {
8265
+ $parent_license = $license;
8266
+ break;
8267
+ }
8268
+ }
8269
+ }
8270
+
8271
+ if ( ! is_null( $parent_license ) ) {
8272
+ $parent_license = new FS_Plugin_License( $parent_license );
8273
+ }
8274
+
8275
+ return $parent_license;
8276
  }
8277
 
8278
  /**
9025
  'is_uninstalled' => false,
9026
  );
9027
 
 
9028
  $network_plugins_cache->plugins[ $basename ] = $new_plugin;
9029
 
9030
+ $is_site_level_active = (
9031
+ isset( $site_active_plugins[ $basename ] ) &&
9032
+ $site_active_plugins[ $basename ]['is_active']
9033
+ );
9034
+
9035
+ /**
9036
+ * If not network active, set the activity status based on the site-level plugin status.
9037
+ */
9038
+ if ( ! $new_plugin['is_active'] ) {
9039
+ $new_plugin['is_active'] = $is_site_level_active;
9040
+ }
9041
+
9042
+ $plugins_update_data[] = $new_plugin;
9043
+
9044
  if ( isset( $site_active_plugins[ $basename ] ) ) {
9045
  $site_active_plugins_cache->plugins[ $basename ] = $new_plugin;
9046
+ $site_active_plugins_cache->plugins[ $basename ]['is_active'] = $is_site_level_active;
9047
  }
9048
  }
9049
  }
10443
 
10444
  $class_name = '';
10445
 
10446
+ if ( fs_starts_with( $option_name, WP_FS__MODULE_TYPE_THEME . '_' ) ) {
10447
+ $option_name = str_replace( WP_FS__MODULE_TYPE_THEME . '_', '', $option_name );
10448
+ }
10449
+
10450
  switch ( $option_name ) {
10451
  case 'plugins':
10452
  case 'themes':
10731
  return ( is_object( $this->_site ) && $this->_site->is_tracking_allowed() );
10732
  }
10733
 
10734
+ /**
10735
+ * @author Leo Fajardo (@leorw)
10736
+ * @since 2.4.0
10737
+ *
10738
+ * @return bool
10739
+ */
10740
+ function is_bundle_license_auto_activation_enabled() {
10741
+ return $this->is_addon() ?
10742
+ ( is_object( $this->_parent ) && $this->_parent->is_bundle_license_auto_activation_enabled() ) :
10743
+ $this->_is_bundle_license_auto_activation_enabled;
10744
+ }
10745
+
10746
  /**
10747
  * @author Vova Feldman (@svovaf)
10748
  * @since 1.0.4
13026
  * @since 1.2.0
13027
  */
13028
  function _add_license_activation() {
13029
+ if ( $this->is_migration() ) {
13030
+ return;
13031
+ }
13032
+
13033
  if ( ! $this->is_user_admin() ) {
13034
  // Only admins can activate a license.
13035
  return;
13088
  return;
13089
  }
13090
 
13091
+ $installs_ids_with_foreign_licenses = $this->get_installs_ids_with_foreign_licenses();
13092
+
13093
+ if ( empty( $installs_ids_with_foreign_licenses ) ) {
13094
  // Handle user change only when the parent product or one of its add-ons is activated with a foreign license.
13095
  return;
13096
  }
13147
  }
13148
  }
13149
 
13150
+ /**
13151
+ * @author Edgar Melkonyan
13152
+ * @since 2.4.1
13153
+ *
13154
+ * @throws Freemius_Exception
13155
+ */
13156
+ function _toggle_whitelabel_mode_ajax_handler() {
13157
+ $this->_logger->entrance();
13158
+
13159
+ $this->check_ajax_referer( 'toggle_whitelabel_mode' );
13160
+
13161
+ if ( ! $this->is_user_admin() ) {
13162
+ // Only for admins.
13163
+ self::shoot_ajax_failure();
13164
+ }
13165
+
13166
+ $license = $this->get_api_user_scope()->call(
13167
+ "/licenses/{$this->_site->license_id}.json",
13168
+ 'put',
13169
+ array( 'is_whitelabeled' => ! $this->_license->is_whitelabeled )
13170
+ );
13171
+
13172
+ if ( ! $this->is_api_result_entity( $license ) ) {
13173
+ self::shoot_ajax_failure(
13174
+ FS_Api::is_api_error_object( $license ) ?
13175
+ $license->error->message :
13176
+ fs_text_inline( "An unknown error has occurred while trying to toggle the license's white-label mode.", 'unknown-error-occurred', $this->get_slug() )
13177
+ );
13178
+ }
13179
+
13180
+ $this->_license->is_whitelabeled = $license->is_whitelabeled;
13181
+ $this->_store_licenses();
13182
+
13183
+ $this->_sync_license();
13184
+
13185
+ if ( ! $license->is_whitelabeled ) {
13186
+ $this->_admin_notices->remove_sticky( 'license_whitelabeled' );
13187
+ } else {
13188
+ $this->_admin_notices->add_sticky(
13189
+ sprintf(
13190
+ $this->get_text_inline(
13191
+ 'Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.',
13192
+ 'license_whitelabeled'
13193
+ ),
13194
+ "<strong>{$this->get_plugin_title()}</strong>",
13195
+ sprintf( '<a href="https://users.freemius.com" target="_blank">%s</a>', $this->get_text_inline( 'User Dashboard', 'user-dashboard' ) ),
13196
+ sprintf( '<a href="#" class="fs-toggle-whitelabel-mode">%s</a>', $this->get_text_inline( 'revert it now', 'revert-it-now' ) )
13197
+ ),
13198
+ 'license_whitelabeled'
13199
+ );
13200
+ }
13201
+
13202
+ self::shoot_ajax_response( array( 'success' => true ) );
13203
+ }
13204
+
13205
  /**
13206
  * @author Leo Fajardo (@leorw)
13207
  * @since 2.3.0
13281
  exit;
13282
  }
13283
 
13284
+ $sites = fs_is_network_admin() ?
13285
+ fs_request_get( 'sites', array(), 'post' ) :
13286
+ array();
13287
+
13288
  $result = $this->activate_license(
13289
  $license_key,
13290
+ $sites,
 
 
13291
  fs_request_get_bool( 'is_marketing_allowed', null ),
13292
  fs_request_get( 'blog_id', null ),
13293
  fs_request_get( 'module_id', null, 'post' ),
13295
  fs_request_get_bool( 'is_extensions_tracking_allowed', true )
13296
  );
13297
 
13298
+ if (
13299
+ $result['success'] &&
13300
+ $this->is_bundle_license_auto_activation_enabled()
13301
+ ) {
13302
+ $license = new FS_Plugin_License();
13303
+ $license->secret_key = $license_key;
13304
+
13305
+ $this->maybe_activate_bundle_license( $license, $sites );
13306
+ }
13307
+
13308
  echo json_encode( $result );
13309
 
13310
  exit;
13391
  }
13392
 
13393
  /**
13394
+ * @author Leo Fajardo (@leorw)
13395
+ * @since 2.3.2.14
13396
+ */
13397
+ function starting_migration() {
13398
+ if ( ! empty( $this->_storage->license_migration ) ) {
13399
+ // Do not overwrite the data if already set.
13400
+ return;
13401
+ }
13402
+
13403
+ $this->_storage->license_migration = array(
13404
+ 'is_migrating' => true,
13405
+ 'start_timestamp' => time()
13406
+ );
13407
+ }
13408
+
13409
+ /**
13410
+ * @author Leo Fajardo (@leorw)
13411
+ * @since 2.3.2.14
13412
+ */
13413
+ function is_migration() {
13414
+ if ( $this->is_addon() ) {
13415
+ return $this->get_parent_instance()->is_migration();
13416
+ }
13417
+
13418
+ if ( empty( $this->_storage->license_migration ) ) {
13419
+ return false;
13420
+ }
13421
+
13422
+ if ( ! $this->_storage->license_migration['is_migrating'] ) {
13423
+ return false;
13424
+ }
13425
+
13426
+ return (
13427
+ // Return `true` if the migration is within 5 minutes from the starting time.
13428
+ ( time() - $this->_storage->license_migration['start_timestamp'] ) <= WP_FS__TIME_5_MIN_IN_SEC
13429
+ );
13430
+ }
13431
+
13432
+ /**
13433
+ *
13434
  * A helper method to activate migrated licenses. If the product is network activated and integrated, the method will network activate the license.
13435
  *
13436
  * @author Vova Feldman (@svovaf)
13439
  * @param string $license_key
13440
  * @param null|bool $is_marketing_allowed
13441
  * @param null|number $plugin_id
13442
+ * @param array $sites
13443
+ * @param int $blog_id
13444
  *
13445
  * @return array {
13446
  * @var bool $success
13453
  function activate_migrated_license(
13454
  $license_key,
13455
  $is_marketing_allowed = null,
13456
+ $plugin_id = null,
13457
+ $sites = array(),
13458
+ $blog_id = null
13459
  ) {
13460
  $this->_logger->entrance();
13461
 
13462
  $result = $this->activate_license(
13463
  $license_key,
13464
+ ( empty( $sites ) && is_null( $blog_id ) && $this->is_network_active() ) ?
13465
  $this->get_sites_for_network_level_optin() :
13466
+ $sites,
13467
  $is_marketing_allowed,
13468
+ $blog_id,
13469
  $plugin_id
13470
  );
13471
 
13475
  return $result;
13476
  }
13477
 
13478
+ /**
13479
+ * @author Leo Fajardo (@leorw)
13480
+ * @since 2.3.1
13481
+ *
13482
+ * @return string
13483
+ */
13484
+ function get_pricing_js_path() {
13485
+ return $this->apply_filters( 'freemius_pricing_js_path', WP_FS__DIR_INCLUDES . '/freemius-pricing/freemius-pricing.js' );
13486
+ }
13487
+
13488
+ /**
13489
+ * @author Leo Fajardo (@leorw)
13490
+ * @since 2.3.1
13491
+ *
13492
+ * @return bool
13493
+ */
13494
+ function should_use_external_pricing() {
13495
+ if ( is_null( $this->_use_external_pricing ) ) {
13496
+ $pricing_js_path = $this->get_pricing_js_path();
13497
+
13498
+ $this->_use_external_pricing = ( empty( $pricing_js_path ) || ! file_exists( $pricing_js_path ) );
13499
+ }
13500
+
13501
+ return $this->_use_external_pricing;
13502
+ }
13503
+
13504
  /**
13505
  * The implementation of this method was previously in `_activate_license_ajax_action()`.
13506
  *
13533
 
13534
  $license_key = trim( $license_key );
13535
 
13536
+ $is_network_activation_or_migration = (
13537
+ fs_is_network_admin() ||
13538
+ ( ! empty( $sites ) && $this->is_migration() )
13539
+ );
13540
+
13541
+ if ( ! $is_network_activation_or_migration ) {
13542
  // If the license activation is executed outside the context of a network admin, ignore the sites collection.
13543
  $sites = array();
13544
  }
13567
  $user = $fs->get_current_or_network_user();
13568
  }
13569
 
13570
+ if ( $has_valid_blog_id ) {
13571
+ /**
13572
+ * If a specific blog ID was provided, activate the license only on the specific blog that is associated with the given blog ID.
13573
+ *
13574
+ * @author Leo Fajardo (@leorw)
13575
+ */
13576
+ $fs->switch_to_blog( $blog_id );
13577
+ }
13578
+
13579
  if ( is_object( $user ) ) {
13580
+ if ( $is_network_activation_or_migration && ! $has_valid_blog_id ) {
13581
  // If no specific blog ID was provided, activate the license for all sites in the network.
13582
  $blog_2_install_map = array();
13583
  $site_ids = array();
13616
  }
13617
  }
13618
  } else {
 
 
 
 
 
 
 
 
 
 
13619
  if ( $fs->is_registered() ) {
13620
  $params = array(
13621
  'license_key' => $fs->apply_filters( 'license_key', $license_key )
13670
  if ( empty( $error ) ) {
13671
  $fs->network_upgrade_mode_completed();
13672
 
13673
+ $fs->_user = $user;
13674
+
13675
+ if ( fs_is_network_admin() && ! $has_valid_blog_id ) {
13676
+ $fs->_site = $fs->get_network_install();
13677
+ }
13678
+
13679
  $fs->_sync_license( true, $has_valid_blog_id );
13680
 
13681
  $this->maybe_sync_install_user();
13682
 
13683
  $next_page = $fs->is_addon() ?
13684
  $fs->get_parent_instance()->get_account_url() :
13685
+ $fs->get_after_activation_url( 'after_connect_url' );
13686
  }
13687
  } else {
13688
  $next_page = $fs->opt_in(
13700
  if ( isset( $next_page->error ) ) {
13701
  $error = $next_page->error;
13702
  } else {
13703
+ if ( $is_network_activation_or_migration ) {
13704
  /**
13705
  * Get the list of sites that were just opted-in (and license activated).
13706
  * This is an optimization for the next part below saving some DB queries.
14814
  * @return bool
14815
  */
14816
  function is_user_in_admin() {
14817
+ return (
14818
+ is_admin() &&
14819
+ ! self::is_ajax() &&
14820
+ ! self::is_cron() &&
14821
+ ( 'admin-post.php' !== self::get_current_page() )
14822
+ );
14823
  }
14824
 
14825
  /**
15131
  if ( function_exists( 'get_sites' ) ) {
15132
  // For WP 4.6 and above.
15133
  return get_sites( $args );
15134
+ } else if ( function_exists( 'wp_' . 'get_sites' ) ) {
15135
  // For WP 3.7 to WP 4.5.
15136
+ /**
15137
+ * This is a hack suggested previously proposed by the TRT. Our SDK is compliant with older WP versions and we'd like to keep it that way.
15138
+ *
15139
+ * @todo Remove this hack once this false-positive error is removed from the Theme Sniffer.
15140
+ *
15141
+ * @since 2.3.3
15142
+ * @author Vova Feldman (@svovaf)
15143
+ */
15144
+ $fn = 'wp_' . 'get_sites';
15145
+ return $fn( $args );
15146
  } else {
15147
  // For WP 3.6 and below.
15148
  return get_blog_list( 0, 'all' );
15319
  * @return bool Since 2.3.1 returns if a switch was made.
15320
  */
15321
  function switch_to_blog( $blog_id, FS_Site $install = null ) {
15322
+ if ( ! is_numeric( $blog_id ) || $blog_id == $this->_context_is_network_or_blog_id ) {
15323
  return false;
15324
  }
15325
 
16706
  'http' => 402
16707
  );
16708
 
16709
+ $this->maybe_modify_api_curl_error_message( $result );
16710
+
16711
  return $result;
16712
  }
16713
 
17554
  * @author Vova Feldman (@svovaf)
17555
  * @since 1.0.6
17556
  *
17557
+ * @param Freemius $parent_fs
17558
+ * @param bool|int|null $network_level_or_blog_id True for network level opt-in and integer for opt-in for specified blog in the network.
17559
+ * @param FS_Plugin_License $bundle_license Since 2.4.0. If provided, this license will be activated for the add-on.
17560
  */
17561
+ private function _activate_addon_account(
17562
+ Freemius $parent_fs,
17563
+ $network_level_or_blog_id = null,
17564
+ FS_Plugin_License $bundle_license = null
17565
+ ) {
17566
  if ( $this->is_registered() ) {
17567
  // Already activated.
17568
  return;
17601
  }
17602
  }
17603
 
17604
+ if ( is_object( $bundle_license ) ) {
17605
+ $params['license_key'] = $bundle_license->secret_key;
17606
+ }
17607
+
17608
  // Activate add-on with parent plugin credentials.
17609
  $result = $parent_fs->get_api_site_scope()->call(
17610
  "/addons/{$this->_plugin->id}/installs.json",
17613
  );
17614
 
17615
  if ( ! $this->is_api_result_object( $result, 'installs' ) ) {
17616
+ if ( is_object( $bundle_license ) ) {
17617
+ /**
17618
+ * When a license object is provided, it's an attempt by the SDK to activate a bundle license and not a user-initiated action, therefore, do not show any admin notice to avoid confusion (e.g.: the notice will show up just above the opt-in link). If the license activation fails, the admin will see an opt-in link instead.
17619
+ *
17620
+ * @author Leo Fajardo (@leorw)
17621
+ * @since 2.4.0
17622
+ */
17623
+ } else {
17624
+ $error_message = FS_Api::is_api_error_object( $result ) ?
17625
+ $result->error->message :
17626
+ $this->get_text_inline( 'An unknown error has occurred.', 'unknown-error' );
17627
 
17628
+ $this->_admin_notices->add(
17629
+ sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' .
17630
+ $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '<b>' . $error_message . '</b>',
17631
+ $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...',
17632
+ 'error'
17633
+ );
17634
+ }
17635
 
17636
  return;
17637
  }
17664
 
17665
  if ( ! fs_is_network_admin() ) {
17666
  // Try to activate premium license.
17667
+ $this->_activate_license( true, $bundle_license );
 
 
17668
 
17669
+ if ( is_object( $bundle_license ) ) {
17670
+ $this->maybe_activate_bundle_license( $bundle_license );
 
 
 
 
17671
  }
17672
+ } else {
17673
+ if ( is_object( $bundle_license ) ) {
17674
+ $premium_license = $bundle_license;
17675
+ } else {
17676
+ $license_id = fs_request_get( 'license_id' );
17677
 
17678
+ if ( is_object( $this->_site ) &&
17679
+ FS_Plugin_License::is_valid_id( $license_id ) &&
17680
+ $license_id == $this->_site->license_id
17681
+ ) {
17682
+ // License is already activated.
17683
+ return;
17684
+ }
17685
+
17686
+ $premium_license = FS_Plugin_License::is_valid_id( $license_id ) ?
17687
+ $this->_get_license_by_id( $license_id ) :
17688
+ $this->_get_available_premium_license();
17689
+ }
17690
 
17691
  if ( is_object( $premium_license ) ) {
17692
  $this->maybe_network_activate_addon_license( $premium_license );
19984
  *
19985
  * @author Vova Feldman (@svovaf)
19986
  * @since 1.2.1
19987
+ *
19988
+ * @param bool $check_expiration
19989
  */
19990
+ function has_active_valid_license( $check_expiration = true ) {
19991
+ return self::is_active_valid_license( $this->_license, $check_expiration );
19992
  }
19993
 
19994
  /**
20080
  * @since 2.1.3
20081
  *
20082
  * @param FS_Plugin_License $license
20083
+ * @param bool $check_expiration
20084
  *
20085
  * @return bool
20086
  */
20087
+ private static function is_active_valid_license( $license, $check_expiration = true ) {
20088
  return (
20089
  is_object( $license ) &&
20090
  FS_Plugin_License::is_valid_id( $license->id ) &&
20091
  $license->is_active() &&
20092
+ ( ! $check_expiration || $license->is_valid() )
20093
  );
20094
  }
20095
 
20143
  );
20144
  }
20145
 
20146
+ /**
20147
+ * Checks if the product is activated with a bundle license.
20148
+ *
20149
+ * @author Leo Fajardo (@leorw)
20150
+ * @since 2.4.0
20151
+ *
20152
+ * @return bool
20153
+ */
20154
+ function is_activated_with_bundle_license() {
20155
+ if ( ! $this->has_features_enabled_license() ) {
20156
+ return false;
20157
+ }
20158
+
20159
+ return FS_Plugin_License::is_valid_id( $this->_license->parent_license_id );
20160
+ }
20161
+
20162
  /**
20163
  * Check if user is a trial or have feature enabled license.
20164
  *
20751
  }
20752
 
20753
  if ( 'none' !== $plan_change ) {
20754
+ if (
20755
+ ! is_object( $this->_license ) ||
20756
+ ! $this->_license->is_whitelabeled
20757
+ ) {
20758
+ $this->_admin_notices->remove_sticky( 'license_whitelabeled' );
20759
+ }
20760
+
20761
  $this->do_action( 'after_license_change', $plan_change, $this->get_plan() );
20762
  }
20763
  }
21481
  */
21482
  private function get_latest_download_link( $label, $plugin_id = false ) {
21483
  return sprintf(
21484
+ '<a target="_blank" rel="noopener" href="%s">%s</a>',
21485
  $this->_get_latest_download_local_url( $plugin_id ),
21486
  $label
21487
  );
21552
  $this->get_text_inline( 'Version %s was released.', 'version-x-released' ) . ' ' . $this->get_text_inline( 'Please download %s.', 'please-download-x' ),
21553
  $update->version,
21554
  sprintf(
21555
+ '<a href="%s" target="_blank" rel="noopener">%s</a>',
21556
  $this->get_account_url( 'download_latest' ),
21557
  sprintf(
21558
  /* translators: %s: plan name (e.g. latest "Professional" version) */
22039
  $this->get_plugin_title(),
22040
  fs_strip_url_protocol( get_site_url( $blog_id ) ),
22041
  sprintf(
22042
+ '<a href="%s" target="_blank" rel="noopener">%s</a>',
22043
  'https://freemius.com',
22044
  'freemius.com'
22045
  )
22138
 
22139
  if ( is_object( $fs ) ) {
22140
  $fs->_activate_license();
22141
+
22142
+ /**
22143
+ * Remove the product ID from `$_REQUEST` so that the syncing of the license for the other products will work properly.
22144
+ *
22145
+ * @author Leo Fajardo (@leorw)
22146
+ * @since 2.4.0
22147
+ */
22148
+ unset( $_REQUEST['plugin_id'] );
22149
+
22150
+ if ( $this->is_bundle_license_auto_activation_enabled() ) {
22151
+ $fs->maybe_activate_bundle_license( null, array(), is_numeric( $blog_id ) ? $blog_id : 0 );
22152
+ }
22153
  }
22154
 
22155
  return;
22372
 
22373
  $this->_handle_account_edits();
22374
 
22375
+ if (
22376
+ is_object( $this->_license ) &&
22377
+ $this->_license->user_id == $this->_user->id &&
22378
+ ! $this->is_whitelabeled( true )
22379
+ ) {
22380
+ $this->_admin_notices->add(
22381
+ sprintf(
22382
+ $this->get_text_inline( "Is this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.", 'license_not_whitelabeled' ),
22383
+ sprintf(
22384
+ '<a href="#" class="fs-toggle-whitelabel-mode">%s</a>',
22385
+ $this->get_text_inline( 'Click here', 'click-here' )
22386
+ )
22387
+ ),
22388
+ '',
22389
+ 'success',
22390
+ false,
22391
+ 'license_not_whitelabeled'
22392
+ );
22393
+ }
22394
+
22395
  $this->do_action( 'account_page_load_before_departure' );
22396
  }
22397
 
22528
  }
22529
  }
22530
 
22531
+ /**
22532
+ * @author Leo Fajardo (@leorw)
22533
+ * @since 2.3.1
22534
+ */
22535
+ function _maybe_add_pricing_ajax_handler() {
22536
+ if ( ! $this->should_use_external_pricing() ) {
22537
+ $this->add_ajax_action( 'pricing_ajax_action', array( &$this, '_fs_pricing_ajax_action_handler' ) );
22538
+ }
22539
+ }
22540
+
22541
+ /**
22542
+ * @author Leo Fajardo (@leorw)
22543
+ * @since 2.3.1
22544
+ */
22545
+ function _fs_pricing_ajax_action_handler() {
22546
+ $this->check_ajax_referer( 'pricing_ajax_action' );
22547
+
22548
+ $result = null;
22549
+ $pricing_action = fs_request_get( 'pricing_action' );
22550
+
22551
+ switch ( $pricing_action ) {
22552
+ case 'fetch_pricing_data':
22553
+ $params = array(
22554
+ 'is_enriched' => true,
22555
+ 'trial' => fs_request_get_bool( 'trial' ),
22556
+ 'sandbox' => fs_request_get( 'sandbox' ),
22557
+ 's_ctx_type' => fs_request_get( 's_ctx_type' ),
22558
+ 's_ctx_id' => fs_request_get( 's_ctx_id' ),
22559
+ 's_ctx_ts' => fs_request_get( 's_ctx_ts' ),
22560
+ 's_ctx_secure' => fs_request_get( 's_ctx_secure' ),
22561
+ );
22562
+
22563
+ $bundle_id = $this->get_bundle_id();
22564
+ $bundle_public_key = $this->get_bundle_public_key();
22565
+
22566
+ $has_bundle_context = ( FS_Plugin::is_valid_id( $bundle_id ) && ! empty( $bundle_public_key ) );
22567
+
22568
+ if ( ! $has_bundle_context ) {
22569
+ $api = $this->get_api_plugin_scope();
22570
+ } else {
22571
+ $api = FS_Api::instance(
22572
+ $bundle_id,
22573
+ 'plugin',
22574
+ $bundle_id,
22575
+ $bundle_public_key,
22576
+ ! $this->is_live(),
22577
+ false,
22578
+ $this->get_sdk_version()
22579
+ );
22580
+
22581
+ $params['plugin_id'] = $this->get_id();
22582
+ $params['plugin_public_key'] = $this->get_public_key();
22583
+ }
22584
+
22585
+ $result = $api->get( 'pricing.json?' . http_build_query( $params ) );
22586
+ break;
22587
+ case 'start_trial':
22588
+ $result = $this->opt_in(
22589
+ false,
22590
+ false,
22591
+ false,
22592
+ false,
22593
+ false,
22594
+ fs_request_get( 'plan_id' )
22595
+ );
22596
+ }
22597
+
22598
+ if ( is_object( $result ) && $this->is_api_error( $result ) ) {
22599
+ $this->_logger->api_error( $result );
22600
+
22601
+ self::shoot_ajax_failure(
22602
+ isset( $result->error ) ?
22603
+ ( is_string( $result->error ) ? $result->error : $result->error->message ) :
22604
+ var_export( $result, true )
22605
+ );
22606
+ }
22607
+
22608
+ $this->shoot_ajax_success( $result );
22609
+ }
22610
+
22611
  #----------------------------------------------------------------------------------
22612
  #region Contact Us
22613
  #----------------------------------------------------------------------------------
22836
  $this->get_api_plugin_scope();
22837
  }
22838
 
22839
+ /**
22840
+ * @author Leo Fajardo (@leorw)
22841
+ * @since 2.2.3.1
22842
+ *
22843
+ * @param object $result
22844
+ */
22845
+ private function maybe_modify_api_curl_error_message( $result ) {
22846
+ if (
22847
+ 'cUrlMissing' !== $result->error->type &&
22848
+ ( 'CurlException' !== $result->error->type || CURLE_COULDNT_CONNECT != $result->error->code ) &&
22849
+ ( 'HttpRequestFailed' !== $result->error->type || false === strpos( $result->error->message, 'cURL error ' . CURLE_COULDNT_CONNECT ) )
22850
+ ) {
22851
+ return;
22852
+ }
22853
+
22854
+ $result->error->message = $this->esc_html_inline( 'We use PHP cURL library for the API calls, which is a very common library and usually installed and activated out of the box. Unfortunately, cURL is not activated (or disabled) on your server.', 'curl-missing-message' ) .
22855
+ ' ' .
22856
+ $this->esc_html_inline(
22857
+ sprintf(
22858
+ 'Please contact your hosting provider and ask them to whitelist %s for external connection.',
22859
+ implode(
22860
+ ', ',
22861
+ $this->apply_filters( 'api_domains', array(
22862
+ 'api.freemius.com',
22863
+ 'wp.freemius.com'
22864
+ ) )
22865
+ )
22866
+ ),
22867
+ 'connectivity-whitelist'
22868
+ ) .
22869
+ ' ' .
22870
+ sprintf(
22871
+ $this->esc_html_inline( 'Once you are done, deactivate the %s and activate it again.', 'connectivity-reactivate-module' ),
22872
+ $this->get_module_type()
22873
+ );
22874
+ }
22875
+
22876
  /**
22877
  * Show trial promotional notice (if any trial exist).
22878
  *
23426
  return;
23427
  }
23428
 
23429
+ if (
23430
+ $this->is_activation_mode() &&
23431
+ $this->is_premium() &&
23432
+ ! $this->is_registered()
23433
+ ) {
23434
+ // If not yet registered and running the premium code base, a license activation link will already be shown.
23435
+ return;
23436
+ }
23437
 
23438
+ if ( $this->is_registered() && $this->is_tracking_allowed() ) {
23439
+ if ( ! $this->is_premium() && ! $this->is_enable_anonymous() ) {
23440
+ // If opted in and tracking is allowed, don't allow to opt out if not premium and anonymous mode is disabled.
23441
  return;
23442
  }
23443
  }
23517
  if ( ! empty( $this->_dynamically_added_top_level_page_hook_name ) ) {
23518
  if ( $this->is_network_registered() ) {
23519
  $page = 'account';
23520
+ } else if ( $this->is_pending_activation() || $this->is_network_anonymous() ) {
23521
  $this->maybe_set_slug_and_network_menu_exists_flag();
23522
  }
23523
  }
23552
  * @since 1.0.3
23553
  */
23554
  function _redirect_on_activation_hook() {
23555
+ if ( $this->apply_filters( 'redirect_on_activation', true ) ) {
23556
+ $url = $this->get_after_plugin_activation_redirect_url();
23557
 
23558
+ if ( is_string( $url ) ) {
23559
+ fs_redirect( $url );
23560
+ }
23561
  }
23562
  }
23563
 
23597
 
23598
  foreach ( $this->_action_links as $new_links ) {
23599
  foreach ( $new_links as $link ) {
23600
+ $before_deactivate[ $link['key'] ] = '<a href="' . $link['href'] . '"' . ( $link['external'] ? ' target="_blank" rel="noopener"' : '' ) . '>' . $link['label'] . '</a>';
23601
  }
23602
  }
23603
 
23717
  '';
23718
 
23719
  return sprintf(
23720
+ ' %s: <ol><li>%s.</li>%s<li>%s (<a href="%s" target="_blank" rel="noopener">%s</a>).</li></ol>',
23721
  $this->get_text_inline( 'Please follow these steps to complete the upgrade', 'follow-steps-to-complete-upgrade' ),
23722
  ( empty( $activate_license_string ) ? '' : $activate_license_string . '</li><li>' ) .
23723
  $this->get_latest_download_link( sprintf(
23970
  */
23971
  function set_plugin_upgrade_complete() {
23972
  $this->_storage->plugin_upgrade_mode = false;
23973
+
23974
+ $license_migration = ! empty( $this->_storage->license_migration ) ?
23975
+ $this->_storage->license_migration :
23976
+ array();
23977
+
23978
+ $license_migration['is_migrating'] = false;
23979
+
23980
+ $this->_storage->license_migration = $license_migration;
23981
  }
23982
 
23983
  #endregion
freemius/includes/class-fs-api.php CHANGED
@@ -287,7 +287,7 @@
287
  $this->_logger->warn( 'Fallback to cached API result: ' . var_export( $cached_result, true ) );
288
  }
289
  } else {
290
- if ( is_object( $result ) && 404 == $result->error->http ) {
291
  /**
292
  * If the response code is 404, cache the result for half of the `$expiration`.
293
  *
287
  $this->_logger->warn( 'Fallback to cached API result: ' . var_export( $cached_result, true ) );
288
  }
289
  } else {
290
+ if ( is_object( $result ) && isset( $result->error->http ) && 404 == $result->error->http ) {
291
  /**
292
  * If the response code is 404, cache the result for half of the `$expiration`.
293
  *
freemius/includes/class-fs-plugin-updater.php CHANGED
@@ -542,23 +542,66 @@
542
  }
543
  }
544
 
 
 
 
545
  if ( is_object( $this->_update_details ) ) {
 
 
 
 
546
  if ( ! isset( $transient_data->response ) ) {
547
  $transient_data->response = array();
548
  }
549
 
550
  // Add plugin to transient data.
551
- $transient_data->response[ $this->_fs->premium_plugin_basename() ] = $this->_fs->is_plugin() ?
552
  $this->_update_details :
553
  (array) $this->_update_details;
554
- } else if ( isset( $transient_data->response ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
555
  /**
556
- * Ensure that there's no update data for the plugin to prevent upgrading the premium version to the latest free version.
557
  *
558
- * @author Leo Fajardo (@leorw)
559
- * @since 2.3.0
560
  */
561
- unset( $transient_data->response[ $this->_fs->premium_plugin_basename() ] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
562
  }
563
 
564
  $slug = $this->_fs->get_slug();
542
  }
543
  }
544
 
545
+ // Alias.
546
+ $basename = $this->_fs->premium_plugin_basename();
547
+
548
  if ( is_object( $this->_update_details ) ) {
549
+ if ( isset( $transient_data->no_update ) ) {
550
+ unset( $transient_data->no_update[ $basename ] );
551
+ }
552
+
553
  if ( ! isset( $transient_data->response ) ) {
554
  $transient_data->response = array();
555
  }
556
 
557
  // Add plugin to transient data.
558
+ $transient_data->response[ $basename ] = $this->_fs->is_plugin() ?
559
  $this->_update_details :
560
  (array) $this->_update_details;
561
+ } else {
562
+ if ( isset( $transient_data->response ) ) {
563
+ /**
564
+ * Ensure that there's no update data for the plugin to prevent upgrading the premium version to the latest free version.
565
+ *
566
+ * @author Leo Fajardo (@leorw)
567
+ * @since 2.3.0
568
+ */
569
+ unset( $transient_data->response[ $basename ] );
570
+ }
571
+
572
+ if ( ! isset( $transient_data->no_update ) ) {
573
+ $transient_data->no_update = array();
574
+ }
575
+
576
  /**
577
+ * Add product to no_update transient data to properly integrate with WP 5.5 auto-updates UI.
578
  *
579
+ * @since 2.4.1
580
+ * @link https://make.wordpress.org/core/2020/07/30/recommended-usage-of-the-updates-api-to-support-the-auto-updates-ui-for-plugins-and-themes-in-wordpress-5-5/
581
  */
582
+ $transient_data->no_update[ $basename ] = $this->_fs->is_plugin() ?
583
+ (object) array(
584
+ 'id' => $basename,
585
+ 'slug' => $this->_fs->get_slug(),
586
+ 'plugin' => $basename,
587
+ 'new_version' => $this->_fs->get_plugin_version(),
588
+ 'url' => '',
589
+ 'package' => '',
590
+ 'icons' => array(),
591
+ 'banners' => array(),
592
+ 'banners_rtl' => array(),
593
+ 'tested' => '',
594
+ 'requires_php' => '',
595
+ 'compatibility' => new stdClass(),
596
+ ) :
597
+ array(
598
+ 'theme' => $basename,
599
+ 'new_version' => $this->_fs->get_plugin_version(),
600
+ 'url' => '',
601
+ 'package' => '',
602
+ 'requires' => '',
603
+ 'requires_php' => '',
604
+ );
605
  }
606
 
607
  $slug = $this->_fs->get_slug();
freemius/includes/class-fs-security.php CHANGED
File without changes
freemius/includes/class-fs-storage.php CHANGED
@@ -371,6 +371,7 @@
371
  * sites in the network.
372
  */
373
  'is_network_activation' => 0,
 
374
 
375
  // When network activated, then network level.
376
  'install_timestamp' => 1,
371
  * sites in the network.
372
  */
373
  'is_network_activation' => 0,
374
+ 'license_migration' => 0,
375
 
376
  // When network activated, then network level.
377
  'install_timestamp' => 1,
freemius/includes/customizer/class-fs-customizer-support-section.php CHANGED
@@ -87,10 +87,10 @@
87
  <div class="button-group">
88
  <# } #>
89
  <# if ( data.contact ) { #>
90
- <a class="button" href="{{ data.contact.url }}" target="_blank">{{ data.contact.label }} </a>
91
  <# } #>
92
  <# if ( data.support ) { #>
93
- <a class="button" href="{{ data.support.url }}" target="_blank">{{ data.support.label }} </a>
94
  <# } #>
95
  <# if ( data.contact && data.support ) { #>
96
  </div>
87
  <div class="button-group">
88
  <# } #>
89
  <# if ( data.contact ) { #>
90
+ <a class="button" href="{{ data.contact.url }}" target="_blank" rel="noopener noreferrer">{{ data.contact.label }} </a>
91
  <# } #>
92
  <# if ( data.support ) { #>
93
+ <a class="button" href="{{ data.support.url }}" target="_blank" rel="noopener noreferrer">{{ data.support.label }} </a>
94
  <# } #>
95
  <# if ( data.contact && data.support ) { #>
96
  </div>
freemius/includes/entities/class-fs-entity.php CHANGED
File without changes
freemius/includes/entities/class-fs-payment.php CHANGED
@@ -158,8 +158,8 @@
158
  // Lazy load.
159
  self::$CURRENCY_2_SYMBOL = array(
160
  self::CURRENCY_USD => '$',
161
- self::CURRENCY_GBP => '£',
162
- self::CURRENCY_EUR => '',
163
  );
164
  }
165
 
158
  // Lazy load.
159
  self::$CURRENCY_2_SYMBOL = array(
160
  self::CURRENCY_USD => '$',
161
+ self::CURRENCY_GBP => '&pound;',
162
+ self::CURRENCY_EUR => '&euro;',
163
  );
164
  }
165
 
freemius/includes/entities/class-fs-plugin-info.php CHANGED
File without changes
freemius/includes/entities/class-fs-plugin-license.php CHANGED
@@ -50,6 +50,13 @@
50
  * @var number
51
  */
52
  public $parent_license_id;
 
 
 
 
 
 
 
53
  /**
54
  * @var number
55
  */
50
  * @var number
51
  */
52
  public $parent_license_id;
53
+ /**
54
+ * @author Leo Fajardo (@leorw)
55
+ * @since 2.4.0
56
+ *
57
+ * @var array
58
+ */
59
+ public $products;
60
  /**
61
  * @var number
62
  */
freemius/includes/entities/class-fs-plugin-plan.php CHANGED
File without changes
freemius/includes/entities/class-fs-plugin-tag.php CHANGED
File without changes
freemius/includes/entities/class-fs-plugin.php CHANGED
File without changes
freemius/includes/entities/class-fs-pricing.php CHANGED
File without changes
freemius/includes/entities/class-fs-scope-entity.php CHANGED
File without changes
freemius/includes/entities/class-fs-site.php CHANGED
@@ -171,6 +171,7 @@
171
  // WPEngine staging.
172
  fs_ends_with( $subdomain, '.staging.wpengine.com' ) ||
173
  fs_ends_with( $subdomain, '.dev.wpengine.com' ) ||
 
174
  // Pantheon
175
  ( fs_ends_with( $subdomain, 'pantheonsite.io' ) &&
176
  ( fs_starts_with( $subdomain, 'test-' ) || fs_starts_with( $subdomain, 'dev-' ) ) ) ||
@@ -179,7 +180,9 @@
179
  // Kinsta
180
  ( fs_starts_with( $subdomain, 'staging-' ) && ( fs_ends_with( $subdomain, '.kinsta.com' ) || fs_ends_with( $subdomain, '.kinsta.cloud' ) ) ) ||
181
  // DesktopServer
182
- fs_ends_with( $subdomain, '.dev.cc' )
 
 
183
  );
184
  }
185
 
171
  // WPEngine staging.
172
  fs_ends_with( $subdomain, '.staging.wpengine.com' ) ||
173
  fs_ends_with( $subdomain, '.dev.wpengine.com' ) ||
174
+ fs_ends_with( $subdomain, '.wpengine.com' ) ||
175
  // Pantheon
176
  ( fs_ends_with( $subdomain, 'pantheonsite.io' ) &&
177
  ( fs_starts_with( $subdomain, 'test-' ) || fs_starts_with( $subdomain, 'dev-' ) ) ) ||
180
  // Kinsta
181
  ( fs_starts_with( $subdomain, 'staging-' ) && ( fs_ends_with( $subdomain, '.kinsta.com' ) || fs_ends_with( $subdomain, '.kinsta.cloud' ) ) ) ||
182
  // DesktopServer
183
+ fs_ends_with( $subdomain, '.dev.cc' ) ||
184
+ // Pressable
185
+ fs_ends_with( $subdomain, '.mystagingwebsite.com' )
186
  );
187
  }
188
 
freemius/includes/entities/class-fs-subscription.php CHANGED
File without changes
freemius/includes/entities/class-fs-user.php CHANGED
File without changes
freemius/includes/fs-core-functions.php CHANGED
File without changes
freemius/includes/fs-essential-functions.php CHANGED
@@ -380,45 +380,62 @@
380
  global $fs_active_plugins;
381
 
382
  /**
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).
384
  *
385
  * @link https://github.com/Freemius/wordpress-sdk/issues/26
386
  */
387
 
388
  $newest_sdk_plugin_path = $fs_active_plugins->newest->plugin_path;
389
 
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 );
398
 
399
- // Set it to be included first.
400
- array_unshift( $active_plugins, $newest_sdk_plugin_path );
401
 
402
- update_option( 'active_plugins', $active_plugins );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
 
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() );
408
 
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];
416
 
417
  // Remove plugin from its current position.
418
- unset($network_active_plugins[$newest_sdk_plugin_path]);
419
 
420
  // Set it to be included first.
421
- $network_active_plugins = array($newest_sdk_plugin_path => $time) + $network_active_plugins;
422
 
423
  update_site_option( 'active_sitewide_plugins', $network_active_plugins );
424
 
380
  global $fs_active_plugins;
381
 
382
  /**
383
+ * @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).
384
  *
385
  * @link https://github.com/Freemius/wordpress-sdk/issues/26
386
  */
387
 
388
  $newest_sdk_plugin_path = $fs_active_plugins->newest->plugin_path;
389
 
390
+ $active_plugins = get_option( 'active_plugins', array() );
391
+ $updated_active_plugins = array( $newest_sdk_plugin_path );
 
 
 
 
 
 
392
 
393
+ $plugin_found = false;
394
+ $is_first_path = true;
395
 
396
+ foreach ( $active_plugins as $key => $plugin_path ) {
397
+ if ( $plugin_path === $newest_sdk_plugin_path ) {
398
+ if ( $is_first_path ) {
399
+ // if it's the first plugin already, no need to continue
400
+ return false;
401
+ }
402
+
403
+ $plugin_found = true;
404
+
405
+ // Skip the plugin (it is already added as the 1st item of $updated_active_plugins).
406
+ continue;
407
+ }
408
+
409
+ $updated_active_plugins[] = $plugin_path;
410
+
411
+ if ( $is_first_path ) {
412
+ $is_first_path = false;
413
+ }
414
+ }
415
+
416
+ if ( $plugin_found ) {
417
+ update_option( 'active_plugins', $updated_active_plugins );
418
 
419
  return true;
420
+ }
421
+
422
+ if ( is_multisite() ) {
423
  // Plugin is network active.
424
  $network_active_plugins = get_site_option( 'active_sitewide_plugins', array() );
425
 
426
+ if ( isset( $network_active_plugins[ $newest_sdk_plugin_path ] ) ) {
427
+ reset( $network_active_plugins );
428
+ if ( $newest_sdk_plugin_path === key( $network_active_plugins ) ) {
429
  // Plugin is already activated first on the network level.
430
  return false;
431
+ } else {
432
+ $time = $network_active_plugins[ $newest_sdk_plugin_path ];
433
 
434
  // Remove plugin from its current position.
435
+ unset( $network_active_plugins[ $newest_sdk_plugin_path ] );
436
 
437
  // Set it to be included first.
438
+ $network_active_plugins = array( $newest_sdk_plugin_path => $time ) + $network_active_plugins;
439
 
440
  update_site_option( 'active_sitewide_plugins', $network_active_plugins );
441
 
freemius/includes/fs-plugin-info-dialog.php CHANGED
@@ -260,14 +260,20 @@
260
  if ( $has_valid_blog_id ) {
261
  restore_current_blog();
262
  }
 
263
 
264
- if ( is_object( $fs_addon ) ) {
265
- $data->has_purchased_license = $fs_addon->has_active_valid_license();
266
- } else {
267
- $account_addons = $this->_fs->get_account_addons();
268
- if ( ! empty( $account_addons ) && in_array( $selected_addon->id, $account_addons ) ) {
269
- $data->has_purchased_license = true;
270
- }
 
 
 
 
 
271
  }
272
  }
273
 
@@ -577,7 +583,7 @@
577
 
578
  $has_installed_version = ( 'install' !== $this->status['status'] );
579
 
580
- if ( ! $api->has_paid_plan ) {
581
  /**
582
  * Free-only add-on.
583
  *
@@ -880,9 +886,11 @@
880
  $classes[] = 'disabled';
881
  }
882
 
 
 
883
  return sprintf(
884
  '<a %s class="button %s">%s</a>',
885
- empty( $href ) ? '' : 'href="' . $href . '" target="' . $target . '"',
886
  implode( ' ', $classes ),
887
  $label
888
  );
@@ -1201,7 +1209,7 @@
1201
 
1202
  $(document).ready(function () {
1203
  var $plan = $('.plugin-information-pricing .fs-plan[data-plan-id=<?php echo $plan->id ?>]');
1204
- $plan.find('input[type=radio]').live('click', function () {
1205
  _updateCtaUrl(
1206
  $plan.attr('data-plan-id'),
1207
  $(this).val(),
@@ -1367,6 +1375,7 @@
1367
  if ( ! empty( $api->slug ) && true == $api->is_wp_org_compliant ) {
1368
  ?>
1369
  <li><a target="_blank"
 
1370
  href="https://wordpress.org/plugins/<?php echo $api->slug; ?>/"><?php fs_esc_html_echo_inline( 'WordPress.org Plugin Page', 'wp-org-plugin-page', $api->slug ) ?>
1371
  &#187;</a>
1372
  </li>
@@ -1375,6 +1384,7 @@
1375
  if ( ! empty( $api->homepage ) ) {
1376
  ?>
1377
  <li><a target="_blank"
 
1378
  href="<?php echo esc_url( $api->homepage ); ?>"><?php fs_esc_html_echo_inline( 'Plugin Homepage', 'plugin-homepage', $api->slug ) ?>
1379
  &#187;</a>
1380
  </li>
@@ -1383,6 +1393,7 @@
1383
  if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) {
1384
  ?>
1385
  <li><a target="_blank"
 
1386
  href="<?php echo esc_url( $api->donate_link ); ?>"><?php fs_esc_html_echo_inline( 'Donate to this plugin', 'donate-to-plugin', $api->slug ) ?>
1387
  &#187;</a>
1388
  </li>
@@ -1426,18 +1437,19 @@
1426
  );
1427
  ?>
1428
  <div class="counter-container">
1429
- <span class="counter-label"><a
1430
- href="https://wordpress.org/support/view/plugin-reviews/<?php echo $api->slug; ?>?filter=<?php echo $key; ?>"
1431
- target="_blank"
1432
- title="<?php echo esc_attr( sprintf(
1433
- /* translators: %s: # of stars (e.g. 5 stars) */
1434
- fs_text_inline( 'Click to see reviews that provided a rating of %s', 'click-to-reviews', $api->slug ),
1435
- $stars_label
1436
- ) ) ?>"><?php echo $stars_label ?></a></span>
 
1437
  <span class="counter-back">
1438
- <span class="counter-bar" style="width: <?php echo absint(92 * $_rating); ?>px;"></span>
1439
- </span>
1440
- <span class="counter-count"><?php echo number_format_i18n( $ratecount ); ?></span>
1441
  </div>
1442
  <?php
1443
  }
@@ -1458,13 +1470,14 @@
1458
  if ( empty( $contrib_profile ) ) {
1459
  echo "<li><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&amp;s=36' width='18' height='18' />{$contrib_username}</li>";
1460
  } else {
1461
- echo "<li><a href='{$contrib_profile}' target='_blank'><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&amp;s=36' width='18' height='18' />{$contrib_username}</a></li>";
1462
  }
1463
  }
1464
  ?>
1465
  </ul>
1466
  <?php if ( ! empty( $api->donate_link ) ) { ?>
1467
  <a target="_blank"
 
1468
  href="<?php echo esc_url( $api->donate_link ); ?>"><?php fs_echo_inline( 'Donate to this plugin', 'donate-to-plugin', $api->slug ) ?>
1469
  &#187;</a>
1470
  <?php } ?>
@@ -1628,4 +1641,4 @@
1628
  iframe_footer();
1629
  exit;
1630
  }
1631
- }
260
  if ( $has_valid_blog_id ) {
261
  restore_current_blog();
262
  }
263
+ }
264
 
265
+ /**
266
+ * Check if there's a purchased license in case the add-on can only be installed/downloaded as part of a purchased bundle.
267
+ *
268
+ * @author Leo Fajardo (@leorw)
269
+ * @since 2.4.1
270
+ */
271
+ if ( is_object( $fs_addon ) ) {
272
+ $data->has_purchased_license = $fs_addon->has_active_valid_license();
273
+ } else {
274
+ $account_addons = $this->_fs->get_account_addons();
275
+ if ( ! empty( $account_addons ) && in_array( $selected_addon->id, $account_addons ) ) {
276
+ $data->has_purchased_license = true;
277
  }
278
  }
279
 
583
 
584
  $has_installed_version = ( 'install' !== $this->status['status'] );
585
 
586
+ if ( ! $api->has_paid_plan && ! $api->has_purchased_license ) {
587
  /**
588
  * Free-only add-on.
589
  *
886
  $classes[] = 'disabled';
887
  }
888
 
889
+ $rel = ( '_blank' === $target ) ? ' rel="noopener noreferrer"' : '';
890
+
891
  return sprintf(
892
  '<a %s class="button %s">%s</a>',
893
+ empty( $href ) ? '' : 'href="' . $href . '" target="' . $target . '"' . $rel,
894
  implode( ' ', $classes ),
895
  $label
896
  );
1209
 
1210
  $(document).ready(function () {
1211
  var $plan = $('.plugin-information-pricing .fs-plan[data-plan-id=<?php echo $plan->id ?>]');
1212
+ $plan.find('input[type=radio]').on('click', function () {
1213
  _updateCtaUrl(
1214
  $plan.attr('data-plan-id'),
1215
  $(this).val(),
1375
  if ( ! empty( $api->slug ) && true == $api->is_wp_org_compliant ) {
1376
  ?>
1377
  <li><a target="_blank"
1378
+ rel="noopener noreferrer"
1379
  href="https://wordpress.org/plugins/<?php echo $api->slug; ?>/"><?php fs_esc_html_echo_inline( 'WordPress.org Plugin Page', 'wp-org-plugin-page', $api->slug ) ?>
1380
  &#187;</a>
1381
  </li>
1384
  if ( ! empty( $api->homepage ) ) {
1385
  ?>
1386
  <li><a target="_blank"
1387
+ rel="noopener noreferrer"
1388
  href="<?php echo esc_url( $api->homepage ); ?>"><?php fs_esc_html_echo_inline( 'Plugin Homepage', 'plugin-homepage', $api->slug ) ?>
1389
  &#187;</a>
1390
  </li>
1393
  if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) {
1394
  ?>
1395
  <li><a target="_blank"
1396
+ rel="noopener noreferrer"
1397
  href="<?php echo esc_url( $api->donate_link ); ?>"><?php fs_esc_html_echo_inline( 'Donate to this plugin', 'donate-to-plugin', $api->slug ) ?>
1398
  &#187;</a>
1399
  </li>
1437
  );
1438
  ?>
1439
  <div class="counter-container">
1440
+ <span class="counter-label"><a
1441
+ href="https://wordpress.org/support/view/plugin-reviews/<?php echo $api->slug; ?>?filter=<?php echo $key; ?>"
1442
+ target="_blank"
1443
+ rel="noopener noreferrer"
1444
+ title="<?php echo esc_attr( sprintf(
1445
+ /* translators: %s: # of stars (e.g. 5 stars) */
1446
+ fs_text_inline( 'Click to see reviews that provided a rating of %s', 'click-to-reviews', $api->slug ),
1447
+ $stars_label
1448
+ ) ) ?>"><?php echo $stars_label ?></a></span>
1449
  <span class="counter-back">
1450
+ <span class="counter-bar" style="width: <?php echo absint(92 * $_rating); ?>px;"></span>
1451
+ </span>
1452
+ <span class="counter-count"><?php echo number_format_i18n( $ratecount ); ?></span>
1453
  </div>
1454
  <?php
1455
  }
1470
  if ( empty( $contrib_profile ) ) {
1471
  echo "<li><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&amp;s=36' width='18' height='18' />{$contrib_username}</li>";
1472
  } else {
1473
+ echo "<li><a href='{$contrib_profile}' target='_blank' rel='noopener noreferrer'><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&amp;s=36' width='18' height='18' />{$contrib_username}</a></li>";
1474
  }
1475
  }
1476
  ?>
1477
  </ul>
1478
  <?php if ( ! empty( $api->donate_link ) ) { ?>
1479
  <a target="_blank"
1480
+ rel="noopener noreferrer"
1481
  href="<?php echo esc_url( $api->donate_link ); ?>"><?php fs_echo_inline( 'Donate to this plugin', 'donate-to-plugin', $api->slug ) ?>
1482
  &#187;</a>
1483
  <?php } ?>
1641
  iframe_footer();
1642
  exit;
1643
  }
1644
+ }
freemius/includes/i18n.php CHANGED
@@ -98,6 +98,8 @@
98
  'error' => _fs_text( 'Error' ),
99
  'failed-finding-main-path' => _fs_text( 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.' ),
100
  'learn-more' => _fs_text( 'Learn more' ),
 
 
101
 
102
  #region Affiliation
103
  'affiliation' => _fs_text( 'Affiliation' ),
98
  'error' => _fs_text( 'Error' ),
99
  'failed-finding-main-path' => _fs_text( 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.' ),
100
  'learn-more' => _fs_text( 'Learn more' ),
101
+ 'license_not_whitelabeled' => _fs_text( "Is this your client's site? %s if you wish to hide sensitive info like your billing address and invoices from the WP Admin."),
102
+ 'license_whitelabeled' => _fs_text( 'Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your billing address and invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.'),
103
 
104
  #region Affiliation
105
  'affiliation' => _fs_text( 'Affiliation' ),
freemius/includes/managers/class-fs-admin-menu-manager.php CHANGED
@@ -703,7 +703,12 @@
703
  $menu['parent_slug'] :
704
  'admin.php';
705
 
706
- return admin_url( $parent_slug . '?page=' . $menu['menu'][2] );
 
 
 
 
 
707
  }
708
 
709
  /**
703
  $menu['parent_slug'] :
704
  'admin.php';
705
 
706
+ return admin_url(
707
+ $parent_slug .
708
+ ( false === strpos( $parent_slug, '?' ) ? '?' : '&' ) .
709
+ 'page=' .
710
+ $menu['menu'][2]
711
+ );
712
  }
713
 
714
  /**
freemius/includes/managers/class-fs-cache-manager.php CHANGED
File without changes
freemius/includes/managers/class-fs-key-value-storage.php CHANGED
File without changes
freemius/includes/managers/class-fs-license-manager.php CHANGED
File without changes
freemius/includes/managers/class-fs-option-manager.php CHANGED
File without changes
freemius/includes/managers/class-fs-plan-manager.php CHANGED
File without changes
freemius/includes/managers/class-fs-plugin-manager.php CHANGED
File without changes
freemius/includes/sdk/Exceptions/ArgumentNotExistException.php CHANGED
File without changes
freemius/includes/sdk/Exceptions/EmptyArgumentException.php CHANGED
File without changes
freemius/includes/sdk/Exceptions/Exception.php CHANGED
File without changes
freemius/includes/sdk/Exceptions/InvalidArgumentException.php CHANGED
File without changes
freemius/includes/sdk/Exceptions/OAuthException.php CHANGED
File without changes
freemius/includes/sdk/FreemiusBase.php CHANGED
@@ -137,7 +137,7 @@
137
  } catch ( Exception $e ) {
138
  // Map to error object.
139
  $result = (object) array(
140
- 'error' => array(
141
  'type' => 'Unknown',
142
  'message' => $e->getMessage() . ' (' . $e->getFile() . ': ' . $e->getLine() . ')',
143
  'code' => 'unknown',
137
  } catch ( Exception $e ) {
138
  // Map to error object.
139
  $result = (object) array(
140
+ 'error' => (object) array(
141
  'type' => 'Unknown',
142
  'message' => $e->getMessage() . ' (' . $e->getFile() . ': ' . $e->getLine() . ')',
143
  'code' => 'unknown',
freemius/includes/sdk/FreemiusWordPress.php CHANGED
@@ -59,6 +59,10 @@
59
  }
60
  }
61
 
 
 
 
 
62
  $curl_version = FS_SDK__HAS_CURL ?
63
  curl_version() :
64
  array( 'version' => '7.37' );
@@ -228,10 +232,13 @@
228
  $now = ( time() - self::$_clock_diff );
229
  $date = date( 'r', $now );
230
 
231
- if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) && ! empty( $pPostParams ) ) {
232
- $content_md5 = md5( $pPostParams );
233
- $content_type = 'application/json';
234
- }
 
 
 
235
 
236
  $string_to_sign = implode( $eol, array(
237
  $pMethod,
@@ -380,10 +387,11 @@
380
  }
381
 
382
  if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) ) {
383
- if ( is_array( $pParams ) && 0 < count( $pParams ) ) {
384
- $pWPRemoteArgs['headers']['Content-type'] = 'application/json';
385
- $pWPRemoteArgs['body'] = json_encode( $pParams );
386
- }
 
387
  }
388
 
389
  $request_url = self::GetUrl( $pCanonizedPath, $pIsSandbox );
@@ -397,7 +405,7 @@
397
  }
398
 
399
  if ( 'https' === substr( strtolower( $request_url ), 0, 5 ) ) {
400
- $pWPRemoteArgs['sslverify'] = false;
401
  }
402
 
403
  if ( false !== $pBeforeExecutionFunction &&
@@ -570,7 +578,7 @@
570
  } catch ( Exception $e ) {
571
  // Map to error object.
572
  $result = (object) array(
573
- 'error' => array(
574
  'type' => 'Unknown',
575
  'message' => $e->getMessage() . ' (' . $e->getFile() . ': ' . $e->getLine() . ')',
576
  'code' => 'unknown',
@@ -649,7 +657,7 @@
649
  $message = ( 1 < count( $parts ) ) ? $parts[1] : $message;
650
 
651
  $e = new Freemius_Exception( array(
652
- 'error' => array(
653
  'code' => $code,
654
  'message' => $message,
655
  'type' => 'CurlException',
@@ -657,7 +665,7 @@
657
  ) );
658
  } else {
659
  $e = new Freemius_Exception( array(
660
- 'error' => array(
661
  'code' => $pError->get_error_code(),
662
  'message' => $pError->get_error_message(),
663
  'type' => 'WPRemoteException',
59
  }
60
  }
61
 
62
+ if ( ! defined( 'FS_SDK__SSLVERIFY' ) ) {
63
+ define( 'FS_SDK__SSLVERIFY', false );
64
+ }
65
+
66
  $curl_version = FS_SDK__HAS_CURL ?
67
  curl_version() :
68
  array( 'version' => '7.37' );
232
  $now = ( time() - self::$_clock_diff );
233
  $date = date( 'r', $now );
234
 
235
+ if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) ) {
236
+ $content_type = 'application/json';
237
+
238
+ if ( ! empty( $pPostParams ) ) {
239
+ $content_md5 = md5( $pPostParams );
240
+ }
241
+ }
242
 
243
  $string_to_sign = implode( $eol, array(
244
  $pMethod,
387
  }
388
 
389
  if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) ) {
390
+ $pWPRemoteArgs['headers']['Content-type'] = 'application/json';
391
+
392
+ if ( is_array( $pParams ) && 0 < count( $pParams ) ) {
393
+ $pWPRemoteArgs['body'] = json_encode( $pParams );
394
+ }
395
  }
396
 
397
  $request_url = self::GetUrl( $pCanonizedPath, $pIsSandbox );
405
  }
406
 
407
  if ( 'https' === substr( strtolower( $request_url ), 0, 5 ) ) {
408
+ $pWPRemoteArgs['sslverify'] = FS_SDK__SSLVERIFY;
409
  }
410
 
411
  if ( false !== $pBeforeExecutionFunction &&
578
  } catch ( Exception $e ) {
579
  // Map to error object.
580
  $result = (object) array(
581
+ 'error' => (object) array(
582
  'type' => 'Unknown',
583
  'message' => $e->getMessage() . ' (' . $e->getFile() . ': ' . $e->getLine() . ')',
584
  'code' => 'unknown',
657
  $message = ( 1 < count( $parts ) ) ? $parts[1] : $message;
658
 
659
  $e = new Freemius_Exception( array(
660
+ 'error' => (object) array(
661
  'code' => $code,
662
  'message' => $message,
663
  'type' => 'CurlException',
665
  ) );
666
  } else {
667
  $e = new Freemius_Exception( array(
668
+ 'error' => (object) array(
669
  'code' => $pError->get_error_code(),
670
  'message' => $pError->get_error_message(),
671
  'type' => 'WPRemoteException',
freemius/includes/sdk/LICENSE.txt CHANGED
File without changes
freemius/includes/supplements/fs-essential-functions-1.1.7.1.php CHANGED
@@ -32,7 +32,7 @@
32
 
33
  // Get active plugin's main files real full names (might be symlinks).
34
  foreach ( $all_plugins as $relative_path => $data ) {
35
- if ( 0 === strpos( $file_real_path, fs_normalize_path( dirname( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ) ) ) ) {
36
  if ( '.' !== dirname( trailingslashit( $relative_path ) ) ) {
37
  return $relative_path;
38
  }
32
 
33
  // Get active plugin's main files real full names (might be symlinks).
34
  foreach ( $all_plugins as $relative_path => $data ) {
35
+ if ( 0 === strpos( $file_real_path, fs_normalize_path( dirname( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ) . '/' ) ) ) {
36
  if ( '.' !== dirname( trailingslashit( $relative_path ) ) ) {
37
  return $relative_path;
38
  }
freemius/languages/freemius-cs_CZ.mo CHANGED
Binary file
freemius/languages/freemius-da_DK.mo CHANGED
Binary file
freemius/languages/freemius-en.mo CHANGED
Binary file
freemius/languages/freemius-es_ES.mo CHANGED
Binary file
freemius/languages/freemius-fr_FR.mo CHANGED
Binary file
freemius/languages/freemius-he_IL.mo CHANGED
Binary file
freemius/languages/freemius-hu_HU.mo CHANGED
Binary file
freemius/languages/freemius-it_IT.mo CHANGED
Binary file
freemius/languages/freemius-ja.mo CHANGED
Binary file
freemius/languages/freemius-nl_NL.mo CHANGED
Binary file
freemius/languages/freemius-ru_RU.mo CHANGED
Binary file
freemius/languages/freemius-ta.mo CHANGED
Binary file
freemius/languages/freemius-zh_CN.mo ADDED
Binary file
freemius/languages/freemius.pot CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2019 freemius
2
  # This file is distributed under the same license as the freemius package.
3
  msgid ""
4
  msgstr ""
@@ -16,771 +16,795 @@ msgstr ""
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
 
19
- #: includes/class-freemius.php:1881, templates/account.php:873
20
  msgid "An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned."
21
  msgstr ""
22
 
23
- #: includes/class-freemius.php:1888
24
  msgid "Would you like to proceed with the update?"
25
  msgstr ""
26
 
27
- #: includes/class-freemius.php:2096
28
  msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
29
  msgstr ""
30
 
31
- #: includes/class-freemius.php:2098
32
  msgid "Error"
33
  msgstr ""
34
 
35
- #: includes/class-freemius.php:2492
36
  msgid "I found a better %s"
37
  msgstr ""
38
 
39
- #: includes/class-freemius.php:2494
40
  msgid "What's the %s's name?"
41
  msgstr ""
42
 
43
- #: includes/class-freemius.php:2500
44
  msgid "It's a temporary %s. I'm just debugging an issue."
45
  msgstr ""
46
 
47
- #: includes/class-freemius.php:2502
48
  msgid "Deactivation"
49
  msgstr ""
50
 
51
- #: includes/class-freemius.php:2503
52
  msgid "Theme Switch"
53
  msgstr ""
54
 
55
- #: includes/class-freemius.php:2512, templates/forms/resend-key.php:24, templates/forms/user-change.php:29
56
  msgid "Other"
57
  msgstr ""
58
 
59
- #: includes/class-freemius.php:2520
60
  msgid "I no longer need the %s"
61
  msgstr ""
62
 
63
- #: includes/class-freemius.php:2527
64
  msgid "I only needed the %s for a short period"
65
  msgstr ""
66
 
67
- #: includes/class-freemius.php:2533
68
  msgid "The %s broke my site"
69
  msgstr ""
70
 
71
- #: includes/class-freemius.php:2540
72
  msgid "The %s suddenly stopped working"
73
  msgstr ""
74
 
75
- #: includes/class-freemius.php:2550
76
  msgid "I can't pay for it anymore"
77
  msgstr ""
78
 
79
- #: includes/class-freemius.php:2552
80
  msgid "What price would you feel comfortable paying?"
81
  msgstr ""
82
 
83
- #: includes/class-freemius.php:2558
84
  msgid "I don't like to share my information with you"
85
  msgstr ""
86
 
87
- #: includes/class-freemius.php:2579
88
  msgid "The %s didn't work"
89
  msgstr ""
90
 
91
- #: includes/class-freemius.php:2589
92
  msgid "I couldn't understand how to make it work"
93
  msgstr ""
94
 
95
- #: includes/class-freemius.php:2597
96
  msgid "The %s is great, but I need specific feature that you don't support"
97
  msgstr ""
98
 
99
- #: includes/class-freemius.php:2599
100
  msgid "What feature?"
101
  msgstr ""
102
 
103
- #: includes/class-freemius.php:2603
104
  msgid "The %s is not working"
105
  msgstr ""
106
 
107
- #: includes/class-freemius.php:2605
108
  msgid "Kindly share what didn't work so we can fix it for future users..."
109
  msgstr ""
110
 
111
- #: includes/class-freemius.php:2609
112
  msgid "It's not what I was looking for"
113
  msgstr ""
114
 
115
- #: includes/class-freemius.php:2611
116
  msgid "What you've been looking for?"
117
  msgstr ""
118
 
119
- #: includes/class-freemius.php:2615
120
  msgid "The %s didn't work as expected"
121
  msgstr ""
122
 
123
- #: includes/class-freemius.php:2617
124
  msgid "What did you expect?"
125
  msgstr ""
126
 
127
- #: includes/class-freemius.php:3472, templates/debug.php:20
128
  msgid "Freemius Debug"
129
  msgstr ""
130
 
131
- #: includes/class-freemius.php:4224
132
  msgid "I don't know what is cURL or how to install it, help me!"
133
  msgstr ""
134
 
135
- #: includes/class-freemius.php:4226
136
  msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update."
137
  msgstr ""
138
 
139
- #: includes/class-freemius.php:4233
140
  msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
141
  msgstr ""
142
 
143
- #: includes/class-freemius.php:4338
144
  msgid "Yes - do your thing"
145
  msgstr ""
146
 
147
- #: includes/class-freemius.php:4343
148
  msgid "No - just deactivate"
149
  msgstr ""
150
 
151
- #: includes/class-freemius.php:4388, includes/class-freemius.php:4882, includes/class-freemius.php:6111, includes/class-freemius.php:12933, includes/class-freemius.php:13571, includes/class-freemius.php:17006, includes/class-freemius.php:17094, includes/class-freemius.php:17260, includes/class-freemius.php:19492, includes/class-freemius.php:19833, includes/class-freemius.php:19843, includes/class-freemius.php:20507, includes/class-freemius.php:21413, includes/class-freemius.php:21546, includes/class-freemius.php:21690, templates/add-ons.php:57
152
  msgctxt "exclamation"
153
  msgid "Oops"
154
  msgstr ""
155
 
156
- #: includes/class-freemius.php:4457
157
  msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience."
158
  msgstr ""
159
 
160
- #: includes/class-freemius.php:4879
161
  msgctxt "addonX cannot run without pluginY"
162
  msgid "%s cannot run without %s."
163
  msgstr ""
164
 
165
- #: includes/class-freemius.php:4880
166
  msgctxt "addonX cannot run..."
167
  msgid "%s cannot run without the plugin."
168
  msgstr ""
169
 
170
- #: includes/class-freemius.php:5053, includes/class-freemius.php:5078, includes/class-freemius.php:20578
171
  msgid "Unexpected API error. Please contact the %s's author with the following error."
172
  msgstr ""
173
 
174
- #: includes/class-freemius.php:5777
175
  msgid "Premium %s version was successfully activated."
176
  msgstr ""
177
 
178
- #: includes/class-freemius.php:5789, includes/class-freemius.php:7682
179
  msgctxt "Used to express elation, enthusiasm, or triumph (especially in electronic communication)."
180
  msgid "W00t"
181
  msgstr ""
182
 
183
- #: includes/class-freemius.php:5804
184
  msgid "You have a %s license."
185
  msgstr ""
186
 
187
- #: includes/class-freemius.php:5808, includes/class-freemius.php:16405, includes/class-freemius.php:16416, includes/class-freemius.php:19744, includes/class-freemius.php:20094, includes/class-freemius.php:20163, includes/class-freemius.php:20328
188
  msgctxt "interjection expressing joy or exuberance"
189
  msgid "Yee-haw"
190
  msgstr ""
191
 
192
- #: includes/class-freemius.php:6094
193
  msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
194
  msgstr ""
195
 
196
- #: includes/class-freemius.php:6098
197
  msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
198
  msgstr ""
199
 
200
- #: includes/class-freemius.php:6107, templates/add-ons.php:186, templates/account/partials/addon.php:381
201
  msgid "More information about %s"
202
  msgstr ""
203
 
204
- #: includes/class-freemius.php:6108
205
  msgid "Purchase License"
206
  msgstr ""
207
 
208
- #: includes/class-freemius.php:7047, templates/connect.php:171
209
  msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
210
  msgstr ""
211
 
212
- #: includes/class-freemius.php:7051
213
  msgid "start the trial"
214
  msgstr ""
215
 
216
- #: includes/class-freemius.php:7052, templates/connect.php:175
217
  msgid "complete the install"
218
  msgstr ""
219
 
220
- #: includes/class-freemius.php:7164
221
  msgid "You are just one step away - %s"
222
  msgstr ""
223
 
224
- #: includes/class-freemius.php:7167
225
  msgctxt "%s - plugin name. As complete \"PluginX\" activation now"
226
  msgid "Complete \"%s\" Activation Now"
227
  msgstr ""
228
 
229
- #: includes/class-freemius.php:7245
230
  msgid "We made a few tweaks to the %s, %s"
231
  msgstr ""
232
 
233
- #: includes/class-freemius.php:7249
234
  msgid "Opt in to make \"%s\" better!"
235
  msgstr ""
236
 
237
- #: includes/class-freemius.php:7681
238
  msgid "The upgrade of %s was successfully completed."
239
  msgstr ""
240
 
241
- #: includes/class-freemius.php:9908, includes/class-fs-plugin-updater.php:1044, includes/class-fs-plugin-updater.php:1239, includes/class-fs-plugin-updater.php:1246, templates/auto-installation.php:32
242
  msgid "Add-On"
243
  msgstr ""
244
 
245
- #: includes/class-freemius.php:9910, templates/account.php:343, templates/account.php:351, templates/debug.php:358, templates/debug.php:549
246
  msgid "Plugin"
247
  msgstr ""
248
 
249
- #: includes/class-freemius.php:9911, templates/account.php:344, templates/account.php:352, templates/debug.php:358, templates/debug.php:549, templates/forms/deactivation/form.php:71
250
  msgid "Theme"
251
  msgstr ""
252
 
253
- #: includes/class-freemius.php:12843
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  msgid "An unknown error has occurred while trying to set the user's beta mode."
255
  msgstr ""
256
 
257
- #: includes/class-freemius.php:12904
258
  msgid "Invalid new user ID or email address."
259
  msgstr ""
260
 
261
- #: includes/class-freemius.php:12934, includes/class-freemius.php:21645
262
  msgid "Sorry, we could not complete the email update. Another user with the same email is already registered."
263
  msgstr ""
264
 
265
- #: includes/class-freemius.php:12935, includes/class-freemius.php:21646
266
  msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button."
267
  msgstr ""
268
 
269
- #: includes/class-freemius.php:12942, includes/class-freemius.php:21653
270
  msgid "Change Ownership"
271
  msgstr ""
272
 
273
- #: includes/class-freemius.php:13438
274
  msgid "Invalid site details collection."
275
  msgstr ""
276
 
277
- #: includes/class-freemius.php:13558
278
  msgid "We couldn't find your email address in the system, are you sure it's the right address?"
279
  msgstr ""
280
 
281
- #: includes/class-freemius.php:13560
282
  msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?"
283
  msgstr ""
284
 
285
- #: includes/class-freemius.php:13834
286
  msgid "Account is pending activation."
287
  msgstr ""
288
 
289
- #: includes/class-freemius.php:13946, templates/forms/premium-versions-upgrade-handler.php:47
290
  msgid "Buy a license now"
291
  msgstr ""
292
 
293
- #: includes/class-freemius.php:13958, templates/forms/premium-versions-upgrade-handler.php:46
294
  msgid "Renew your license now"
295
  msgstr ""
296
 
297
- #: includes/class-freemius.php:13962
298
  msgid "%s to access version %s security & feature updates, and support."
299
  msgstr ""
300
 
301
- #: includes/class-freemius.php:16387
302
  msgid "%s activation was successfully completed."
303
  msgstr ""
304
 
305
- #: includes/class-freemius.php:16401
306
  msgid "Your account was successfully activated with the %s plan."
307
  msgstr ""
308
 
309
- #: includes/class-freemius.php:16412, includes/class-freemius.php:20159
310
  msgid "Your trial has been successfully started."
311
  msgstr ""
312
 
313
- #: includes/class-freemius.php:17004, includes/class-freemius.php:17092, includes/class-freemius.php:17258
314
  msgid "Couldn't activate %s."
315
  msgstr ""
316
 
317
- #: includes/class-freemius.php:17005, includes/class-freemius.php:17093, includes/class-freemius.php:17259
318
  msgid "Please contact us with the following message:"
319
  msgstr ""
320
 
321
- #: includes/class-freemius.php:17089, templates/forms/data-debug-mode.php:162
322
  msgid "An unknown error has occurred."
323
  msgstr ""
324
 
325
- #: includes/class-freemius.php:17616, includes/class-freemius.php:22589
326
  msgid "Upgrade"
327
  msgstr ""
328
 
329
- #: includes/class-freemius.php:17622
330
  msgid "Start Trial"
331
  msgstr ""
332
 
333
- #: includes/class-freemius.php:17624
334
  msgid "Pricing"
335
  msgstr ""
336
 
337
- #: includes/class-freemius.php:17704, includes/class-freemius.php:17706
338
  msgid "Affiliation"
339
  msgstr ""
340
 
341
- #: includes/class-freemius.php:17734, includes/class-freemius.php:17736, templates/account.php:191, templates/debug.php:324
342
  msgid "Account"
343
  msgstr ""
344
 
345
- #: includes/class-freemius.php:17750, includes/class-freemius.php:17752, includes/customizer/class-fs-customizer-support-section.php:60
346
  msgid "Contact Us"
347
  msgstr ""
348
 
349
- #: includes/class-freemius.php:17763, includes/class-freemius.php:17765, includes/class-freemius.php:22603, templates/account.php:119, templates/account/partials/addon.php:44
350
  msgid "Add-Ons"
351
  msgstr ""
352
 
353
- #: includes/class-freemius.php:17799
354
  msgctxt "ASCII arrow left icon"
355
  msgid "&#x2190;"
356
  msgstr ""
357
 
358
- #: includes/class-freemius.php:17799
359
  msgctxt "ASCII arrow right icon"
360
  msgid "&#x27a4;"
361
  msgstr ""
362
 
363
- #: includes/class-freemius.php:17801, templates/pricing.php:103
364
  msgctxt "noun"
365
  msgid "Pricing"
366
  msgstr ""
367
 
368
- #: includes/class-freemius.php:18014, includes/customizer/class-fs-customizer-support-section.php:67
369
  msgid "Support Forum"
370
  msgstr ""
371
 
372
- #: includes/class-freemius.php:18988
373
  msgid "Your email has been successfully verified - you are AWESOME!"
374
  msgstr ""
375
 
376
- #: includes/class-freemius.php:18989
377
  msgctxt "a positive response"
378
  msgid "Right on"
379
  msgstr ""
380
 
381
- #: includes/class-freemius.php:19493
382
  msgid "seems like the key you entered doesn't match our records."
383
  msgstr ""
384
 
385
- #: includes/class-freemius.php:19517
386
  msgid "Debug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the \"Stop Debug\" link."
387
  msgstr ""
388
 
389
- #: includes/class-freemius.php:19735
390
  msgid "Your %s Add-on plan was successfully upgraded."
391
  msgstr ""
392
 
393
- #: includes/class-freemius.php:19737
394
  msgid "%s Add-on was successfully purchased."
395
  msgstr ""
396
 
397
- #: includes/class-freemius.php:19740
398
  msgid "Download the latest version"
399
  msgstr ""
400
 
401
- #: includes/class-freemius.php:19826
402
  msgid "Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$s"
403
  msgstr ""
404
 
405
- #: includes/class-freemius.php:19832, includes/class-freemius.php:19842, includes/class-freemius.php:20287, includes/class-freemius.php:20376
406
  msgid "Error received from the server:"
407
  msgstr ""
408
 
409
- #: includes/class-freemius.php:19842
410
  msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again."
411
  msgstr ""
412
 
413
- #: includes/class-freemius.php:20056, includes/class-freemius.php:20292, includes/class-freemius.php:20347, includes/class-freemius.php:20454
414
  msgctxt "something somebody says when they are thinking about what you have just said."
415
  msgid "Hmm"
416
  msgstr ""
417
 
418
- #: includes/class-freemius.php:20069
419
  msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry."
420
  msgstr ""
421
 
422
- #: includes/class-freemius.php:20070, templates/account.php:121, templates/add-ons.php:250, templates/account/partials/addon.php:46
423
  msgctxt "trial period"
424
  msgid "Trial"
425
  msgstr ""
426
 
427
- #: includes/class-freemius.php:20075
428
  msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s."
429
  msgstr ""
430
 
431
- #: includes/class-freemius.php:20079, includes/class-freemius.php:20138
432
  msgid "Please contact us here"
433
  msgstr ""
434
 
435
- #: includes/class-freemius.php:20090
436
  msgid "Your plan was successfully activated."
437
  msgstr ""
438
 
439
- #: includes/class-freemius.php:20091
440
  msgid "Your plan was successfully upgraded."
441
  msgstr ""
442
 
443
- #: includes/class-freemius.php:20108
444
  msgid "Your plan was successfully changed to %s."
445
  msgstr ""
446
 
447
- #: includes/class-freemius.php:20124
448
  msgid "Your license has expired. You can still continue using the free %s forever."
449
  msgstr ""
450
 
451
- #: includes/class-freemius.php:20126
452
  msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
453
  msgstr ""
454
 
455
- #: includes/class-freemius.php:20134
456
  msgid "Your license has been cancelled. If you think it's a mistake, please contact support."
457
  msgstr ""
458
 
459
- #: includes/class-freemius.php:20147
460
  msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support."
461
  msgstr ""
462
 
463
- #: includes/class-freemius.php:20173
464
  msgid "Your free trial has expired. You can still continue using all our free features."
465
  msgstr ""
466
 
467
- #: includes/class-freemius.php:20175
468
  msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
469
  msgstr ""
470
 
471
- #: includes/class-freemius.php:20283
472
  msgid "It looks like the license could not be activated."
473
  msgstr ""
474
 
475
- #: includes/class-freemius.php:20325
476
  msgid "Your license was successfully activated."
477
  msgstr ""
478
 
479
- #: includes/class-freemius.php:20351
480
  msgid "It looks like your site currently doesn't have an active license."
481
  msgstr ""
482
 
483
- #: includes/class-freemius.php:20375
484
  msgid "It looks like the license deactivation failed."
485
  msgstr ""
486
 
487
- #: includes/class-freemius.php:20404
488
  msgid "Your %s license was successfully deactivated."
489
  msgstr ""
490
 
491
- #: includes/class-freemius.php:20405
492
  msgid "Your license was successfully deactivated, you are back to the %s plan."
493
  msgstr ""
494
 
495
- #: includes/class-freemius.php:20408
496
  msgid "O.K"
497
  msgstr ""
498
 
499
- #: includes/class-freemius.php:20461
500
  msgid "Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes."
501
  msgstr ""
502
 
503
- #: includes/class-freemius.php:20470
504
  msgid "Your subscription was successfully cancelled. Your %s plan license will expire in %s."
505
  msgstr ""
506
 
507
- #: includes/class-freemius.php:20512
508
  msgid "You are already running the %s in a trial mode."
509
  msgstr ""
510
 
511
- #: includes/class-freemius.php:20523
512
  msgid "You already utilized a trial before."
513
  msgstr ""
514
 
515
- #: includes/class-freemius.php:20537
516
  msgid "Plan %s do not exist, therefore, can't start a trial."
517
  msgstr ""
518
 
519
- #: includes/class-freemius.php:20548
520
  msgid "Plan %s does not support a trial period."
521
  msgstr ""
522
 
523
- #: includes/class-freemius.php:20559
524
  msgid "None of the %s's plans supports a trial period."
525
  msgstr ""
526
 
527
- #: includes/class-freemius.php:20609
528
  msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)"
529
  msgstr ""
530
 
531
- #: includes/class-freemius.php:20645
532
  msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes."
533
  msgstr ""
534
 
535
- #: includes/class-freemius.php:20664
536
  msgid "Your %s free trial was successfully cancelled."
537
  msgstr ""
538
 
539
- #: includes/class-freemius.php:20980
540
  msgid "Version %s was released."
541
  msgstr ""
542
 
543
- #: includes/class-freemius.php:20980
544
  msgid "Please download %s."
545
  msgstr ""
546
 
547
- #: includes/class-freemius.php:20987
548
  msgid "the latest %s version here"
549
  msgstr ""
550
 
551
- #: includes/class-freemius.php:20992
552
  msgid "New"
553
  msgstr ""
554
 
555
- #: includes/class-freemius.php:20997
556
  msgid "Seems like you got the latest release."
557
  msgstr ""
558
 
559
- #: includes/class-freemius.php:20998
560
  msgid "You are all good!"
561
  msgstr ""
562
 
563
- #: includes/class-freemius.php:21301
564
  msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box."
565
  msgstr ""
566
 
567
- #: includes/class-freemius.php:21441
568
  msgid "Site successfully opted in."
569
  msgstr ""
570
 
571
- #: includes/class-freemius.php:21442, includes/class-freemius.php:22299
572
  msgid "Awesome"
573
  msgstr ""
574
 
575
- #: includes/class-freemius.php:21458, templates/forms/optout.php:41
576
  msgid "We appreciate your help in making the %s better by letting us track some usage data."
577
  msgstr ""
578
 
579
- #: includes/class-freemius.php:21459
580
  msgid "Thank you!"
581
  msgstr ""
582
 
583
- #: includes/class-freemius.php:21466
584
  msgid "We will no longer be sending any usage data of %s on %s to %s."
585
  msgstr ""
586
 
587
- #: includes/class-freemius.php:21612
588
  msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder."
589
  msgstr ""
590
 
591
- #: includes/class-freemius.php:21618
592
  msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval."
593
  msgstr ""
594
 
595
- #: includes/class-freemius.php:21623
596
  msgid "%s is the new owner of the account."
597
  msgstr ""
598
 
599
- #: includes/class-freemius.php:21625
600
  msgctxt "as congratulations"
601
  msgid "Congrats"
602
  msgstr ""
603
 
604
- #: includes/class-freemius.php:21661
605
  msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments."
606
  msgstr ""
607
 
608
- #: includes/class-freemius.php:21673
609
  msgid "Please provide your full name."
610
  msgstr ""
611
 
612
- #: includes/class-freemius.php:21678
613
  msgid "Your name was successfully updated."
614
  msgstr ""
615
 
616
- #: includes/class-freemius.php:21739
617
  msgid "You have successfully updated your %s."
618
  msgstr ""
619
 
620
- #: includes/class-freemius.php:21879
 
 
 
 
 
 
 
 
621
  msgid "Just letting you know that the add-ons information of %s is being pulled from an external server."
622
  msgstr ""
623
 
624
- #: includes/class-freemius.php:21880
625
  msgctxt "advance notice of something that will need attention."
626
  msgid "Heads up"
627
  msgstr ""
628
 
629
- #: includes/class-freemius.php:22339
630
  msgctxt "exclamation"
631
  msgid "Hey"
632
  msgstr ""
633
 
634
- #: includes/class-freemius.php:22339
635
  msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial."
636
  msgstr ""
637
 
638
- #: includes/class-freemius.php:22347
639
  msgid "No commitment for %s days - cancel anytime!"
640
  msgstr ""
641
 
642
- #: includes/class-freemius.php:22348
643
  msgid "No credit card required"
644
  msgstr ""
645
 
646
- #: includes/class-freemius.php:22355, templates/forms/trial-start.php:53
647
  msgctxt "call to action"
648
  msgid "Start free trial"
649
  msgstr ""
650
 
651
- #: includes/class-freemius.php:22432
652
  msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!"
653
  msgstr ""
654
 
655
- #: includes/class-freemius.php:22441
656
  msgid "Learn more"
657
  msgstr ""
658
 
659
- #: includes/class-freemius.php:22627, templates/account.php:507, templates/account.php:657, templates/connect.php:179, templates/connect.php:455, templates/forms/license-activation.php:27, templates/account/partials/addon.php:321
660
  msgid "Activate License"
661
  msgstr ""
662
 
663
- #: includes/class-freemius.php:22628, templates/account.php:601, templates/account.php:656, templates/account/partials/addon.php:322, templates/account/partials/site.php:271
664
  msgid "Change License"
665
  msgstr ""
666
 
667
- #: includes/class-freemius.php:22737, templates/account/partials/site.php:169
668
  msgid "Opt Out"
669
  msgstr ""
670
 
671
- #: includes/class-freemius.php:22739, includes/class-freemius.php:22745, templates/account/partials/site.php:49, templates/account/partials/site.php:169
672
  msgid "Opt In"
673
  msgstr ""
674
 
675
- #: includes/class-freemius.php:22973
676
  msgid " The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"
677
  msgstr ""
678
 
679
- #: includes/class-freemius.php:22981
680
  msgid "Activate %s features"
681
  msgstr ""
682
 
683
- #: includes/class-freemius.php:22994
684
  msgid "Please follow these steps to complete the upgrade"
685
  msgstr ""
686
 
687
- #: includes/class-freemius.php:22998
688
  msgid "Download the latest %s version"
689
  msgstr ""
690
 
691
- #: includes/class-freemius.php:23002
692
  msgid "Upload and activate the downloaded version"
693
  msgstr ""
694
 
695
- #: includes/class-freemius.php:23004
696
  msgid "How to upload and activate?"
697
  msgstr ""
698
 
699
- #: includes/class-freemius.php:23138
700
  msgid "%sClick here%s to choose the sites where you'd like to activate the license on."
701
  msgstr ""
702
 
703
- #: includes/class-freemius.php:23299
704
  msgid "Auto installation only works for opted-in users."
705
  msgstr ""
706
 
707
- #: includes/class-freemius.php:23309, includes/class-freemius.php:23342, includes/class-fs-plugin-updater.php:1218, includes/class-fs-plugin-updater.php:1232
708
  msgid "Invalid module ID."
709
  msgstr ""
710
 
711
- #: includes/class-freemius.php:23318, includes/class-fs-plugin-updater.php:1254
712
  msgid "Premium version already active."
713
  msgstr ""
714
 
715
- #: includes/class-freemius.php:23325
716
  msgid "You do not have a valid license to access the premium version."
717
  msgstr ""
718
 
719
- #: includes/class-freemius.php:23332
720
  msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version."
721
  msgstr ""
722
 
723
- #: includes/class-freemius.php:23350, includes/class-fs-plugin-updater.php:1253
724
  msgid "Premium add-on version already installed."
725
  msgstr ""
726
 
727
- #: includes/class-freemius.php:23700
728
  msgid "View paid features"
729
  msgstr ""
730
 
731
- #: includes/class-freemius.php:24022
732
  msgid "Thank you so much for using %s and its add-ons!"
733
  msgstr ""
734
 
735
- #: includes/class-freemius.php:24023
736
  msgid "Thank you so much for using %s!"
737
  msgstr ""
738
 
739
- #: includes/class-freemius.php:24029
740
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s."
741
  msgstr ""
742
 
743
- #: includes/class-freemius.php:24033
744
  msgid "Thank you so much for using our products!"
745
  msgstr ""
746
 
747
- #: includes/class-freemius.php:24034
748
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving them."
749
  msgstr ""
750
 
751
- #: includes/class-freemius.php:24053
752
  msgid "%s and its add-ons"
753
  msgstr ""
754
 
755
- #: includes/class-freemius.php:24062
756
  msgid "Products"
757
  msgstr ""
758
 
759
- #: includes/class-freemius.php:24069, templates/connect.php:280
760
  msgid "Yes"
761
  msgstr ""
762
 
763
- #: includes/class-freemius.php:24070, templates/connect.php:281
764
  msgid "send me security & feature updates, educational content and offers."
765
  msgstr ""
766
 
767
- #: includes/class-freemius.php:24071, templates/connect.php:286
768
  msgid "No"
769
  msgstr ""
770
 
771
- #: includes/class-freemius.php:24073, templates/connect.php:288
772
  msgid "do %sNOT%s send me security & feature updates, educational content and offers."
773
  msgstr ""
774
 
775
- #: includes/class-freemius.php:24083
776
  msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)"
777
  msgstr ""
778
 
779
- #: includes/class-freemius.php:24085, templates/connect.php:295
780
  msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:"
781
  msgstr ""
782
 
783
- #: includes/class-freemius.php:24367
784
  msgid "License key is empty."
785
  msgstr ""
786
 
@@ -808,314 +832,314 @@ msgstr ""
808
  msgid "Important Upgrade Notice:"
809
  msgstr ""
810
 
811
- #: includes/class-fs-plugin-updater.php:1283
812
  msgid "Installing plugin: %s"
813
  msgstr ""
814
 
815
- #: includes/class-fs-plugin-updater.php:1324
816
  msgid "Unable to connect to the filesystem. Please confirm your credentials."
817
  msgstr ""
818
 
819
- #: includes/class-fs-plugin-updater.php:1506
820
  msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work."
821
  msgstr ""
822
 
823
- #: includes/fs-plugin-info-dialog.php:535
824
  msgid "Purchase More"
825
  msgstr ""
826
 
827
- #: includes/fs-plugin-info-dialog.php:536, templates/account/partials/addon.php:385
828
  msgctxt "verb"
829
  msgid "Purchase"
830
  msgstr ""
831
 
832
- #: includes/fs-plugin-info-dialog.php:540
833
  msgid "Start my free %s"
834
  msgstr ""
835
 
836
- #: includes/fs-plugin-info-dialog.php:738
837
  msgid "Install Free Version Update Now"
838
  msgstr ""
839
 
840
- #: includes/fs-plugin-info-dialog.php:739, templates/account.php:590
841
  msgid "Install Update Now"
842
  msgstr ""
843
 
844
- #: includes/fs-plugin-info-dialog.php:748
845
  msgid "Install Free Version Now"
846
  msgstr ""
847
 
848
- #: includes/fs-plugin-info-dialog.php:749, templates/add-ons.php:323, templates/auto-installation.php:111, templates/account/partials/addon.php:365, templates/account/partials/addon.php:418
849
  msgid "Install Now"
850
  msgstr ""
851
 
852
- #: includes/fs-plugin-info-dialog.php:765
853
  msgctxt "as download latest version"
854
  msgid "Download Latest Free Version"
855
  msgstr ""
856
 
857
- #: includes/fs-plugin-info-dialog.php:766, templates/account.php:99, templates/add-ons.php:37, templates/account/partials/addon.php:25
858
  msgctxt "as download latest version"
859
  msgid "Download Latest"
860
  msgstr ""
861
 
862
- #: includes/fs-plugin-info-dialog.php:781, templates/add-ons.php:329, templates/account/partials/addon.php:356, templates/account/partials/addon.php:412
863
  msgid "Activate this add-on"
864
  msgstr ""
865
 
866
- #: includes/fs-plugin-info-dialog.php:783, templates/connect.php:452
867
  msgid "Activate Free Version"
868
  msgstr ""
869
 
870
- #: includes/fs-plugin-info-dialog.php:784, templates/account.php:123, templates/add-ons.php:330, templates/account/partials/addon.php:48
871
  msgid "Activate"
872
  msgstr ""
873
 
874
- #: includes/fs-plugin-info-dialog.php:994
875
  msgctxt "Plugin installer section title"
876
  msgid "Description"
877
  msgstr ""
878
 
879
- #: includes/fs-plugin-info-dialog.php:995
880
  msgctxt "Plugin installer section title"
881
  msgid "Installation"
882
  msgstr ""
883
 
884
- #: includes/fs-plugin-info-dialog.php:996
885
  msgctxt "Plugin installer section title"
886
  msgid "FAQ"
887
  msgstr ""
888
 
889
- #: includes/fs-plugin-info-dialog.php:997, templates/plugin-info/description.php:55
890
  msgid "Screenshots"
891
  msgstr ""
892
 
893
- #: includes/fs-plugin-info-dialog.php:998
894
  msgctxt "Plugin installer section title"
895
  msgid "Changelog"
896
  msgstr ""
897
 
898
- #: includes/fs-plugin-info-dialog.php:999
899
  msgctxt "Plugin installer section title"
900
  msgid "Reviews"
901
  msgstr ""
902
 
903
- #: includes/fs-plugin-info-dialog.php:1000
904
  msgctxt "Plugin installer section title"
905
  msgid "Other Notes"
906
  msgstr ""
907
 
908
- #: includes/fs-plugin-info-dialog.php:1015
909
  msgctxt "Plugin installer section title"
910
  msgid "Features & Pricing"
911
  msgstr ""
912
 
913
- #: includes/fs-plugin-info-dialog.php:1025
914
  msgid "Plugin Install"
915
  msgstr ""
916
 
917
- #: includes/fs-plugin-info-dialog.php:1097
918
  msgctxt "e.g. Professional Plan"
919
  msgid "%s Plan"
920
  msgstr ""
921
 
922
- #: includes/fs-plugin-info-dialog.php:1123
923
  msgctxt "e.g. the best product"
924
  msgid "Best"
925
  msgstr ""
926
 
927
- #: includes/fs-plugin-info-dialog.php:1129, includes/fs-plugin-info-dialog.php:1149
928
  msgctxt "as every month"
929
  msgid "Monthly"
930
  msgstr ""
931
 
932
- #: includes/fs-plugin-info-dialog.php:1132
933
  msgctxt "as once a year"
934
  msgid "Annual"
935
  msgstr ""
936
 
937
- #: includes/fs-plugin-info-dialog.php:1135
938
  msgid "Lifetime"
939
  msgstr ""
940
 
941
- #: includes/fs-plugin-info-dialog.php:1149, includes/fs-plugin-info-dialog.php:1151, includes/fs-plugin-info-dialog.php:1153
942
  msgctxt "e.g. billed monthly"
943
  msgid "Billed %s"
944
  msgstr ""
945
 
946
- #: includes/fs-plugin-info-dialog.php:1151
947
  msgctxt "as once a year"
948
  msgid "Annually"
949
  msgstr ""
950
 
951
- #: includes/fs-plugin-info-dialog.php:1153
952
  msgctxt "as once a year"
953
  msgid "Once"
954
  msgstr ""
955
 
956
- #: includes/fs-plugin-info-dialog.php:1159
957
  msgid "Single Site License"
958
  msgstr ""
959
 
960
- #: includes/fs-plugin-info-dialog.php:1161
961
  msgid "Unlimited Licenses"
962
  msgstr ""
963
 
964
- #: includes/fs-plugin-info-dialog.php:1163
965
  msgid "Up to %s Sites"
966
  msgstr ""
967
 
968
- #: includes/fs-plugin-info-dialog.php:1173, templates/plugin-info/features.php:82
969
  msgctxt "as monthly period"
970
  msgid "mo"
971
  msgstr ""
972
 
973
- #: includes/fs-plugin-info-dialog.php:1180, templates/plugin-info/features.php:80
974
  msgctxt "as annual period"
975
  msgid "year"
976
  msgstr ""
977
 
978
- #: includes/fs-plugin-info-dialog.php:1234
979
  msgctxt "noun"
980
  msgid "Price"
981
  msgstr ""
982
 
983
- #: includes/fs-plugin-info-dialog.php:1282
984
  msgid "Save %s"
985
  msgstr ""
986
 
987
- #: includes/fs-plugin-info-dialog.php:1292
988
  msgid "No commitment for %s - cancel anytime"
989
  msgstr ""
990
 
991
- #: includes/fs-plugin-info-dialog.php:1295
992
  msgid "After your free %s, pay as little as %s"
993
  msgstr ""
994
 
995
- #: includes/fs-plugin-info-dialog.php:1306
996
  msgid "Details"
997
  msgstr ""
998
 
999
- #: includes/fs-plugin-info-dialog.php:1310, templates/account.php:110, templates/debug.php:201, templates/debug.php:238, templates/debug.php:455, templates/account/partials/addon.php:36
1000
  msgctxt "product version"
1001
  msgid "Version"
1002
  msgstr ""
1003
 
1004
- #: includes/fs-plugin-info-dialog.php:1317
1005
  msgctxt "as the plugin author"
1006
  msgid "Author"
1007
  msgstr ""
1008
 
1009
- #: includes/fs-plugin-info-dialog.php:1324
1010
  msgid "Last Updated"
1011
  msgstr ""
1012
 
1013
- #: includes/fs-plugin-info-dialog.php:1329, templates/account.php:476
1014
  msgctxt "x-ago"
1015
  msgid "%s ago"
1016
  msgstr ""
1017
 
1018
- #: includes/fs-plugin-info-dialog.php:1338
1019
  msgid "Requires WordPress Version"
1020
  msgstr ""
1021
 
1022
- #: includes/fs-plugin-info-dialog.php:1339
1023
  msgid "%s or higher"
1024
  msgstr ""
1025
 
1026
- #: includes/fs-plugin-info-dialog.php:1346
1027
  msgid "Compatible up to"
1028
  msgstr ""
1029
 
1030
- #: includes/fs-plugin-info-dialog.php:1354
1031
  msgid "Downloaded"
1032
  msgstr ""
1033
 
1034
- #: includes/fs-plugin-info-dialog.php:1358
1035
  msgid "%s time"
1036
  msgstr ""
1037
 
1038
- #: includes/fs-plugin-info-dialog.php:1360
1039
  msgid "%s times"
1040
  msgstr ""
1041
 
1042
- #: includes/fs-plugin-info-dialog.php:1370
1043
  msgid "WordPress.org Plugin Page"
1044
  msgstr ""
1045
 
1046
- #: includes/fs-plugin-info-dialog.php:1378
1047
  msgid "Plugin Homepage"
1048
  msgstr ""
1049
 
1050
- #: includes/fs-plugin-info-dialog.php:1386, includes/fs-plugin-info-dialog.php:1468
1051
  msgid "Donate to this plugin"
1052
  msgstr ""
1053
 
1054
- #: includes/fs-plugin-info-dialog.php:1393
1055
  msgid "Average Rating"
1056
  msgstr ""
1057
 
1058
- #: includes/fs-plugin-info-dialog.php:1400
1059
  msgid "based on %s"
1060
  msgstr ""
1061
 
1062
- #: includes/fs-plugin-info-dialog.php:1404
1063
  msgid "%s rating"
1064
  msgstr ""
1065
 
1066
- #: includes/fs-plugin-info-dialog.php:1406
1067
  msgid "%s ratings"
1068
  msgstr ""
1069
 
1070
- #: includes/fs-plugin-info-dialog.php:1421
1071
  msgid "%s star"
1072
  msgstr ""
1073
 
1074
- #: includes/fs-plugin-info-dialog.php:1423
1075
  msgid "%s stars"
1076
  msgstr ""
1077
 
1078
- #: includes/fs-plugin-info-dialog.php:1434
1079
  msgid "Click to see reviews that provided a rating of %s"
1080
  msgstr ""
1081
 
1082
- #: includes/fs-plugin-info-dialog.php:1447
1083
  msgid "Contributors"
1084
  msgstr ""
1085
 
1086
- #: includes/fs-plugin-info-dialog.php:1476, includes/fs-plugin-info-dialog.php:1478
1087
  msgid "Warning"
1088
  msgstr ""
1089
 
1090
- #: includes/fs-plugin-info-dialog.php:1476
1091
  msgid "This plugin has not been tested with your current version of WordPress."
1092
  msgstr ""
1093
 
1094
- #: includes/fs-plugin-info-dialog.php:1478
1095
  msgid "This plugin has not been marked as compatible with your version of WordPress."
1096
  msgstr ""
1097
 
1098
- #: includes/fs-plugin-info-dialog.php:1497
1099
  msgid "Paid add-on must be deployed to Freemius."
1100
  msgstr ""
1101
 
1102
- #: includes/fs-plugin-info-dialog.php:1498
1103
  msgid "Add-on must be deployed to WordPress.org or Freemius."
1104
  msgstr ""
1105
 
1106
- #: includes/fs-plugin-info-dialog.php:1519
1107
  msgid "Newer Version (%s) Installed"
1108
  msgstr ""
1109
 
1110
- #: includes/fs-plugin-info-dialog.php:1520
1111
  msgid "Newer Free Version (%s) Installed"
1112
  msgstr ""
1113
 
1114
- #: includes/fs-plugin-info-dialog.php:1527
1115
  msgid "Latest Version Installed"
1116
  msgstr ""
1117
 
1118
- #: includes/fs-plugin-info-dialog.php:1528
1119
  msgid "Latest Free Version Installed"
1120
  msgstr ""
1121
 
@@ -1199,208 +1223,216 @@ msgstr ""
1199
  msgid "Bundle Plan"
1200
  msgstr ""
1201
 
1202
- #: templates/account.php:199
1203
  msgid "Free Trial"
1204
  msgstr ""
1205
 
1206
- #: templates/account.php:210
1207
  msgid "Account Details"
1208
  msgstr ""
1209
 
1210
- #: templates/account.php:217, templates/forms/data-debug-mode.php:33
1211
  msgid "Start Debug"
1212
  msgstr ""
1213
 
1214
- #: templates/account.php:219
1215
  msgid "Stop Debug"
1216
  msgstr ""
1217
 
1218
- #: templates/account.php:226
1219
  msgid "Billing & Invoices"
1220
  msgstr ""
1221
 
1222
- #: templates/account.php:237
1223
  msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?"
1224
  msgstr ""
1225
 
1226
- #: templates/account.php:239
1227
  msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?"
1228
  msgstr ""
1229
 
1230
- #: templates/account.php:242
1231
  msgid "Delete Account"
1232
  msgstr ""
1233
 
1234
- #: templates/account.php:254, templates/account/partials/addon.php:231, templates/account/partials/deactivate-license-button.php:35
1235
  msgid "Deactivate License"
1236
  msgstr ""
1237
 
1238
- #: templates/account.php:277, templates/forms/subscription-cancellation.php:125
1239
  msgid "Are you sure you want to proceed?"
1240
  msgstr ""
1241
 
1242
- #: templates/account.php:277, templates/account/partials/addon.php:255
1243
  msgid "Cancel Subscription"
1244
  msgstr ""
1245
 
1246
- #: templates/account.php:306, templates/account/partials/addon.php:340
1247
  msgctxt "as synchronize"
1248
  msgid "Sync"
1249
  msgstr ""
1250
 
1251
- #: templates/account.php:321, templates/debug.php:505
1252
  msgid "Name"
1253
  msgstr ""
1254
 
1255
- #: templates/account.php:327, templates/debug.php:506
1256
  msgid "Email"
1257
  msgstr ""
1258
 
1259
- #: templates/account.php:334, templates/debug.php:369, templates/debug.php:555
1260
  msgid "User ID"
1261
  msgstr ""
1262
 
1263
- #: templates/account.php:352, templates/account.php:670, templates/account.php:715, templates/debug.php:236, templates/debug.php:363, templates/debug.php:452, templates/debug.php:504, templates/debug.php:553, templates/debug.php:632, templates/account/payments.php:35, templates/debug/logger.php:21
1264
  msgid "ID"
1265
  msgstr ""
1266
 
1267
- #: templates/account.php:359
1268
  msgid "Site ID"
1269
  msgstr ""
1270
 
1271
- #: templates/account.php:362
1272
  msgid "No ID"
1273
  msgstr ""
1274
 
1275
- #: templates/account.php:367, templates/debug.php:243, templates/debug.php:372, templates/debug.php:456, templates/debug.php:508, templates/account/partials/site.php:227
1276
  msgid "Public Key"
1277
  msgstr ""
1278
 
1279
- #: templates/account.php:373, templates/debug.php:373, templates/debug.php:457, templates/debug.php:509, templates/account/partials/site.php:239
1280
  msgid "Secret Key"
1281
  msgstr ""
1282
 
1283
- #: templates/account.php:376
1284
  msgctxt "as secret encryption key missing"
1285
  msgid "No Secret"
1286
  msgstr ""
1287
 
1288
- #: templates/account.php:403, templates/account/partials/site.php:120, templates/account/partials/site.php:122
1289
  msgid "Trial"
1290
  msgstr ""
1291
 
1292
- #: templates/account.php:430, templates/debug.php:561, templates/account/partials/site.php:260
1293
  msgid "License Key"
1294
  msgstr ""
1295
 
1296
- #: templates/account.php:461
1297
  msgid "Join the Beta program"
1298
  msgstr ""
1299
 
1300
- #: templates/account.php:467
1301
  msgid "not verified"
1302
  msgstr ""
1303
 
1304
- #: templates/account.php:476, templates/account/partials/addon.php:190
1305
  msgid "Expired"
1306
  msgstr ""
1307
 
1308
- #: templates/account.php:536
1309
  msgid "Premium version"
1310
  msgstr ""
1311
 
1312
- #: templates/account.php:538
1313
  msgid "Free version"
1314
  msgstr ""
1315
 
1316
- #: templates/account.php:550
1317
  msgid "Verify Email"
1318
  msgstr ""
1319
 
1320
- #: templates/account.php:564
1321
  msgid "Download %s Version"
1322
  msgstr ""
1323
 
1324
- #: templates/account.php:580
1325
  msgid "Download Paid Version"
1326
  msgstr ""
1327
 
1328
- #: templates/account.php:598, templates/account.php:853, templates/account/partials/site.php:248, templates/account/partials/site.php:270
1329
  msgctxt "verb"
1330
  msgid "Show"
1331
  msgstr ""
1332
 
1333
- #: templates/account.php:613
1334
  msgid "What is your %s?"
1335
  msgstr ""
1336
 
1337
- #: templates/account.php:621, templates/account/billing.php:21
1338
  msgctxt "verb"
1339
  msgid "Edit"
1340
  msgstr ""
1341
 
1342
- #: templates/account.php:625, templates/forms/user-change.php:27
1343
  msgid "Change User"
1344
  msgstr ""
1345
 
1346
- #: templates/account.php:649
1347
  msgid "Sites"
1348
  msgstr ""
1349
 
1350
- #: templates/account.php:662
1351
  msgid "Search by address"
1352
  msgstr ""
1353
 
1354
- #: templates/account.php:671, templates/debug.php:366
1355
  msgid "Address"
1356
  msgstr ""
1357
 
1358
- #: templates/account.php:672
1359
  msgid "License"
1360
  msgstr ""
1361
 
1362
- #: templates/account.php:673
1363
  msgid "Plan"
1364
  msgstr ""
1365
 
1366
- #: templates/account.php:718
1367
  msgctxt "as software license"
1368
  msgid "License"
1369
  msgstr ""
1370
 
1371
- #: templates/account.php:847
1372
  msgctxt "verb"
1373
  msgid "Hide"
1374
  msgstr ""
1375
 
1376
- #: templates/account.php:869, templates/forms/data-debug-mode.php:31
1377
  msgid "Processing"
1378
  msgstr ""
1379
 
1380
- #: templates/account.php:872
1381
  msgid "Get updates for bleeding edge Beta versions of %s."
1382
  msgstr ""
1383
 
1384
- #: templates/account.php:930
1385
  msgid "Cancelling %s"
1386
  msgstr ""
1387
 
1388
- #: templates/account.php:930, templates/account.php:947, templates/forms/subscription-cancellation.php:27, templates/forms/deactivation/form.php:133
1389
  msgid "trial"
1390
  msgstr ""
1391
 
1392
- #: templates/account.php:945, templates/forms/deactivation/form.php:150
1393
  msgid "Cancelling %s..."
1394
  msgstr ""
1395
 
1396
- #: templates/account.php:948, templates/forms/subscription-cancellation.php:28, templates/forms/deactivation/form.php:134
1397
  msgid "subscription"
1398
  msgstr ""
1399
 
1400
- #: templates/account.php:962
1401
  msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?"
1402
  msgstr ""
1403
 
 
 
 
 
 
 
 
 
1404
  #: templates/add-ons.php:38
1405
  msgid "View details"
1406
  msgstr ""
@@ -1530,7 +1562,7 @@ msgstr ""
1530
  msgid "Can't find your license key?"
1531
  msgstr ""
1532
 
1533
- #: templates/connect.php:323, templates/connect.php:694, templates/forms/deactivation/retry-skip.php:20
1534
  msgctxt "verb"
1535
  msgid "Skip"
1536
  msgstr ""
@@ -1587,40 +1619,40 @@ msgstr ""
1587
  msgid "Title, slug, version, and is active"
1588
  msgstr ""
1589
 
1590
- #: templates/connect.php:420, templates/forms/license-activation.php:41
1591
  msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license."
1592
  msgstr ""
1593
 
1594
- #: templates/connect.php:425
1595
  msgid "What permissions are being granted?"
1596
  msgstr ""
1597
 
1598
- #: templates/connect.php:451
1599
  msgid "Don't have a license key?"
1600
  msgstr ""
1601
 
1602
- #: templates/connect.php:454
1603
  msgid "Have a license key?"
1604
  msgstr ""
1605
 
1606
- #: templates/connect.php:462
1607
  msgid "Privacy Policy"
1608
  msgstr ""
1609
 
1610
- #: templates/connect.php:464
1611
  msgid "License Agreement"
1612
  msgstr ""
1613
 
1614
- #: templates/connect.php:464
1615
  msgid "Terms of Service"
1616
  msgstr ""
1617
 
1618
- #: templates/connect.php:853
1619
  msgctxt "as in the process of sending an email"
1620
  msgid "Sending email"
1621
  msgstr ""
1622
 
1623
- #: templates/connect.php:854
1624
  msgctxt "as activating plugin"
1625
  msgid "Activating"
1626
  msgstr ""
@@ -2053,135 +2085,135 @@ msgstr ""
2053
  msgid "Apply to become an affiliate"
2054
  msgstr ""
2055
 
2056
- #: templates/forms/affiliation.php:104
2057
  msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s."
2058
  msgstr ""
2059
 
2060
- #: templates/forms/affiliation.php:119
2061
  msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information."
2062
  msgstr ""
2063
 
2064
- #: templates/forms/affiliation.php:122
2065
  msgid "Your affiliation account was temporarily suspended."
2066
  msgstr ""
2067
 
2068
- #: templates/forms/affiliation.php:125
2069
  msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days."
2070
  msgstr ""
2071
 
2072
- #: templates/forms/affiliation.php:128
2073
  msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support."
2074
  msgstr ""
2075
 
2076
- #: templates/forms/affiliation.php:141
2077
  msgid "Like the %s? Become our ambassador and earn cash ;-)"
2078
  msgstr ""
2079
 
2080
- #: templates/forms/affiliation.php:142
2081
  msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!"
2082
  msgstr ""
2083
 
2084
- #: templates/forms/affiliation.php:145
2085
  msgid "Program Summary"
2086
  msgstr ""
2087
 
2088
- #: templates/forms/affiliation.php:147
2089
  msgid "%s commission when a customer purchases a new license."
2090
  msgstr ""
2091
 
2092
- #: templates/forms/affiliation.php:149
2093
  msgid "Get commission for automated subscription renewals."
2094
  msgstr ""
2095
 
2096
- #: templates/forms/affiliation.php:152
2097
  msgid "%s tracking cookie after the first visit to maximize earnings potential."
2098
  msgstr ""
2099
 
2100
- #: templates/forms/affiliation.php:155
2101
  msgid "Unlimited commissions."
2102
  msgstr ""
2103
 
2104
- #: templates/forms/affiliation.php:157
2105
  msgid "%s minimum payout amount."
2106
  msgstr ""
2107
 
2108
- #: templates/forms/affiliation.php:158
2109
  msgid "Payouts are in USD and processed monthly via PayPal."
2110
  msgstr ""
2111
 
2112
- #: templates/forms/affiliation.php:159
2113
  msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days."
2114
  msgstr ""
2115
 
2116
- #: templates/forms/affiliation.php:162
2117
  msgid "Affiliate"
2118
  msgstr ""
2119
 
2120
- #: templates/forms/affiliation.php:165, templates/forms/resend-key.php:23
2121
  msgid "Email address"
2122
  msgstr ""
2123
 
2124
- #: templates/forms/affiliation.php:169
2125
  msgid "Full name"
2126
  msgstr ""
2127
 
2128
- #: templates/forms/affiliation.php:173
2129
  msgid "PayPal account email address"
2130
  msgstr ""
2131
 
2132
- #: templates/forms/affiliation.php:177
2133
  msgid "Where are you going to promote the %s?"
2134
  msgstr ""
2135
 
2136
- #: templates/forms/affiliation.php:179
2137
  msgid "Enter the domain of your website or other websites from where you plan to promote the %s."
2138
  msgstr ""
2139
 
2140
- #: templates/forms/affiliation.php:181
2141
  msgid "Add another domain"
2142
  msgstr ""
2143
 
2144
- #: templates/forms/affiliation.php:185
2145
  msgid "Extra Domains"
2146
  msgstr ""
2147
 
2148
- #: templates/forms/affiliation.php:186
2149
  msgid "Extra domains where you will be marketing the product from."
2150
  msgstr ""
2151
 
2152
- #: templates/forms/affiliation.php:196
2153
  msgid "Promotion methods"
2154
  msgstr ""
2155
 
2156
- #: templates/forms/affiliation.php:199
2157
  msgid "Social media (Facebook, Twitter, etc.)"
2158
  msgstr ""
2159
 
2160
- #: templates/forms/affiliation.php:203
2161
  msgid "Mobile apps"
2162
  msgstr ""
2163
 
2164
- #: templates/forms/affiliation.php:207
2165
  msgid "Website, email, and social media statistics (optional)"
2166
  msgstr ""
2167
 
2168
- #: templates/forms/affiliation.php:210
2169
  msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)."
2170
  msgstr ""
2171
 
2172
- #: templates/forms/affiliation.php:214
2173
  msgid "How will you promote us?"
2174
  msgstr ""
2175
 
2176
- #: templates/forms/affiliation.php:217
2177
  msgid "Please provide details on how you intend to promote %s (please be as specific as possible)."
2178
  msgstr ""
2179
 
2180
- #: templates/forms/affiliation.php:223, templates/forms/resend-key.php:22
2181
  msgid "Cancel"
2182
  msgstr ""
2183
 
2184
- #: templates/forms/affiliation.php:225
2185
  msgid "Become an affiliate"
2186
  msgstr ""
2187
 
@@ -2255,7 +2287,7 @@ msgstr ""
2255
  msgid "Plugins & themes tracking"
2256
  msgstr ""
2257
 
2258
- #: templates/forms/optout.php:256
2259
  msgid "Saved"
2260
  msgstr ""
2261
 
@@ -2467,19 +2499,19 @@ msgstr ""
2467
  msgid "switching"
2468
  msgstr ""
2469
 
2470
- #: templates/forms/deactivation/form.php:365
2471
  msgid "Submit & %s"
2472
  msgstr ""
2473
 
2474
- #: templates/forms/deactivation/form.php:386
2475
  msgid "Kindly tell us the reason so we can improve."
2476
  msgstr ""
2477
 
2478
- #: templates/forms/deactivation/form.php:511
2479
  msgid "Yes - %s"
2480
  msgstr ""
2481
 
2482
- #: templates/forms/deactivation/form.php:518
2483
  msgid "Skip & %s"
2484
  msgstr ""
2485
 
1
+ # Copyright (C) 2020 freemius
2
  # This file is distributed under the same license as the freemius package.
3
  msgid ""
4
  msgstr ""
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
 
19
+ #: includes/class-freemius.php:1912, templates/account.php:910
20
  msgid "An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned."
21
  msgstr ""
22
 
23
+ #: includes/class-freemius.php:1919
24
  msgid "Would you like to proceed with the update?"
25
  msgstr ""
26
 
27
+ #: includes/class-freemius.php:2131
28
  msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error."
29
  msgstr ""
30
 
31
+ #: includes/class-freemius.php:2133
32
  msgid "Error"
33
  msgstr ""
34
 
35
+ #: includes/class-freemius.php:2533
36
  msgid "I found a better %s"
37
  msgstr ""
38
 
39
+ #: includes/class-freemius.php:2535
40
  msgid "What's the %s's name?"
41
  msgstr ""
42
 
43
+ #: includes/class-freemius.php:2541
44
  msgid "It's a temporary %s. I'm just debugging an issue."
45
  msgstr ""
46
 
47
+ #: includes/class-freemius.php:2543
48
  msgid "Deactivation"
49
  msgstr ""
50
 
51
+ #: includes/class-freemius.php:2544
52
  msgid "Theme Switch"
53
  msgstr ""
54
 
55
+ #: includes/class-freemius.php:2553, templates/forms/resend-key.php:24, templates/forms/user-change.php:29
56
  msgid "Other"
57
  msgstr ""
58
 
59
+ #: includes/class-freemius.php:2561
60
  msgid "I no longer need the %s"
61
  msgstr ""
62
 
63
+ #: includes/class-freemius.php:2568
64
  msgid "I only needed the %s for a short period"
65
  msgstr ""
66
 
67
+ #: includes/class-freemius.php:2574
68
  msgid "The %s broke my site"
69
  msgstr ""
70
 
71
+ #: includes/class-freemius.php:2581
72
  msgid "The %s suddenly stopped working"
73
  msgstr ""
74
 
75
+ #: includes/class-freemius.php:2591
76
  msgid "I can't pay for it anymore"
77
  msgstr ""
78
 
79
+ #: includes/class-freemius.php:2593
80
  msgid "What price would you feel comfortable paying?"
81
  msgstr ""
82
 
83
+ #: includes/class-freemius.php:2599
84
  msgid "I don't like to share my information with you"
85
  msgstr ""
86
 
87
+ #: includes/class-freemius.php:2620
88
  msgid "The %s didn't work"
89
  msgstr ""
90
 
91
+ #: includes/class-freemius.php:2630
92
  msgid "I couldn't understand how to make it work"
93
  msgstr ""
94
 
95
+ #: includes/class-freemius.php:2638
96
  msgid "The %s is great, but I need specific feature that you don't support"
97
  msgstr ""
98
 
99
+ #: includes/class-freemius.php:2640
100
  msgid "What feature?"
101
  msgstr ""
102
 
103
+ #: includes/class-freemius.php:2644
104
  msgid "The %s is not working"
105
  msgstr ""
106
 
107
+ #: includes/class-freemius.php:2646
108
  msgid "Kindly share what didn't work so we can fix it for future users..."
109
  msgstr ""
110
 
111
+ #: includes/class-freemius.php:2650
112
  msgid "It's not what I was looking for"
113
  msgstr ""
114
 
115
+ #: includes/class-freemius.php:2652
116
  msgid "What you've been looking for?"
117
  msgstr ""
118
 
119
+ #: includes/class-freemius.php:2656
120
  msgid "The %s didn't work as expected"
121
  msgstr ""
122
 
123
+ #: includes/class-freemius.php:2658
124
  msgid "What did you expect?"
125
  msgstr ""
126
 
127
+ #: includes/class-freemius.php:3513, templates/debug.php:20
128
  msgid "Freemius Debug"
129
  msgstr ""
130
 
131
+ #: includes/class-freemius.php:4265
132
  msgid "I don't know what is cURL or how to install it, help me!"
133
  msgstr ""
134
 
135
+ #: includes/class-freemius.php:4267
136
  msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update."
137
  msgstr ""
138
 
139
+ #: includes/class-freemius.php:4274
140
  msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again."
141
  msgstr ""
142
 
143
+ #: includes/class-freemius.php:4379
144
  msgid "Yes - do your thing"
145
  msgstr ""
146
 
147
+ #: includes/class-freemius.php:4384
148
  msgid "No - just deactivate"
149
  msgstr ""
150
 
151
+ #: includes/class-freemius.php:4429, includes/class-freemius.php:4923, includes/class-freemius.php:6182, includes/class-freemius.php:13357, includes/class-freemius.php:14075, includes/class-freemius.php:17526, includes/class-freemius.php:17631, includes/class-freemius.php:17806, includes/class-freemius.php:20040, includes/class-freemius.php:20398, includes/class-freemius.php:20408, includes/class-freemius.php:21079, includes/class-freemius.php:21985, includes/class-freemius.php:22118, includes/class-freemius.php:22274, templates/add-ons.php:57
152
  msgctxt "exclamation"
153
  msgid "Oops"
154
  msgstr ""
155
 
156
+ #: includes/class-freemius.php:4498
157
  msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience."
158
  msgstr ""
159
 
160
+ #: includes/class-freemius.php:4920
161
  msgctxt "addonX cannot run without pluginY"
162
  msgid "%s cannot run without %s."
163
  msgstr ""
164
 
165
+ #: includes/class-freemius.php:4921
166
  msgctxt "addonX cannot run..."
167
  msgid "%s cannot run without the plugin."
168
  msgstr ""
169
 
170
+ #: includes/class-freemius.php:5120, includes/class-freemius.php:5145, includes/class-freemius.php:21150
171
  msgid "Unexpected API error. Please contact the %s's author with the following error."
172
  msgstr ""
173
 
174
+ #: includes/class-freemius.php:5848
175
  msgid "Premium %s version was successfully activated."
176
  msgstr ""
177
 
178
+ #: includes/class-freemius.php:5860, includes/class-freemius.php:7762
179
  msgctxt "Used to express elation, enthusiasm, or triumph (especially in electronic communication)."
180
  msgid "W00t"
181
  msgstr ""
182
 
183
+ #: includes/class-freemius.php:5875
184
  msgid "You have a %s license."
185
  msgstr ""
186
 
187
+ #: includes/class-freemius.php:5879, includes/class-freemius.php:16925, includes/class-freemius.php:16936, includes/class-freemius.php:20309, includes/class-freemius.php:20659, includes/class-freemius.php:20728, includes/class-freemius.php:20900
188
  msgctxt "interjection expressing joy or exuberance"
189
  msgid "Yee-haw"
190
  msgstr ""
191
 
192
+ #: includes/class-freemius.php:6165
193
  msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license."
194
  msgstr ""
195
 
196
+ #: includes/class-freemius.php:6169
197
  msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin."
198
  msgstr ""
199
 
200
+ #: includes/class-freemius.php:6178, templates/add-ons.php:186, templates/account/partials/addon.php:381
201
  msgid "More information about %s"
202
  msgstr ""
203
 
204
+ #: includes/class-freemius.php:6179
205
  msgid "Purchase License"
206
  msgstr ""
207
 
208
+ #: includes/class-freemius.php:7118, templates/connect.php:171
209
  msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s."
210
  msgstr ""
211
 
212
+ #: includes/class-freemius.php:7122
213
  msgid "start the trial"
214
  msgstr ""
215
 
216
+ #: includes/class-freemius.php:7123, templates/connect.php:175
217
  msgid "complete the install"
218
  msgstr ""
219
 
220
+ #: includes/class-freemius.php:7241
221
  msgid "You are just one step away - %s"
222
  msgstr ""
223
 
224
+ #: includes/class-freemius.php:7244
225
  msgctxt "%s - plugin name. As complete \"PluginX\" activation now"
226
  msgid "Complete \"%s\" Activation Now"
227
  msgstr ""
228
 
229
+ #: includes/class-freemius.php:7322
230
  msgid "We made a few tweaks to the %s, %s"
231
  msgstr ""
232
 
233
+ #: includes/class-freemius.php:7326
234
  msgid "Opt in to make \"%s\" better!"
235
  msgstr ""
236
 
237
+ #: includes/class-freemius.php:7761
238
  msgid "The upgrade of %s was successfully completed."
239
  msgstr ""
240
 
241
+ #: includes/class-freemius.php:10243, includes/class-fs-plugin-updater.php:1099, includes/class-fs-plugin-updater.php:1294, includes/class-fs-plugin-updater.php:1301, templates/auto-installation.php:32
242
  msgid "Add-On"
243
  msgstr ""
244
 
245
+ #: includes/class-freemius.php:10245, templates/account.php:392, templates/account.php:400, templates/debug.php:358, templates/debug.php:549
246
  msgid "Plugin"
247
  msgstr ""
248
 
249
+ #: includes/class-freemius.php:10246, templates/account.php:393, templates/account.php:401, templates/debug.php:358, templates/debug.php:549, templates/forms/deactivation/form.php:71
250
  msgid "Theme"
251
  msgstr ""
252
 
253
+ #: includes/class-freemius.php:13176
254
+ msgid "An unknown error has occurred while trying to toggle the license's white-label mode."
255
+ msgstr ""
256
+
257
+ #: includes/class-freemius.php:13190
258
+ msgid "Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s."
259
+ msgstr ""
260
+
261
+ #: includes/class-freemius.php:13195
262
+ msgid "User Dashboard"
263
+ msgstr ""
264
+
265
+ #: includes/class-freemius.php:13196
266
+ msgid "revert it now"
267
+ msgstr ""
268
+
269
+ #: includes/class-freemius.php:13255
270
  msgid "An unknown error has occurred while trying to set the user's beta mode."
271
  msgstr ""
272
 
273
+ #: includes/class-freemius.php:13328
274
  msgid "Invalid new user ID or email address."
275
  msgstr ""
276
 
277
+ #: includes/class-freemius.php:13358, includes/class-freemius.php:22229
278
  msgid "Sorry, we could not complete the email update. Another user with the same email is already registered."
279
  msgstr ""
280
 
281
+ #: includes/class-freemius.php:13359, includes/class-freemius.php:22230
282
  msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button."
283
  msgstr ""
284
 
285
+ #: includes/class-freemius.php:13366, includes/class-freemius.php:22237
286
  msgid "Change Ownership"
287
  msgstr ""
288
 
289
+ #: includes/class-freemius.php:13942
290
  msgid "Invalid site details collection."
291
  msgstr ""
292
 
293
+ #: includes/class-freemius.php:14062
294
  msgid "We couldn't find your email address in the system, are you sure it's the right address?"
295
  msgstr ""
296
 
297
+ #: includes/class-freemius.php:14064
298
  msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?"
299
  msgstr ""
300
 
301
+ #: includes/class-freemius.php:14338
302
  msgid "Account is pending activation."
303
  msgstr ""
304
 
305
+ #: includes/class-freemius.php:14450, templates/forms/premium-versions-upgrade-handler.php:47
306
  msgid "Buy a license now"
307
  msgstr ""
308
 
309
+ #: includes/class-freemius.php:14462, templates/forms/premium-versions-upgrade-handler.php:46
310
  msgid "Renew your license now"
311
  msgstr ""
312
 
313
+ #: includes/class-freemius.php:14466
314
  msgid "%s to access version %s security & feature updates, and support."
315
  msgstr ""
316
 
317
+ #: includes/class-freemius.php:16907
318
  msgid "%s activation was successfully completed."
319
  msgstr ""
320
 
321
+ #: includes/class-freemius.php:16921
322
  msgid "Your account was successfully activated with the %s plan."
323
  msgstr ""
324
 
325
+ #: includes/class-freemius.php:16932, includes/class-freemius.php:20724
326
  msgid "Your trial has been successfully started."
327
  msgstr ""
328
 
329
+ #: includes/class-freemius.php:17524, includes/class-freemius.php:17629, includes/class-freemius.php:17804
330
  msgid "Couldn't activate %s."
331
  msgstr ""
332
 
333
+ #: includes/class-freemius.php:17525, includes/class-freemius.php:17630, includes/class-freemius.php:17805
334
  msgid "Please contact us with the following message:"
335
  msgstr ""
336
 
337
+ #: includes/class-freemius.php:17626, templates/forms/data-debug-mode.php:162
338
  msgid "An unknown error has occurred."
339
  msgstr ""
340
 
341
+ #: includes/class-freemius.php:18162, includes/class-freemius.php:23310
342
  msgid "Upgrade"
343
  msgstr ""
344
 
345
+ #: includes/class-freemius.php:18168
346
  msgid "Start Trial"
347
  msgstr ""
348
 
349
+ #: includes/class-freemius.php:18170
350
  msgid "Pricing"
351
  msgstr ""
352
 
353
+ #: includes/class-freemius.php:18250, includes/class-freemius.php:18252
354
  msgid "Affiliation"
355
  msgstr ""
356
 
357
+ #: includes/class-freemius.php:18280, includes/class-freemius.php:18282, templates/account.php:240, templates/debug.php:324
358
  msgid "Account"
359
  msgstr ""
360
 
361
+ #: includes/class-freemius.php:18296, includes/class-freemius.php:18298, includes/customizer/class-fs-customizer-support-section.php:60
362
  msgid "Contact Us"
363
  msgstr ""
364
 
365
+ #: includes/class-freemius.php:18309, includes/class-freemius.php:18311, includes/class-freemius.php:23324, templates/account.php:119, templates/account/partials/addon.php:44
366
  msgid "Add-Ons"
367
  msgstr ""
368
 
369
+ #: includes/class-freemius.php:18345
370
  msgctxt "ASCII arrow left icon"
371
  msgid "&#x2190;"
372
  msgstr ""
373
 
374
+ #: includes/class-freemius.php:18345
375
  msgctxt "ASCII arrow right icon"
376
  msgid "&#x27a4;"
377
  msgstr ""
378
 
379
+ #: includes/class-freemius.php:18347, templates/pricing.php:109
380
  msgctxt "noun"
381
  msgid "Pricing"
382
  msgstr ""
383
 
384
+ #: includes/class-freemius.php:18560, includes/customizer/class-fs-customizer-support-section.php:67
385
  msgid "Support Forum"
386
  msgstr ""
387
 
388
+ #: includes/class-freemius.php:19534
389
  msgid "Your email has been successfully verified - you are AWESOME!"
390
  msgstr ""
391
 
392
+ #: includes/class-freemius.php:19535
393
  msgctxt "a positive response"
394
  msgid "Right on"
395
  msgstr ""
396
 
397
+ #: includes/class-freemius.php:20041
398
  msgid "seems like the key you entered doesn't match our records."
399
  msgstr ""
400
 
401
+ #: includes/class-freemius.php:20065
402
  msgid "Debug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the \"Stop Debug\" link."
403
  msgstr ""
404
 
405
+ #: includes/class-freemius.php:20300
406
  msgid "Your %s Add-on plan was successfully upgraded."
407
  msgstr ""
408
 
409
+ #: includes/class-freemius.php:20302
410
  msgid "%s Add-on was successfully purchased."
411
  msgstr ""
412
 
413
+ #: includes/class-freemius.php:20305
414
  msgid "Download the latest version"
415
  msgstr ""
416
 
417
+ #: includes/class-freemius.php:20391
418
  msgid "Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$s"
419
  msgstr ""
420
 
421
+ #: includes/class-freemius.php:20397, includes/class-freemius.php:20407, includes/class-freemius.php:20859, includes/class-freemius.php:20948
422
  msgid "Error received from the server:"
423
  msgstr ""
424
 
425
+ #: includes/class-freemius.php:20407
426
  msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again."
427
  msgstr ""
428
 
429
+ #: includes/class-freemius.php:20621, includes/class-freemius.php:20864, includes/class-freemius.php:20919, includes/class-freemius.php:21026
430
  msgctxt "something somebody says when they are thinking about what you have just said."
431
  msgid "Hmm"
432
  msgstr ""
433
 
434
+ #: includes/class-freemius.php:20634
435
  msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry."
436
  msgstr ""
437
 
438
+ #: includes/class-freemius.php:20635, templates/account.php:121, templates/add-ons.php:250, templates/account/partials/addon.php:46
439
  msgctxt "trial period"
440
  msgid "Trial"
441
  msgstr ""
442
 
443
+ #: includes/class-freemius.php:20640
444
  msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s."
445
  msgstr ""
446
 
447
+ #: includes/class-freemius.php:20644, includes/class-freemius.php:20703
448
  msgid "Please contact us here"
449
  msgstr ""
450
 
451
+ #: includes/class-freemius.php:20655
452
  msgid "Your plan was successfully activated."
453
  msgstr ""
454
 
455
+ #: includes/class-freemius.php:20656
456
  msgid "Your plan was successfully upgraded."
457
  msgstr ""
458
 
459
+ #: includes/class-freemius.php:20673
460
  msgid "Your plan was successfully changed to %s."
461
  msgstr ""
462
 
463
+ #: includes/class-freemius.php:20689
464
  msgid "Your license has expired. You can still continue using the free %s forever."
465
  msgstr ""
466
 
467
+ #: includes/class-freemius.php:20691
468
  msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
469
  msgstr ""
470
 
471
+ #: includes/class-freemius.php:20699
472
  msgid "Your license has been cancelled. If you think it's a mistake, please contact support."
473
  msgstr ""
474
 
475
+ #: includes/class-freemius.php:20712
476
  msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support."
477
  msgstr ""
478
 
479
+ #: includes/class-freemius.php:20738
480
  msgid "Your free trial has expired. You can still continue using all our free features."
481
  msgstr ""
482
 
483
+ #: includes/class-freemius.php:20740
484
  msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions."
485
  msgstr ""
486
 
487
+ #: includes/class-freemius.php:20855
488
  msgid "It looks like the license could not be activated."
489
  msgstr ""
490
 
491
+ #: includes/class-freemius.php:20897
492
  msgid "Your license was successfully activated."
493
  msgstr ""
494
 
495
+ #: includes/class-freemius.php:20923
496
  msgid "It looks like your site currently doesn't have an active license."
497
  msgstr ""
498
 
499
+ #: includes/class-freemius.php:20947
500
  msgid "It looks like the license deactivation failed."
501
  msgstr ""
502
 
503
+ #: includes/class-freemius.php:20976
504
  msgid "Your %s license was successfully deactivated."
505
  msgstr ""
506
 
507
+ #: includes/class-freemius.php:20977
508
  msgid "Your license was successfully deactivated, you are back to the %s plan."
509
  msgstr ""
510
 
511
+ #: includes/class-freemius.php:20980
512
  msgid "O.K"
513
  msgstr ""
514
 
515
+ #: includes/class-freemius.php:21033
516
  msgid "Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes."
517
  msgstr ""
518
 
519
+ #: includes/class-freemius.php:21042
520
  msgid "Your subscription was successfully cancelled. Your %s plan license will expire in %s."
521
  msgstr ""
522
 
523
+ #: includes/class-freemius.php:21084
524
  msgid "You are already running the %s in a trial mode."
525
  msgstr ""
526
 
527
+ #: includes/class-freemius.php:21095
528
  msgid "You already utilized a trial before."
529
  msgstr ""
530
 
531
+ #: includes/class-freemius.php:21109
532
  msgid "Plan %s do not exist, therefore, can't start a trial."
533
  msgstr ""
534
 
535
+ #: includes/class-freemius.php:21120
536
  msgid "Plan %s does not support a trial period."
537
  msgstr ""
538
 
539
+ #: includes/class-freemius.php:21131
540
  msgid "None of the %s's plans supports a trial period."
541
  msgstr ""
542
 
543
+ #: includes/class-freemius.php:21181
544
  msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)"
545
  msgstr ""
546
 
547
+ #: includes/class-freemius.php:21217
548
  msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes."
549
  msgstr ""
550
 
551
+ #: includes/class-freemius.php:21236
552
  msgid "Your %s free trial was successfully cancelled."
553
  msgstr ""
554
 
555
+ #: includes/class-freemius.php:21552
556
  msgid "Version %s was released."
557
  msgstr ""
558
 
559
+ #: includes/class-freemius.php:21552
560
  msgid "Please download %s."
561
  msgstr ""
562
 
563
+ #: includes/class-freemius.php:21559
564
  msgid "the latest %s version here"
565
  msgstr ""
566
 
567
+ #: includes/class-freemius.php:21564
568
  msgid "New"
569
  msgstr ""
570
 
571
+ #: includes/class-freemius.php:21569
572
  msgid "Seems like you got the latest release."
573
  msgstr ""
574
 
575
+ #: includes/class-freemius.php:21570
576
  msgid "You are all good!"
577
  msgstr ""
578
 
579
+ #: includes/class-freemius.php:21873
580
  msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box."
581
  msgstr ""
582
 
583
+ #: includes/class-freemius.php:22013
584
  msgid "Site successfully opted in."
585
  msgstr ""
586
 
587
+ #: includes/class-freemius.php:22014, includes/class-freemius.php:23020
588
  msgid "Awesome"
589
  msgstr ""
590
 
591
+ #: includes/class-freemius.php:22030, templates/forms/optout.php:41
592
  msgid "We appreciate your help in making the %s better by letting us track some usage data."
593
  msgstr ""
594
 
595
+ #: includes/class-freemius.php:22031
596
  msgid "Thank you!"
597
  msgstr ""
598
 
599
+ #: includes/class-freemius.php:22038
600
  msgid "We will no longer be sending any usage data of %s on %s to %s."
601
  msgstr ""
602
 
603
+ #: includes/class-freemius.php:22196
604
  msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder."
605
  msgstr ""
606
 
607
+ #: includes/class-freemius.php:22202
608
  msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval."
609
  msgstr ""
610
 
611
+ #: includes/class-freemius.php:22207
612
  msgid "%s is the new owner of the account."
613
  msgstr ""
614
 
615
+ #: includes/class-freemius.php:22209
616
  msgctxt "as congratulations"
617
  msgid "Congrats"
618
  msgstr ""
619
 
620
+ #: includes/class-freemius.php:22245
621
  msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments."
622
  msgstr ""
623
 
624
+ #: includes/class-freemius.php:22257
625
  msgid "Please provide your full name."
626
  msgstr ""
627
 
628
+ #: includes/class-freemius.php:22262
629
  msgid "Your name was successfully updated."
630
  msgstr ""
631
 
632
+ #: includes/class-freemius.php:22323
633
  msgid "You have successfully updated your %s."
634
  msgstr ""
635
 
636
+ #: includes/class-freemius.php:22382
637
+ msgid "Is this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin."
638
+ msgstr ""
639
+
640
+ #: includes/class-freemius.php:22385
641
+ msgid "Click here"
642
+ msgstr ""
643
+
644
+ #: includes/class-freemius.php:22483
645
  msgid "Just letting you know that the add-ons information of %s is being pulled from an external server."
646
  msgstr ""
647
 
648
+ #: includes/class-freemius.php:22484
649
  msgctxt "advance notice of something that will need attention."
650
  msgid "Heads up"
651
  msgstr ""
652
 
653
+ #: includes/class-freemius.php:23060
654
  msgctxt "exclamation"
655
  msgid "Hey"
656
  msgstr ""
657
 
658
+ #: includes/class-freemius.php:23060
659
  msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial."
660
  msgstr ""
661
 
662
+ #: includes/class-freemius.php:23068
663
  msgid "No commitment for %s days - cancel anytime!"
664
  msgstr ""
665
 
666
+ #: includes/class-freemius.php:23069
667
  msgid "No credit card required"
668
  msgstr ""
669
 
670
+ #: includes/class-freemius.php:23076, templates/forms/trial-start.php:53
671
  msgctxt "call to action"
672
  msgid "Start free trial"
673
  msgstr ""
674
 
675
+ #: includes/class-freemius.php:23153
676
  msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!"
677
  msgstr ""
678
 
679
+ #: includes/class-freemius.php:23162
680
  msgid "Learn more"
681
  msgstr ""
682
 
683
+ #: includes/class-freemius.php:23348, templates/account.php:556, templates/account.php:706, templates/connect.php:179, templates/connect.php:456, templates/forms/license-activation.php:27, templates/account/partials/addon.php:321
684
  msgid "Activate License"
685
  msgstr ""
686
 
687
+ #: includes/class-freemius.php:23349, templates/account.php:650, templates/account.php:705, templates/account/partials/addon.php:322, templates/account/partials/site.php:271
688
  msgid "Change License"
689
  msgstr ""
690
 
691
+ #: includes/class-freemius.php:23462, templates/account/partials/site.php:169
692
  msgid "Opt Out"
693
  msgstr ""
694
 
695
+ #: includes/class-freemius.php:23464, includes/class-freemius.php:23470, templates/account/partials/site.php:49, templates/account/partials/site.php:169
696
  msgid "Opt In"
697
  msgstr ""
698
 
699
+ #: includes/class-freemius.php:23700
700
  msgid " The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"
701
  msgstr ""
702
 
703
+ #: includes/class-freemius.php:23708
704
  msgid "Activate %s features"
705
  msgstr ""
706
 
707
+ #: includes/class-freemius.php:23721
708
  msgid "Please follow these steps to complete the upgrade"
709
  msgstr ""
710
 
711
+ #: includes/class-freemius.php:23725
712
  msgid "Download the latest %s version"
713
  msgstr ""
714
 
715
+ #: includes/class-freemius.php:23729
716
  msgid "Upload and activate the downloaded version"
717
  msgstr ""
718
 
719
+ #: includes/class-freemius.php:23731
720
  msgid "How to upload and activate?"
721
  msgstr ""
722
 
723
+ #: includes/class-freemius.php:23865
724
  msgid "%sClick here%s to choose the sites where you'd like to activate the license on."
725
  msgstr ""
726
 
727
+ #: includes/class-freemius.php:24034
728
  msgid "Auto installation only works for opted-in users."
729
  msgstr ""
730
 
731
+ #: includes/class-freemius.php:24044, includes/class-freemius.php:24077, includes/class-fs-plugin-updater.php:1273, includes/class-fs-plugin-updater.php:1287
732
  msgid "Invalid module ID."
733
  msgstr ""
734
 
735
+ #: includes/class-freemius.php:24053, includes/class-fs-plugin-updater.php:1309
736
  msgid "Premium version already active."
737
  msgstr ""
738
 
739
+ #: includes/class-freemius.php:24060
740
  msgid "You do not have a valid license to access the premium version."
741
  msgstr ""
742
 
743
+ #: includes/class-freemius.php:24067
744
  msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version."
745
  msgstr ""
746
 
747
+ #: includes/class-freemius.php:24085, includes/class-fs-plugin-updater.php:1308
748
  msgid "Premium add-on version already installed."
749
  msgstr ""
750
 
751
+ #: includes/class-freemius.php:24435
752
  msgid "View paid features"
753
  msgstr ""
754
 
755
+ #: includes/class-freemius.php:24757
756
  msgid "Thank you so much for using %s and its add-ons!"
757
  msgstr ""
758
 
759
+ #: includes/class-freemius.php:24758
760
  msgid "Thank you so much for using %s!"
761
  msgstr ""
762
 
763
+ #: includes/class-freemius.php:24764
764
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s."
765
  msgstr ""
766
 
767
+ #: includes/class-freemius.php:24768
768
  msgid "Thank you so much for using our products!"
769
  msgstr ""
770
 
771
+ #: includes/class-freemius.php:24769
772
  msgid "You've already opted-in to our usage-tracking, which helps us keep improving them."
773
  msgstr ""
774
 
775
+ #: includes/class-freemius.php:24788
776
  msgid "%s and its add-ons"
777
  msgstr ""
778
 
779
+ #: includes/class-freemius.php:24797
780
  msgid "Products"
781
  msgstr ""
782
 
783
+ #: includes/class-freemius.php:24804, templates/connect.php:280
784
  msgid "Yes"
785
  msgstr ""
786
 
787
+ #: includes/class-freemius.php:24805, templates/connect.php:281
788
  msgid "send me security & feature updates, educational content and offers."
789
  msgstr ""
790
 
791
+ #: includes/class-freemius.php:24806, templates/connect.php:286
792
  msgid "No"
793
  msgstr ""
794
 
795
+ #: includes/class-freemius.php:24808, templates/connect.php:288
796
  msgid "do %sNOT%s send me security & feature updates, educational content and offers."
797
  msgstr ""
798
 
799
+ #: includes/class-freemius.php:24818
800
  msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)"
801
  msgstr ""
802
 
803
+ #: includes/class-freemius.php:24820, templates/connect.php:295
804
  msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:"
805
  msgstr ""
806
 
807
+ #: includes/class-freemius.php:25102
808
  msgid "License key is empty."
809
  msgstr ""
810
 
832
  msgid "Important Upgrade Notice:"
833
  msgstr ""
834
 
835
+ #: includes/class-fs-plugin-updater.php:1338
836
  msgid "Installing plugin: %s"
837
  msgstr ""
838
 
839
+ #: includes/class-fs-plugin-updater.php:1379
840
  msgid "Unable to connect to the filesystem. Please confirm your credentials."
841
  msgstr ""
842
 
843
+ #: includes/class-fs-plugin-updater.php:1561
844
  msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work."
845
  msgstr ""
846
 
847
+ #: includes/fs-plugin-info-dialog.php:541
848
  msgid "Purchase More"
849
  msgstr ""
850
 
851
+ #: includes/fs-plugin-info-dialog.php:542, templates/account/partials/addon.php:385
852
  msgctxt "verb"
853
  msgid "Purchase"
854
  msgstr ""
855
 
856
+ #: includes/fs-plugin-info-dialog.php:546
857
  msgid "Start my free %s"
858
  msgstr ""
859
 
860
+ #: includes/fs-plugin-info-dialog.php:744
861
  msgid "Install Free Version Update Now"
862
  msgstr ""
863
 
864
+ #: includes/fs-plugin-info-dialog.php:745, templates/account.php:639
865
  msgid "Install Update Now"
866
  msgstr ""
867
 
868
+ #: includes/fs-plugin-info-dialog.php:754
869
  msgid "Install Free Version Now"
870
  msgstr ""
871
 
872
+ #: includes/fs-plugin-info-dialog.php:755, templates/add-ons.php:323, templates/auto-installation.php:111, templates/account/partials/addon.php:365, templates/account/partials/addon.php:418
873
  msgid "Install Now"
874
  msgstr ""
875
 
876
+ #: includes/fs-plugin-info-dialog.php:771
877
  msgctxt "as download latest version"
878
  msgid "Download Latest Free Version"
879
  msgstr ""
880
 
881
+ #: includes/fs-plugin-info-dialog.php:772, templates/account.php:99, templates/add-ons.php:37, templates/account/partials/addon.php:25
882
  msgctxt "as download latest version"
883
  msgid "Download Latest"
884
  msgstr ""
885
 
886
+ #: includes/fs-plugin-info-dialog.php:787, templates/add-ons.php:329, templates/account/partials/addon.php:356, templates/account/partials/addon.php:412
887
  msgid "Activate this add-on"
888
  msgstr ""
889
 
890
+ #: includes/fs-plugin-info-dialog.php:789, templates/connect.php:453
891
  msgid "Activate Free Version"
892
  msgstr ""
893
 
894
+ #: includes/fs-plugin-info-dialog.php:790, templates/account.php:123, templates/add-ons.php:330, templates/account/partials/addon.php:48
895
  msgid "Activate"
896
  msgstr ""
897
 
898
+ #: includes/fs-plugin-info-dialog.php:1002
899
  msgctxt "Plugin installer section title"
900
  msgid "Description"
901
  msgstr ""
902
 
903
+ #: includes/fs-plugin-info-dialog.php:1003
904
  msgctxt "Plugin installer section title"
905
  msgid "Installation"
906
  msgstr ""
907
 
908
+ #: includes/fs-plugin-info-dialog.php:1004
909
  msgctxt "Plugin installer section title"
910
  msgid "FAQ"
911
  msgstr ""
912
 
913
+ #: includes/fs-plugin-info-dialog.php:1005, templates/plugin-info/description.php:55
914
  msgid "Screenshots"
915
  msgstr ""
916
 
917
+ #: includes/fs-plugin-info-dialog.php:1006
918
  msgctxt "Plugin installer section title"
919
  msgid "Changelog"
920
  msgstr ""
921
 
922
+ #: includes/fs-plugin-info-dialog.php:1007
923
  msgctxt "Plugin installer section title"
924
  msgid "Reviews"
925
  msgstr ""
926
 
927
+ #: includes/fs-plugin-info-dialog.php:1008
928
  msgctxt "Plugin installer section title"
929
  msgid "Other Notes"
930
  msgstr ""
931
 
932
+ #: includes/fs-plugin-info-dialog.php:1023
933
  msgctxt "Plugin installer section title"
934
  msgid "Features & Pricing"
935
  msgstr ""
936
 
937
+ #: includes/fs-plugin-info-dialog.php:1033
938
  msgid "Plugin Install"
939
  msgstr ""
940
 
941
+ #: includes/fs-plugin-info-dialog.php:1105
942
  msgctxt "e.g. Professional Plan"
943
  msgid "%s Plan"
944
  msgstr ""
945
 
946
+ #: includes/fs-plugin-info-dialog.php:1131
947
  msgctxt "e.g. the best product"
948
  msgid "Best"
949
  msgstr ""
950
 
951
+ #: includes/fs-plugin-info-dialog.php:1137, includes/fs-plugin-info-dialog.php:1157
952
  msgctxt "as every month"
953
  msgid "Monthly"
954
  msgstr ""
955
 
956
+ #: includes/fs-plugin-info-dialog.php:1140
957
  msgctxt "as once a year"
958
  msgid "Annual"
959
  msgstr ""
960
 
961
+ #: includes/fs-plugin-info-dialog.php:1143
962
  msgid "Lifetime"
963
  msgstr ""
964
 
965
+ #: includes/fs-plugin-info-dialog.php:1157, includes/fs-plugin-info-dialog.php:1159, includes/fs-plugin-info-dialog.php:1161
966
  msgctxt "e.g. billed monthly"
967
  msgid "Billed %s"
968
  msgstr ""
969
 
970
+ #: includes/fs-plugin-info-dialog.php:1159
971
  msgctxt "as once a year"
972
  msgid "Annually"
973
  msgstr ""
974
 
975
+ #: includes/fs-plugin-info-dialog.php:1161
976
  msgctxt "as once a year"
977
  msgid "Once"
978
  msgstr ""
979
 
980
+ #: includes/fs-plugin-info-dialog.php:1167
981
  msgid "Single Site License"
982
  msgstr ""
983
 
984
+ #: includes/fs-plugin-info-dialog.php:1169
985
  msgid "Unlimited Licenses"
986
  msgstr ""
987
 
988
+ #: includes/fs-plugin-info-dialog.php:1171
989
  msgid "Up to %s Sites"
990
  msgstr ""
991
 
992
+ #: includes/fs-plugin-info-dialog.php:1181, templates/plugin-info/features.php:82
993
  msgctxt "as monthly period"
994
  msgid "mo"
995
  msgstr ""
996
 
997
+ #: includes/fs-plugin-info-dialog.php:1188, templates/plugin-info/features.php:80
998
  msgctxt "as annual period"
999
  msgid "year"
1000
  msgstr ""
1001
 
1002
+ #: includes/fs-plugin-info-dialog.php:1242
1003
  msgctxt "noun"
1004
  msgid "Price"
1005
  msgstr ""
1006
 
1007
+ #: includes/fs-plugin-info-dialog.php:1290
1008
  msgid "Save %s"
1009
  msgstr ""
1010
 
1011
+ #: includes/fs-plugin-info-dialog.php:1300
1012
  msgid "No commitment for %s - cancel anytime"
1013
  msgstr ""
1014
 
1015
+ #: includes/fs-plugin-info-dialog.php:1303
1016
  msgid "After your free %s, pay as little as %s"
1017
  msgstr ""
1018
 
1019
+ #: includes/fs-plugin-info-dialog.php:1314
1020
  msgid "Details"
1021
  msgstr ""
1022
 
1023
+ #: includes/fs-plugin-info-dialog.php:1318, templates/account.php:110, templates/debug.php:201, templates/debug.php:238, templates/debug.php:455, templates/account/partials/addon.php:36
1024
  msgctxt "product version"
1025
  msgid "Version"
1026
  msgstr ""
1027
 
1028
+ #: includes/fs-plugin-info-dialog.php:1325
1029
  msgctxt "as the plugin author"
1030
  msgid "Author"
1031
  msgstr ""
1032
 
1033
+ #: includes/fs-plugin-info-dialog.php:1332
1034
  msgid "Last Updated"
1035
  msgstr ""
1036
 
1037
+ #: includes/fs-plugin-info-dialog.php:1337, templates/account.php:525
1038
  msgctxt "x-ago"
1039
  msgid "%s ago"
1040
  msgstr ""
1041
 
1042
+ #: includes/fs-plugin-info-dialog.php:1346
1043
  msgid "Requires WordPress Version"
1044
  msgstr ""
1045
 
1046
+ #: includes/fs-plugin-info-dialog.php:1347
1047
  msgid "%s or higher"
1048
  msgstr ""
1049
 
1050
+ #: includes/fs-plugin-info-dialog.php:1354
1051
  msgid "Compatible up to"
1052
  msgstr ""
1053
 
1054
+ #: includes/fs-plugin-info-dialog.php:1362
1055
  msgid "Downloaded"
1056
  msgstr ""
1057
 
1058
+ #: includes/fs-plugin-info-dialog.php:1366
1059
  msgid "%s time"
1060
  msgstr ""
1061
 
1062
+ #: includes/fs-plugin-info-dialog.php:1368
1063
  msgid "%s times"
1064
  msgstr ""
1065
 
1066
+ #: includes/fs-plugin-info-dialog.php:1379
1067
  msgid "WordPress.org Plugin Page"
1068
  msgstr ""
1069
 
1070
+ #: includes/fs-plugin-info-dialog.php:1388
1071
  msgid "Plugin Homepage"
1072
  msgstr ""
1073
 
1074
+ #: includes/fs-plugin-info-dialog.php:1397, includes/fs-plugin-info-dialog.php:1481
1075
  msgid "Donate to this plugin"
1076
  msgstr ""
1077
 
1078
+ #: includes/fs-plugin-info-dialog.php:1404
1079
  msgid "Average Rating"
1080
  msgstr ""
1081
 
1082
+ #: includes/fs-plugin-info-dialog.php:1411
1083
  msgid "based on %s"
1084
  msgstr ""
1085
 
1086
+ #: includes/fs-plugin-info-dialog.php:1415
1087
  msgid "%s rating"
1088
  msgstr ""
1089
 
1090
+ #: includes/fs-plugin-info-dialog.php:1417
1091
  msgid "%s ratings"
1092
  msgstr ""
1093
 
1094
+ #: includes/fs-plugin-info-dialog.php:1432
1095
  msgid "%s star"
1096
  msgstr ""
1097
 
1098
+ #: includes/fs-plugin-info-dialog.php:1434
1099
  msgid "%s stars"
1100
  msgstr ""
1101
 
1102
+ #: includes/fs-plugin-info-dialog.php:1446
1103
  msgid "Click to see reviews that provided a rating of %s"
1104
  msgstr ""
1105
 
1106
+ #: includes/fs-plugin-info-dialog.php:1459
1107
  msgid "Contributors"
1108
  msgstr ""
1109
 
1110
+ #: includes/fs-plugin-info-dialog.php:1489, includes/fs-plugin-info-dialog.php:1491
1111
  msgid "Warning"
1112
  msgstr ""
1113
 
1114
+ #: includes/fs-plugin-info-dialog.php:1489
1115
  msgid "This plugin has not been tested with your current version of WordPress."
1116
  msgstr ""
1117
 
1118
+ #: includes/fs-plugin-info-dialog.php:1491
1119
  msgid "This plugin has not been marked as compatible with your version of WordPress."
1120
  msgstr ""
1121
 
1122
+ #: includes/fs-plugin-info-dialog.php:1510
1123
  msgid "Paid add-on must be deployed to Freemius."
1124
  msgstr ""
1125
 
1126
+ #: includes/fs-plugin-info-dialog.php:1511
1127
  msgid "Add-on must be deployed to WordPress.org or Freemius."
1128
  msgstr ""
1129
 
1130
+ #: includes/fs-plugin-info-dialog.php:1532
1131
  msgid "Newer Version (%s) Installed"
1132
  msgstr ""
1133
 
1134
+ #: includes/fs-plugin-info-dialog.php:1533
1135
  msgid "Newer Free Version (%s) Installed"
1136
  msgstr ""
1137
 
1138
+ #: includes/fs-plugin-info-dialog.php:1540
1139
  msgid "Latest Version Installed"
1140
  msgstr ""
1141
 
1142
+ #: includes/fs-plugin-info-dialog.php:1541
1143
  msgid "Latest Free Version Installed"
1144
  msgstr ""
1145
 
1223
  msgid "Bundle Plan"
1224
  msgstr ""
1225
 
1226
+ #: templates/account.php:248
1227
  msgid "Free Trial"
1228
  msgstr ""
1229
 
1230
+ #: templates/account.php:259
1231
  msgid "Account Details"
1232
  msgstr ""
1233
 
1234
+ #: templates/account.php:266, templates/forms/data-debug-mode.php:33
1235
  msgid "Start Debug"
1236
  msgstr ""
1237
 
1238
+ #: templates/account.php:268
1239
  msgid "Stop Debug"
1240
  msgstr ""
1241
 
1242
+ #: templates/account.php:275
1243
  msgid "Billing & Invoices"
1244
  msgstr ""
1245
 
1246
+ #: templates/account.php:286
1247
  msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?"
1248
  msgstr ""
1249
 
1250
+ #: templates/account.php:288
1251
  msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?"
1252
  msgstr ""
1253
 
1254
+ #: templates/account.php:291
1255
  msgid "Delete Account"
1256
  msgstr ""
1257
 
1258
+ #: templates/account.php:303, templates/account/partials/addon.php:231, templates/account/partials/deactivate-license-button.php:35
1259
  msgid "Deactivate License"
1260
  msgstr ""
1261
 
1262
+ #: templates/account.php:326, templates/forms/subscription-cancellation.php:125
1263
  msgid "Are you sure you want to proceed?"
1264
  msgstr ""
1265
 
1266
+ #: templates/account.php:326, templates/account/partials/addon.php:255
1267
  msgid "Cancel Subscription"
1268
  msgstr ""
1269
 
1270
+ #: templates/account.php:355, templates/account/partials/addon.php:340
1271
  msgctxt "as synchronize"
1272
  msgid "Sync"
1273
  msgstr ""
1274
 
1275
+ #: templates/account.php:370, templates/debug.php:505
1276
  msgid "Name"
1277
  msgstr ""
1278
 
1279
+ #: templates/account.php:376, templates/debug.php:506
1280
  msgid "Email"
1281
  msgstr ""
1282
 
1283
+ #: templates/account.php:383, templates/debug.php:369, templates/debug.php:555
1284
  msgid "User ID"
1285
  msgstr ""
1286
 
1287
+ #: templates/account.php:401, templates/account.php:719, templates/account.php:752, templates/debug.php:236, templates/debug.php:363, templates/debug.php:452, templates/debug.php:504, templates/debug.php:553, templates/debug.php:632, templates/account/payments.php:35, templates/debug/logger.php:21
1288
  msgid "ID"
1289
  msgstr ""
1290
 
1291
+ #: templates/account.php:408
1292
  msgid "Site ID"
1293
  msgstr ""
1294
 
1295
+ #: templates/account.php:411
1296
  msgid "No ID"
1297
  msgstr ""
1298
 
1299
+ #: templates/account.php:416, templates/debug.php:243, templates/debug.php:372, templates/debug.php:456, templates/debug.php:508, templates/account/partials/site.php:227
1300
  msgid "Public Key"
1301
  msgstr ""
1302
 
1303
+ #: templates/account.php:422, templates/debug.php:373, templates/debug.php:457, templates/debug.php:509, templates/account/partials/site.php:239
1304
  msgid "Secret Key"
1305
  msgstr ""
1306
 
1307
+ #: templates/account.php:425
1308
  msgctxt "as secret encryption key missing"
1309
  msgid "No Secret"
1310
  msgstr ""
1311
 
1312
+ #: templates/account.php:452, templates/account/partials/site.php:120, templates/account/partials/site.php:122
1313
  msgid "Trial"
1314
  msgstr ""
1315
 
1316
+ #: templates/account.php:479, templates/debug.php:561, templates/account/partials/site.php:260
1317
  msgid "License Key"
1318
  msgstr ""
1319
 
1320
+ #: templates/account.php:510
1321
  msgid "Join the Beta program"
1322
  msgstr ""
1323
 
1324
+ #: templates/account.php:516
1325
  msgid "not verified"
1326
  msgstr ""
1327
 
1328
+ #: templates/account.php:525, templates/account/partials/addon.php:190
1329
  msgid "Expired"
1330
  msgstr ""
1331
 
1332
+ #: templates/account.php:585
1333
  msgid "Premium version"
1334
  msgstr ""
1335
 
1336
+ #: templates/account.php:587
1337
  msgid "Free version"
1338
  msgstr ""
1339
 
1340
+ #: templates/account.php:599
1341
  msgid "Verify Email"
1342
  msgstr ""
1343
 
1344
+ #: templates/account.php:613
1345
  msgid "Download %s Version"
1346
  msgstr ""
1347
 
1348
+ #: templates/account.php:629
1349
  msgid "Download Paid Version"
1350
  msgstr ""
1351
 
1352
+ #: templates/account.php:647, templates/account.php:890, templates/account/partials/site.php:248, templates/account/partials/site.php:270
1353
  msgctxt "verb"
1354
  msgid "Show"
1355
  msgstr ""
1356
 
1357
+ #: templates/account.php:662
1358
  msgid "What is your %s?"
1359
  msgstr ""
1360
 
1361
+ #: templates/account.php:670, templates/account/billing.php:21
1362
  msgctxt "verb"
1363
  msgid "Edit"
1364
  msgstr ""
1365
 
1366
+ #: templates/account.php:674, templates/forms/user-change.php:27
1367
  msgid "Change User"
1368
  msgstr ""
1369
 
1370
+ #: templates/account.php:698
1371
  msgid "Sites"
1372
  msgstr ""
1373
 
1374
+ #: templates/account.php:711
1375
  msgid "Search by address"
1376
  msgstr ""
1377
 
1378
+ #: templates/account.php:720, templates/debug.php:366
1379
  msgid "Address"
1380
  msgstr ""
1381
 
1382
+ #: templates/account.php:721
1383
  msgid "License"
1384
  msgstr ""
1385
 
1386
+ #: templates/account.php:722
1387
  msgid "Plan"
1388
  msgstr ""
1389
 
1390
+ #: templates/account.php:755
1391
  msgctxt "as software license"
1392
  msgid "License"
1393
  msgstr ""
1394
 
1395
+ #: templates/account.php:884
1396
  msgctxt "verb"
1397
  msgid "Hide"
1398
  msgstr ""
1399
 
1400
+ #: templates/account.php:906, templates/forms/data-debug-mode.php:31
1401
  msgid "Processing"
1402
  msgstr ""
1403
 
1404
+ #: templates/account.php:909
1405
  msgid "Get updates for bleeding edge Beta versions of %s."
1406
  msgstr ""
1407
 
1408
+ #: templates/account.php:967
1409
  msgid "Cancelling %s"
1410
  msgstr ""
1411
 
1412
+ #: templates/account.php:967, templates/account.php:984, templates/forms/subscription-cancellation.php:27, templates/forms/deactivation/form.php:133
1413
  msgid "trial"
1414
  msgstr ""
1415
 
1416
+ #: templates/account.php:982, templates/forms/deactivation/form.php:150
1417
  msgid "Cancelling %s..."
1418
  msgstr ""
1419
 
1420
+ #: templates/account.php:985, templates/forms/subscription-cancellation.php:28, templates/forms/deactivation/form.php:134
1421
  msgid "subscription"
1422
  msgstr ""
1423
 
1424
+ #: templates/account.php:999
1425
  msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?"
1426
  msgstr ""
1427
 
1428
+ #: templates/account.php:1073
1429
+ msgid "Disabling white-label mode"
1430
+ msgstr ""
1431
+
1432
+ #: templates/account.php:1074
1433
+ msgid "Enabling white-label mode"
1434
+ msgstr ""
1435
+
1436
  #: templates/add-ons.php:38
1437
  msgid "View details"
1438
  msgstr ""
1562
  msgid "Can't find your license key?"
1563
  msgstr ""
1564
 
1565
+ #: templates/connect.php:323, templates/connect.php:695, templates/forms/deactivation/retry-skip.php:20
1566
  msgctxt "verb"
1567
  msgid "Skip"
1568
  msgstr ""
1619
  msgid "Title, slug, version, and is active"
1620
  msgstr ""
1621
 
1622
+ #: templates/connect.php:421, templates/forms/license-activation.php:41
1623
  msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license."
1624
  msgstr ""
1625
 
1626
+ #: templates/connect.php:426
1627
  msgid "What permissions are being granted?"
1628
  msgstr ""
1629
 
1630
+ #: templates/connect.php:452
1631
  msgid "Don't have a license key?"
1632
  msgstr ""
1633
 
1634
+ #: templates/connect.php:455
1635
  msgid "Have a license key?"
1636
  msgstr ""
1637
 
1638
+ #: templates/connect.php:463
1639
  msgid "Privacy Policy"
1640
  msgstr ""
1641
 
1642
+ #: templates/connect.php:465
1643
  msgid "License Agreement"
1644
  msgstr ""
1645
 
1646
+ #: templates/connect.php:465
1647
  msgid "Terms of Service"
1648
  msgstr ""
1649
 
1650
+ #: templates/connect.php:854
1651
  msgctxt "as in the process of sending an email"
1652
  msgid "Sending email"
1653
  msgstr ""
1654
 
1655
+ #: templates/connect.php:855
1656
  msgctxt "as activating plugin"
1657
  msgid "Activating"
1658
  msgstr ""
2085
  msgid "Apply to become an affiliate"
2086
  msgstr ""
2087
 
2088
+ #: templates/forms/affiliation.php:107
2089
  msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s."
2090
  msgstr ""
2091
 
2092
+ #: templates/forms/affiliation.php:122
2093
  msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information."
2094
  msgstr ""
2095
 
2096
+ #: templates/forms/affiliation.php:125
2097
  msgid "Your affiliation account was temporarily suspended."
2098
  msgstr ""
2099
 
2100
+ #: templates/forms/affiliation.php:128
2101
  msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days."
2102
  msgstr ""
2103
 
2104
+ #: templates/forms/affiliation.php:131
2105
  msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support."
2106
  msgstr ""
2107
 
2108
+ #: templates/forms/affiliation.php:144
2109
  msgid "Like the %s? Become our ambassador and earn cash ;-)"
2110
  msgstr ""
2111
 
2112
+ #: templates/forms/affiliation.php:145
2113
  msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!"
2114
  msgstr ""
2115
 
2116
+ #: templates/forms/affiliation.php:148
2117
  msgid "Program Summary"
2118
  msgstr ""
2119
 
2120
+ #: templates/forms/affiliation.php:150
2121
  msgid "%s commission when a customer purchases a new license."
2122
  msgstr ""
2123
 
2124
+ #: templates/forms/affiliation.php:152
2125
  msgid "Get commission for automated subscription renewals."
2126
  msgstr ""
2127
 
2128
+ #: templates/forms/affiliation.php:155
2129
  msgid "%s tracking cookie after the first visit to maximize earnings potential."
2130
  msgstr ""
2131
 
2132
+ #: templates/forms/affiliation.php:158
2133
  msgid "Unlimited commissions."
2134
  msgstr ""
2135
 
2136
+ #: templates/forms/affiliation.php:160
2137
  msgid "%s minimum payout amount."
2138
  msgstr ""
2139
 
2140
+ #: templates/forms/affiliation.php:161
2141
  msgid "Payouts are in USD and processed monthly via PayPal."
2142
  msgstr ""
2143
 
2144
+ #: templates/forms/affiliation.php:162
2145
  msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days."
2146
  msgstr ""
2147
 
2148
+ #: templates/forms/affiliation.php:165
2149
  msgid "Affiliate"
2150
  msgstr ""
2151
 
2152
+ #: templates/forms/affiliation.php:168, templates/forms/resend-key.php:23
2153
  msgid "Email address"
2154
  msgstr ""
2155
 
2156
+ #: templates/forms/affiliation.php:172
2157
  msgid "Full name"
2158
  msgstr ""
2159
 
2160
+ #: templates/forms/affiliation.php:176
2161
  msgid "PayPal account email address"
2162
  msgstr ""
2163
 
2164
+ #: templates/forms/affiliation.php:180
2165
  msgid "Where are you going to promote the %s?"
2166
  msgstr ""
2167
 
2168
+ #: templates/forms/affiliation.php:182
2169
  msgid "Enter the domain of your website or other websites from where you plan to promote the %s."
2170
  msgstr ""
2171
 
2172
+ #: templates/forms/affiliation.php:184
2173
  msgid "Add another domain"
2174
  msgstr ""
2175
 
2176
+ #: templates/forms/affiliation.php:188
2177
  msgid "Extra Domains"
2178
  msgstr ""
2179
 
2180
+ #: templates/forms/affiliation.php:189
2181
  msgid "Extra domains where you will be marketing the product from."
2182
  msgstr ""
2183
 
2184
+ #: templates/forms/affiliation.php:199
2185
  msgid "Promotion methods"
2186
  msgstr ""
2187
 
2188
+ #: templates/forms/affiliation.php:202
2189
  msgid "Social media (Facebook, Twitter, etc.)"
2190
  msgstr ""
2191
 
2192
+ #: templates/forms/affiliation.php:206
2193
  msgid "Mobile apps"
2194
  msgstr ""
2195
 
2196
+ #: templates/forms/affiliation.php:210
2197
  msgid "Website, email, and social media statistics (optional)"
2198
  msgstr ""
2199
 
2200
+ #: templates/forms/affiliation.php:213
2201
  msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)."
2202
  msgstr ""
2203
 
2204
+ #: templates/forms/affiliation.php:217
2205
  msgid "How will you promote us?"
2206
  msgstr ""
2207
 
2208
+ #: templates/forms/affiliation.php:220
2209
  msgid "Please provide details on how you intend to promote %s (please be as specific as possible)."
2210
  msgstr ""
2211
 
2212
+ #: templates/forms/affiliation.php:232, templates/forms/resend-key.php:22
2213
  msgid "Cancel"
2214
  msgstr ""
2215
 
2216
+ #: templates/forms/affiliation.php:234
2217
  msgid "Become an affiliate"
2218
  msgstr ""
2219
 
2287
  msgid "Plugins & themes tracking"
2288
  msgstr ""
2289
 
2290
+ #: templates/forms/optout.php:261
2291
  msgid "Saved"
2292
  msgstr ""
2293
 
2499
  msgid "switching"
2500
  msgstr ""
2501
 
2502
+ #: templates/forms/deactivation/form.php:369
2503
  msgid "Submit & %s"
2504
  msgstr ""
2505
 
2506
+ #: templates/forms/deactivation/form.php:390
2507
  msgid "Kindly tell us the reason so we can improve."
2508
  msgstr ""
2509
 
2510
+ #: templates/forms/deactivation/form.php:515
2511
  msgid "Yes - %s"
2512
  msgstr ""
2513
 
2514
+ #: templates/forms/deactivation/form.php:522
2515
  msgid "Skip & %s"
2516
  msgstr ""
2517
 
freemius/start.php CHANGED
@@ -1,522 +1,530 @@
1
- <?php
2
- /**
3
- * @package Freemius
4
- * @copyright Copyright (c) 2015, Freemius, Inc.
5
- * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
- * @since 1.0.3
7
- */
8
-
9
- if ( ! defined( 'ABSPATH' ) ) {
10
- exit;
11
- }
12
-
13
- /**
14
- * Freemius SDK Version.
15
- *
16
- * @var string
17
- */
18
- $this_sdk_version = '2.3.2';
19
-
20
- #region SDK Selection Logic --------------------------------------------------------------------
21
-
22
- /**
23
- * Special logic added on 1.1.6 to make sure that every Freemius powered plugin
24
- * will ALWAYS be loaded with the newest SDK from the active Freemius powered plugins.
25
- *
26
- * Since Freemius SDK is backward compatible, this will make sure that all Freemius powered
27
- * plugins will run correctly.
28
- *
29
- * @since 1.1.6
30
- */
31
-
32
- global $fs_active_plugins;
33
-
34
- if ( ! function_exists( 'fs_find_caller_plugin_file' ) ) {
35
- // Require SDK essentials.
36
- require_once dirname( __FILE__ ) . '/includes/fs-essential-functions.php';
37
- }
38
-
39
- /**
40
- * This complex logic fixes symlink issues (e.g. with Vargant). The logic assumes
41
- * that if it's a file from an SDK running in a theme, the location of the SDK
42
- * is in the main theme's folder.
43
- *
44
- * @author Vova Feldman (@svovaf)
45
- * @since 1.2.2.6
46
- */
47
- $file_path = fs_normalize_path( __FILE__ );
48
- $fs_root_path = dirname( $file_path );
49
- /**
50
- * Get the themes directory where the active theme is located (not passing the stylesheet will make WordPress
51
- * assume that the themes directory is inside `wp-content`.
52
- *
53
- * @author Leo Fajardo (@leorw)
54
- * @since 2.2.3
55
- */
56
- $themes_directory = get_theme_root( get_stylesheet() );
57
- $themes_directory_name = basename( $themes_directory );
58
- $theme_candidate_basename = basename( dirname( $fs_root_path ) ) . '/' . basename( $fs_root_path );
59
-
60
- if ( $file_path == fs_normalize_path( realpath( trailingslashit( $themes_directory ) . $theme_candidate_basename . '/' . basename( $file_path ) ) )
61
- ) {
62
- $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_candidate_basename;
63
- $is_theme = true;
64
- } else {
65
- $this_sdk_relative_path = plugin_basename( $fs_root_path );
66
- $is_theme = false;
67
- }
68
-
69
- if ( ! isset( $fs_active_plugins ) ) {
70
- // Load all Freemius powered active plugins.
71
- $fs_active_plugins = get_option( 'fs_active_plugins', new stdClass() );
72
-
73
- if ( ! isset( $fs_active_plugins->plugins ) ) {
74
- $fs_active_plugins->plugins = array();
75
- }
76
- }
77
-
78
- if ( empty( $fs_active_plugins->abspath ) ) {
79
- /**
80
- * Store the WP install absolute path reference to identify environment change
81
- * while replicating the storage.
82
- *
83
- * @author Vova Feldman (@svovaf)
84
- * @since 1.2.1.7
85
- */
86
- $fs_active_plugins->abspath = ABSPATH;
87
- } else {
88
- if ( ABSPATH !== $fs_active_plugins->abspath ) {
89
- /**
90
- * WordPress path has changed, cleanup the SDK references cache.
91
- * This resolves issues triggered when spinning a staging environments
92
- * while replicating the database.
93
- *
94
- * @author Vova Feldman (@svovaf)
95
- * @since 1.2.1.7
96
- */
97
- $fs_active_plugins->abspath = ABSPATH;
98
- $fs_active_plugins->plugins = array();
99
- unset( $fs_active_plugins->newest );
100
- } else {
101
- /**
102
- * Make sure SDK references are still valid. This resolves
103
- * issues when users hard delete modules via FTP.
104
- *
105
- * @author Vova Feldman (@svovaf)
106
- * @since 1.2.1.7
107
- */
108
- $has_changes = false;
109
- foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) {
110
- if ( ! file_exists( ( isset( $data->type ) && 'theme' === $data->type ? $themes_directory : WP_PLUGIN_DIR ) . '/' . $sdk_path ) ) {
111
- unset( $fs_active_plugins->plugins[ $sdk_path ] );
112
- $has_changes = true;
113
- }
114
- }
115
-
116
- if ( $has_changes ) {
117
- if ( empty( $fs_active_plugins->plugins ) ) {
118
- unset( $fs_active_plugins->newest );
119
- }
120
-
121
- update_option( 'fs_active_plugins', $fs_active_plugins );
122
- }
123
- }
124
- }
125
-
126
- if ( ! function_exists( 'fs_find_direct_caller_plugin_file' ) ) {
127
- require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-1.1.7.1.php';
128
- }
129
-
130
- if ( ! function_exists( 'fs_get_plugins' ) ) {
131
- require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-2.2.1.php';
132
- }
133
-
134
- // Update current SDK info based on the SDK path.
135
- if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ||
136
- $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version
137
- ) {
138
- if ( $is_theme ) {
139
- $plugin_path = basename( dirname( $this_sdk_relative_path ) );
140
- } else {
141
- $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
142
- }
143
-
144
- $fs_active_plugins->plugins[ $this_sdk_relative_path ] = (object) array(
145
- 'version' => $this_sdk_version,
146
- 'type' => ( $is_theme ? 'theme' : 'plugin' ),
147
- 'timestamp' => time(),
148
- 'plugin_path' => $plugin_path,
149
- );
150
- }
151
-
152
- $is_current_sdk_newest = isset( $fs_active_plugins->newest ) && ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path );
153
-
154
- if ( ! isset( $fs_active_plugins->newest ) ) {
155
- /**
156
- * This will be executed only once, for the first time a Freemius powered plugin is activated.
157
- */
158
- fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path );
159
-
160
- $is_current_sdk_newest = true;
161
- } else if ( version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '<' ) ) {
162
- /**
163
- * Current SDK is newer than the newest stored SDK.
164
- */
165
- fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path );
166
-
167
- if ( class_exists( 'Freemius' ) ) {
168
- // Older SDK version was already loaded.
169
-
170
- if ( ! $fs_active_plugins->newest->in_activation ) {
171
- // Re-order plugins to load this plugin first.
172
- fs_newest_sdk_plugin_first();
173
- }
174
-
175
- // Refresh page.
176
- fs_redirect( $_SERVER['REQUEST_URI'] );
177
- }
178
- } else {
179
- if ( ! function_exists( 'get_plugins' ) ) {
180
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
181
- }
182
-
183
- $fs_newest_sdk = $fs_active_plugins->newest;
184
- $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ];
185
-
186
- $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type );
187
-
188
- if ( ! $is_newest_sdk_type_theme ) {
189
- $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path );
190
- } else {
191
- $current_theme = wp_get_theme();
192
- $is_newest_sdk_plugin_active = ( $current_theme->stylesheet === $fs_newest_sdk->plugin_path );
193
-
194
- $current_theme_parent = $current_theme->parent();
195
-
196
- /**
197
- * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop
198
- * from happening by keeping the SDK info stored in the `fs_active_plugins` option.
199
- */
200
- if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) {
201
- $is_newest_sdk_plugin_active = ( $fs_newest_sdk->plugin_path === $current_theme_parent->stylesheet );
202
- }
203
- }
204
-
205
- if ( $is_current_sdk_newest &&
206
- ! $is_newest_sdk_plugin_active &&
207
- ! $fs_active_plugins->newest->in_activation
208
- ) {
209
- // If current SDK is the newest and the plugin is NOT active, it means
210
- // that the current plugin in activation mode.
211
- $fs_active_plugins->newest->in_activation = true;
212
- update_option( 'fs_active_plugins', $fs_active_plugins );
213
- }
214
-
215
- if ( ! $is_theme ) {
216
- $sdk_starter_path = fs_normalize_path( WP_PLUGIN_DIR . '/' . $this_sdk_relative_path . '/start.php' );
217
- } else {
218
- $sdk_starter_path = fs_normalize_path(
219
- $themes_directory
220
- . '/'
221
- . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path )
222
- . '/start.php' );
223
- }
224
-
225
- $is_newest_sdk_path_valid = ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) && file_exists( $sdk_starter_path );
226
-
227
- if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) {
228
- // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
229
- unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
230
- }
231
-
232
- if ( ! ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) ||
233
- ! $is_newest_sdk_path_valid ||
234
- // Is newest SDK downgraded.
235
- ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
236
- version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) )
237
- ) {
238
- /**
239
- * Plugin with newest SDK is no longer active.
240
- * OR
241
- * The newest SDK was in the current plugin. BUT, seems like the version of
242
- * the SDK was downgraded to a lower SDK.
243
- */
244
- // Find the active plugin with the newest SDK version and update the newest reference.
245
- fs_fallback_to_newest_active_sdk();
246
- } else {
247
- if ( $is_newest_sdk_plugin_active &&
248
- $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
249
- ( $fs_active_plugins->newest->in_activation ||
250
- ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) )
251
- )
252
-
253
- ) {
254
- if ( $fs_active_plugins->newest->in_activation && ! $is_newest_sdk_type_theme ) {
255
- // Plugin no more in activation.
256
- $fs_active_plugins->newest->in_activation = false;
257
- update_option( 'fs_active_plugins', $fs_active_plugins );
258
- }
259
-
260
- // Reorder plugins to load plugin with newest SDK first.
261
- if ( fs_newest_sdk_plugin_first() ) {
262
- // Refresh page after re-order to make sure activated plugin loads newest SDK.
263
- if ( class_exists( 'Freemius' ) ) {
264
- fs_redirect( $_SERVER['REQUEST_URI'] );
265
- }
266
- }
267
- }
268
- }
269
- }
270
-
271
- if ( class_exists( 'Freemius' ) ) {
272
- // SDK was already loaded.
273
- return;
274
- }
275
-
276
- if ( version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) {
277
- $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
278
-
279
- $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
280
- WP_PLUGIN_DIR :
281
- $themes_directory;
282
-
283
- $newest_sdk_starter = fs_normalize_path(
284
- $plugins_or_theme_dir_path
285
- . '/'
286
- . str_replace( "../{$themes_directory_name}/", '', $fs_active_plugins->newest->sdk_path )
287
- . '/start.php' );
288
-
289
- if ( file_exists( $newest_sdk_starter ) ) {
290
- // Reorder plugins to load plugin with newest SDK first.
291
- fs_newest_sdk_plugin_first();
292
-
293
- // There's a newer SDK version, load it instead of the current one!
294
- require_once $newest_sdk_starter;
295
-
296
- return;
297
- }
298
- }
299
-
300
- #endregion SDK Selection Logic --------------------------------------------------------------------
301
-
302
- #region Hooks & Filters Collection --------------------------------------------------------------------
303
-
304
- /**
305
- * Freemius hooks (actions & filters) tags structure:
306
- *
307
- * fs_{filter/action_name}_{plugin_slug}
308
- *
309
- * --------------------------------------------------------
310
- *
311
- * Usage with WordPress' add_action() / add_filter():
312
- *
313
- * add_action('fs_{filter/action_name}_{plugin_slug}', $callable);
314
- *
315
- * --------------------------------------------------------
316
- *
317
- * Usage with Freemius' instance add_action() / add_filter():
318
- *
319
- * // No need to add 'fs_' prefix nor '_{plugin_slug}' suffix.
320
- * my_freemius()->add_action('{action_name}', $callable);
321
- *
322
- * --------------------------------------------------------
323
- *
324
- * Freemius filters collection:
325
- *
326
- * fs_connect_url_{plugin_slug}
327
- * fs_trial_promotion_message_{plugin_slug}
328
- * fs_is_long_term_user_{plugin_slug}
329
- * fs_uninstall_reasons_{plugin_slug}
330
- * fs_is_plugin_update_{plugin_slug}
331
- * fs_api_domains_{plugin_slug}
332
- * fs_email_template_sections_{plugin_slug}
333
- * fs_support_forum_submenu_{plugin_slug}
334
- * fs_support_forum_url_{plugin_slug}
335
- * fs_connect_message_{plugin_slug}
336
- * fs_connect_message_on_update_{plugin_slug}
337
- * fs_uninstall_confirmation_message_{plugin_slug}
338
- * fs_pending_activation_message_{plugin_slug}
339
- * fs_is_submenu_visible_{plugin_slug}
340
- * fs_plugin_icon_{plugin_slug}
341
- * fs_show_trial_{plugin_slug}
342
- *
343
- * --------------------------------------------------------
344
- *
345
- * Freemius actions collection:
346
- *
347
- * fs_after_license_loaded_{plugin_slug}
348
- * fs_after_license_change_{plugin_slug}
349
- * fs_after_plans_sync_{plugin_slug}
350
- *
351
- * fs_after_account_details_{plugin_slug}
352
- * fs_after_account_user_sync_{plugin_slug}
353
- * fs_after_account_plan_sync_{plugin_slug}
354
- * fs_before_account_load_{plugin_slug}
355
- * fs_after_account_connection_{plugin_slug}
356
- * fs_account_property_edit_{plugin_slug}
357
- * fs_account_email_verified_{plugin_slug}
358
- * fs_account_page_load_before_departure_{plugin_slug}
359
- * fs_before_account_delete_{plugin_slug}
360
- * fs_after_account_delete_{plugin_slug}
361
- *
362
- * fs_sdk_version_update_{plugin_slug}
363
- * fs_plugin_version_update_{plugin_slug}
364
- *
365
- * fs_initiated_{plugin_slug}
366
- * fs_after_init_plugin_registered_{plugin_slug}
367
- * fs_after_init_plugin_anonymous_{plugin_slug}
368
- * fs_after_init_plugin_pending_activations_{plugin_slug}
369
- * fs_after_init_addon_registered_{plugin_slug}
370
- * fs_after_init_addon_anonymous_{plugin_slug}
371
- * fs_after_init_addon_pending_activations_{plugin_slug}
372
- *
373
- * fs_after_premium_version_activation_{plugin_slug}
374
- * fs_after_free_version_reactivation_{plugin_slug}
375
- *
376
- * fs_after_uninstall_{plugin_slug}
377
- * fs_before_admin_menu_init_{plugin_slug}
378
- */
379
-
380
- #endregion Hooks & Filters Collection --------------------------------------------------------------------
381
-
382
- if ( ! class_exists( 'Freemius' ) ) {
383
-
384
- if ( ! defined( 'WP_FS__SDK_VERSION' ) ) {
385
- define( 'WP_FS__SDK_VERSION', $this_sdk_version );
386
- }
387
-
388
- $plugins_or_theme_dir_path = fs_normalize_path( trailingslashit( $is_theme ?
389
- $themes_directory :
390
- WP_PLUGIN_DIR ) );
391
-
392
- if ( 0 === strpos( $file_path, $plugins_or_theme_dir_path ) ) {
393
- // No symlinks
394
- } else {
395
- /**
396
- * This logic finds the SDK symlink and set WP_FS__DIR to use it.
397
- *
398
- * @author Vova Feldman (@svovaf)
399
- * @since 1.2.2.5
400
- */
401
- $sdk_symlink = null;
402
-
403
- // Try to load SDK's symlink from cache.
404
- if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
405
- is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
406
- ! empty( $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink )
407
- ) {
408
- $sdk_symlink = $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink;
409
- if ( 0 === strpos( $sdk_symlink, $plugins_or_theme_dir_path ) ) {
410
- /**
411
- * Make the symlink path relative.
412
- *
413
- * @author Leo Fajardo (@leorw)
414
- */
415
- $sdk_symlink = substr( $sdk_symlink, strlen( $plugins_or_theme_dir_path ) );
416
-
417
- $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink;
418
- update_option( 'fs_active_plugins', $fs_active_plugins );
419
- }
420
-
421
- $realpath = realpath( $plugins_or_theme_dir_path . $sdk_symlink );
422
- if ( ! is_string( $realpath ) || ! file_exists( $realpath ) ) {
423
- $sdk_symlink = null;
424
- }
425
- }
426
-
427
- if ( empty( $sdk_symlink ) ) // Has symlinks, therefore, we need to configure WP_FS__DIR based on the symlink.
428
- {
429
- $partial_path_right = basename( $file_path );
430
- $partial_path_left = dirname( $file_path );
431
- $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right );
432
-
433
- while ( '/' !== $partial_path_left &&
434
- ( false === $realpath || $file_path !== fs_normalize_path( $realpath ) )
435
- ) {
436
- $partial_path_right = trailingslashit( basename( $partial_path_left ) ) . $partial_path_right;
437
- $partial_path_left_prev = $partial_path_left;
438
- $partial_path_left = dirname( $partial_path_left_prev );
439
-
440
- /**
441
- * Avoid infinite loop if for example `$partial_path_left_prev` is `C:/`, in this case,
442
- * `dirname( 'C:/' )` will return `C:/`.
443
- *
444
- * @author Leo Fajardo (@leorw)
445
- */
446
- if ( $partial_path_left === $partial_path_left_prev ) {
447
- $partial_path_left = '';
448
- break;
449
- }
450
-
451
- $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right );
452
- }
453
-
454
- if ( ! empty( $partial_path_left ) && '/' !== $partial_path_left ) {
455
- $sdk_symlink = fs_normalize_path( dirname( $partial_path_right ) );
456
-
457
- // Cache value.
458
- if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
459
- is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] )
460
- ) {
461
- $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink;
462
- update_option( 'fs_active_plugins', $fs_active_plugins );
463
- }
464
- }
465
- }
466
-
467
- if ( ! empty( $sdk_symlink ) ) {
468
- // Set SDK dir to the symlink path.
469
- define( 'WP_FS__DIR', $plugins_or_theme_dir_path . $sdk_symlink );
470
- }
471
- }
472
-
473
- // Load SDK files.
474
- require_once dirname( __FILE__ ) . '/require.php';
475
-
476
- /**
477
- * Quick shortcut to get Freemius for specified plugin.
478
- * Used by various templates.
479
- *
480
- * @param number $module_id
481
- *
482
- * @return Freemius
483
- */
484
- function freemius( $module_id ) {
485
- return Freemius::instance( $module_id );
486
- }
487
-
488
- /**
489
- * @param string $slug
490
- * @param number $plugin_id
491
- * @param string $public_key
492
- * @param bool $is_live Is live or test plugin.
493
- * @param bool $is_premium Hints freemius if running the premium plugin or not.
494
- *
495
- * @return Freemius
496
- *
497
- * @deprecated Please use fs_dynamic_init().
498
- */
499
- function fs_init( $slug, $plugin_id, $public_key, $is_live = true, $is_premium = true ) {
500
- $fs = Freemius::instance( $plugin_id, $slug, true );
501
- $fs->init( $plugin_id, $public_key, $is_live, $is_premium );
502
-
503
- return $fs;
504
- }
505
-
506
- /**
507
- * @param array <string,string> $module Plugin or Theme details.
508
- *
509
- * @return Freemius
510
- * @throws Freemius_Exception
511
- */
512
- function fs_dynamic_init( $module ) {
513
- $fs = Freemius::instance( $module['id'], $module['slug'], true );
514
- $fs->dynamic_init( $module );
515
-
516
- return $fs;
517
- }
518
-
519
- function fs_dump_log() {
520
- FS_Logger::dump();
521
- }
 
 
 
 
 
 
 
 
522
  }
1
+ <?php
2
+ /**
3
+ * @package Freemius
4
+ * @copyright Copyright (c) 2015, Freemius, Inc.
5
+ * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
+ * @since 1.0.3
7
+ */
8
+
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ exit;
11
+ }
12
+
13
+ /**
14
+ * Freemius SDK Version.
15
+ *
16
+ * @var string
17
+ */
18
+ $this_sdk_version = '2.4.1';
19
+
20
+ #region SDK Selection Logic --------------------------------------------------------------------
21
+
22
+ /**
23
+ * Special logic added on 1.1.6 to make sure that every Freemius powered plugin
24
+ * will ALWAYS be loaded with the newest SDK from the active Freemius powered plugins.
25
+ *
26
+ * Since Freemius SDK is backward compatible, this will make sure that all Freemius powered
27
+ * plugins will run correctly.
28
+ *
29
+ * @since 1.1.6
30
+ */
31
+
32
+ global $fs_active_plugins;
33
+
34
+ if ( ! function_exists( 'fs_find_caller_plugin_file' ) ) {
35
+ // Require SDK essentials.
36
+ require_once dirname( __FILE__ ) . '/includes/fs-essential-functions.php';
37
+ }
38
+
39
+ /**
40
+ * This complex logic fixes symlink issues (e.g. with Vargant). The logic assumes
41
+ * that if it's a file from an SDK running in a theme, the location of the SDK
42
+ * is in the main theme's folder.
43
+ *
44
+ * @author Vova Feldman (@svovaf)
45
+ * @since 1.2.2.6
46
+ */
47
+ $file_path = fs_normalize_path( __FILE__ );
48
+ $fs_root_path = dirname( $file_path );
49
+ /**
50
+ * Get the themes directory where the active theme is located (not passing the stylesheet will make WordPress
51
+ * assume that the themes directory is inside `wp-content`.
52
+ *
53
+ * @author Leo Fajardo (@leorw)
54
+ * @since 2.2.3
55
+ */
56
+ $themes_directory = get_theme_root( get_stylesheet() );
57
+ $themes_directory_name = basename( $themes_directory );
58
+ $theme_candidate_basename = basename( dirname( $fs_root_path ) ) . '/' . basename( $fs_root_path );
59
+
60
+ if ( $file_path == fs_normalize_path( realpath( trailingslashit( $themes_directory ) . $theme_candidate_basename . '/' . basename( $file_path ) ) )
61
+ ) {
62
+ $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_candidate_basename;
63
+ $is_theme = true;
64
+ } else {
65
+ $this_sdk_relative_path = plugin_basename( $fs_root_path );
66
+ $is_theme = false;
67
+ }
68
+
69
+ if ( ! isset( $fs_active_plugins ) ) {
70
+ // Load all Freemius powered active plugins.
71
+ $fs_active_plugins = get_option( 'fs_active_plugins', new stdClass() );
72
+
73
+ if ( ! isset( $fs_active_plugins->plugins ) ) {
74
+ $fs_active_plugins->plugins = array();
75
+ }
76
+ }
77
+
78
+ if ( empty( $fs_active_plugins->abspath ) ) {
79
+ /**
80
+ * Store the WP install absolute path reference to identify environment change
81
+ * while replicating the storage.
82
+ *
83
+ * @author Vova Feldman (@svovaf)
84
+ * @since 1.2.1.7
85
+ */
86
+ $fs_active_plugins->abspath = ABSPATH;
87
+ } else {
88
+ if ( ABSPATH !== $fs_active_plugins->abspath ) {
89
+ /**
90
+ * WordPress path has changed, cleanup the SDK references cache.
91
+ * This resolves issues triggered when spinning a staging environments
92
+ * while replicating the database.
93
+ *
94
+ * @author Vova Feldman (@svovaf)
95
+ * @since 1.2.1.7
96
+ */
97
+ $fs_active_plugins->abspath = ABSPATH;
98
+ $fs_active_plugins->plugins = array();
99
+ unset( $fs_active_plugins->newest );
100
+ } else {
101
+ /**
102
+ * Make sure SDK references are still valid. This resolves
103
+ * issues when users hard delete modules via FTP.
104
+ *
105
+ * @author Vova Feldman (@svovaf)
106
+ * @since 1.2.1.7
107
+ */
108
+ $has_changes = false;
109
+ foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) {
110
+ if ( ! file_exists( ( isset( $data->type ) && 'theme' === $data->type ? $themes_directory : WP_PLUGIN_DIR ) . '/' . $sdk_path ) ) {
111
+ unset( $fs_active_plugins->plugins[ $sdk_path ] );
112
+
113
+ if (
114
+ ! empty( $fs_active_plugins->newest ) &&
115
+ $sdk_path === $fs_active_plugins->newest->sdk_path
116
+ ) {
117
+ unset( $fs_active_plugins->newest );
118
+ }
119
+
120
+ $has_changes = true;
121
+ }
122
+ }
123
+
124
+ if ( $has_changes ) {
125
+ if ( empty( $fs_active_plugins->plugins ) ) {
126
+ unset( $fs_active_plugins->newest );
127
+ }
128
+
129
+ update_option( 'fs_active_plugins', $fs_active_plugins );
130
+ }
131
+ }
132
+ }
133
+
134
+ if ( ! function_exists( 'fs_find_direct_caller_plugin_file' ) ) {
135
+ require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-1.1.7.1.php';
136
+ }
137
+
138
+ if ( ! function_exists( 'fs_get_plugins' ) ) {
139
+ require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-2.2.1.php';
140
+ }
141
+
142
+ // Update current SDK info based on the SDK path.
143
+ if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ||
144
+ $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version
145
+ ) {
146
+ if ( $is_theme ) {
147
+ $plugin_path = basename( dirname( $this_sdk_relative_path ) );
148
+ } else {
149
+ $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
150
+ }
151
+
152
+ $fs_active_plugins->plugins[ $this_sdk_relative_path ] = (object) array(
153
+ 'version' => $this_sdk_version,
154
+ 'type' => ( $is_theme ? 'theme' : 'plugin' ),
155
+ 'timestamp' => time(),
156
+ 'plugin_path' => $plugin_path,
157
+ );
158
+ }
159
+
160
+ $is_current_sdk_newest = isset( $fs_active_plugins->newest ) && ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path );
161
+
162
+ if ( ! isset( $fs_active_plugins->newest ) ) {
163
+ /**
164
+ * This will be executed only once, for the first time a Freemius powered plugin is activated.
165
+ */
166
+ fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path );
167
+
168
+ $is_current_sdk_newest = true;
169
+ } else if ( version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '<' ) ) {
170
+ /**
171
+ * Current SDK is newer than the newest stored SDK.
172
+ */
173
+ fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path );
174
+
175
+ if ( class_exists( 'Freemius' ) ) {
176
+ // Older SDK version was already loaded.
177
+
178
+ if ( ! $fs_active_plugins->newest->in_activation ) {
179
+ // Re-order plugins to load this plugin first.
180
+ fs_newest_sdk_plugin_first();
181
+ }
182
+
183
+ // Refresh page.
184
+ fs_redirect( $_SERVER['REQUEST_URI'] );
185
+ }
186
+ } else {
187
+ if ( ! function_exists( 'get_plugins' ) ) {
188
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
189
+ }
190
+
191
+ $fs_newest_sdk = $fs_active_plugins->newest;
192
+ $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ];
193
+
194
+ $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type );
195
+
196
+ if ( ! $is_newest_sdk_type_theme ) {
197
+ $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path );
198
+ } else {
199
+ $current_theme = wp_get_theme();
200
+ $is_newest_sdk_plugin_active = ( $current_theme->stylesheet === $fs_newest_sdk->plugin_path );
201
+
202
+ $current_theme_parent = $current_theme->parent();
203
+
204
+ /**
205
+ * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop
206
+ * from happening by keeping the SDK info stored in the `fs_active_plugins` option.
207
+ */
208
+ if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) {
209
+ $is_newest_sdk_plugin_active = ( $fs_newest_sdk->plugin_path === $current_theme_parent->stylesheet );
210
+ }
211
+ }
212
+
213
+ if ( $is_current_sdk_newest &&
214
+ ! $is_newest_sdk_plugin_active &&
215
+ ! $fs_active_plugins->newest->in_activation
216
+ ) {
217
+ // If current SDK is the newest and the plugin is NOT active, it means
218
+ // that the current plugin in activation mode.
219
+ $fs_active_plugins->newest->in_activation = true;
220
+ update_option( 'fs_active_plugins', $fs_active_plugins );
221
+ }
222
+
223
+ if ( ! $is_theme ) {
224
+ $sdk_starter_path = fs_normalize_path( WP_PLUGIN_DIR . '/' . $this_sdk_relative_path . '/start.php' );
225
+ } else {
226
+ $sdk_starter_path = fs_normalize_path(
227
+ $themes_directory
228
+ . '/'
229
+ . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path )
230
+ . '/start.php' );
231
+ }
232
+
233
+ $is_newest_sdk_path_valid = ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) && file_exists( $sdk_starter_path );
234
+
235
+ if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) {
236
+ // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
237
+ unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
238
+ }
239
+
240
+ if ( ! ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) ||
241
+ ! $is_newest_sdk_path_valid ||
242
+ // Is newest SDK downgraded.
243
+ ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
244
+ version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) )
245
+ ) {
246
+ /**
247
+ * Plugin with newest SDK is no longer active.
248
+ * OR
249
+ * The newest SDK was in the current plugin. BUT, seems like the version of
250
+ * the SDK was downgraded to a lower SDK.
251
+ */
252
+ // Find the active plugin with the newest SDK version and update the newest reference.
253
+ fs_fallback_to_newest_active_sdk();
254
+ } else {
255
+ if ( $is_newest_sdk_plugin_active &&
256
+ $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
257
+ ( $fs_active_plugins->newest->in_activation ||
258
+ ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) )
259
+ )
260
+
261
+ ) {
262
+ if ( $fs_active_plugins->newest->in_activation && ! $is_newest_sdk_type_theme ) {
263
+ // Plugin no more in activation.
264
+ $fs_active_plugins->newest->in_activation = false;
265
+ update_option( 'fs_active_plugins', $fs_active_plugins );
266
+ }
267
+
268
+ // Reorder plugins to load plugin with newest SDK first.
269
+ if ( fs_newest_sdk_plugin_first() ) {
270
+ // Refresh page after re-order to make sure activated plugin loads newest SDK.
271
+ if ( class_exists( 'Freemius' ) ) {
272
+ fs_redirect( $_SERVER['REQUEST_URI'] );
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+
279
+ if ( class_exists( 'Freemius' ) ) {
280
+ // SDK was already loaded.
281
+ return;
282
+ }
283
+
284
+ if ( version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) {
285
+ $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
286
+
287
+ $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
288
+ WP_PLUGIN_DIR :
289
+ $themes_directory;
290
+
291
+ $newest_sdk_starter = fs_normalize_path(
292
+ $plugins_or_theme_dir_path
293
+ . '/'
294
+ . str_replace( "../{$themes_directory_name}/", '', $fs_active_plugins->newest->sdk_path )
295
+ . '/start.php' );
296
+
297
+ if ( file_exists( $newest_sdk_starter ) ) {
298
+ // Reorder plugins to load plugin with newest SDK first.
299
+ fs_newest_sdk_plugin_first();
300
+
301
+ // There's a newer SDK version, load it instead of the current one!
302
+ require_once $newest_sdk_starter;
303
+
304
+ return;
305
+ }
306
+ }
307
+
308
+ #endregion SDK Selection Logic --------------------------------------------------------------------
309
+
310
+ #region Hooks & Filters Collection --------------------------------------------------------------------
311
+
312
+ /**
313
+ * Freemius hooks (actions & filters) tags structure:
314
+ *
315
+ * fs_{filter/action_name}_{plugin_slug}
316
+ *
317
+ * --------------------------------------------------------
318
+ *
319
+ * Usage with WordPress' add_action() / add_filter():
320
+ *
321
+ * add_action('fs_{filter/action_name}_{plugin_slug}', $callable);
322
+ *
323
+ * --------------------------------------------------------
324
+ *
325
+ * Usage with Freemius' instance add_action() / add_filter():
326
+ *
327
+ * // No need to add 'fs_' prefix nor '_{plugin_slug}' suffix.
328
+ * my_freemius()->add_action('{action_name}', $callable);
329
+ *
330
+ * --------------------------------------------------------
331
+ *
332
+ * Freemius filters collection:
333
+ *
334
+ * fs_connect_url_{plugin_slug}
335
+ * fs_trial_promotion_message_{plugin_slug}
336
+ * fs_is_long_term_user_{plugin_slug}
337
+ * fs_uninstall_reasons_{plugin_slug}
338
+ * fs_is_plugin_update_{plugin_slug}
339
+ * fs_api_domains_{plugin_slug}
340
+ * fs_email_template_sections_{plugin_slug}
341
+ * fs_support_forum_submenu_{plugin_slug}
342
+ * fs_support_forum_url_{plugin_slug}
343
+ * fs_connect_message_{plugin_slug}
344
+ * fs_connect_message_on_update_{plugin_slug}
345
+ * fs_uninstall_confirmation_message_{plugin_slug}
346
+ * fs_pending_activation_message_{plugin_slug}
347
+ * fs_is_submenu_visible_{plugin_slug}
348
+ * fs_plugin_icon_{plugin_slug}
349
+ * fs_show_trial_{plugin_slug}
350
+ *
351
+ * --------------------------------------------------------
352
+ *
353
+ * Freemius actions collection:
354
+ *
355
+ * fs_after_license_loaded_{plugin_slug}
356
+ * fs_after_license_change_{plugin_slug}
357
+ * fs_after_plans_sync_{plugin_slug}
358
+ *
359
+ * fs_after_account_details_{plugin_slug}
360
+ * fs_after_account_user_sync_{plugin_slug}
361
+ * fs_after_account_plan_sync_{plugin_slug}
362
+ * fs_before_account_load_{plugin_slug}
363
+ * fs_after_account_connection_{plugin_slug}
364
+ * fs_account_property_edit_{plugin_slug}
365
+ * fs_account_email_verified_{plugin_slug}
366
+ * fs_account_page_load_before_departure_{plugin_slug}
367
+ * fs_before_account_delete_{plugin_slug}
368
+ * fs_after_account_delete_{plugin_slug}
369
+ *
370
+ * fs_sdk_version_update_{plugin_slug}
371
+ * fs_plugin_version_update_{plugin_slug}
372
+ *
373
+ * fs_initiated_{plugin_slug}
374
+ * fs_after_init_plugin_registered_{plugin_slug}
375
+ * fs_after_init_plugin_anonymous_{plugin_slug}
376
+ * fs_after_init_plugin_pending_activations_{plugin_slug}
377
+ * fs_after_init_addon_registered_{plugin_slug}
378
+ * fs_after_init_addon_anonymous_{plugin_slug}
379
+ * fs_after_init_addon_pending_activations_{plugin_slug}
380
+ *
381
+ * fs_after_premium_version_activation_{plugin_slug}
382
+ * fs_after_free_version_reactivation_{plugin_slug}
383
+ *
384
+ * fs_after_uninstall_{plugin_slug}
385
+ * fs_before_admin_menu_init_{plugin_slug}
386
+ */
387
+
388
+ #endregion Hooks & Filters Collection --------------------------------------------------------------------
389
+
390
+ if ( ! class_exists( 'Freemius' ) ) {
391
+
392
+ if ( ! defined( 'WP_FS__SDK_VERSION' ) ) {
393
+ define( 'WP_FS__SDK_VERSION', $this_sdk_version );
394
+ }
395
+
396
+ $plugins_or_theme_dir_path = fs_normalize_path( trailingslashit( $is_theme ?
397
+ $themes_directory :
398
+ WP_PLUGIN_DIR ) );
399
+
400
+ if ( 0 === strpos( $file_path, $plugins_or_theme_dir_path ) ) {
401
+ // No symlinks
402
+ } else {
403
+ /**
404
+ * This logic finds the SDK symlink and set WP_FS__DIR to use it.
405
+ *
406
+ * @author Vova Feldman (@svovaf)
407
+ * @since 1.2.2.5
408
+ */
409
+ $sdk_symlink = null;
410
+
411
+ // Try to load SDK's symlink from cache.
412
+ if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
413
+ is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
414
+ ! empty( $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink )
415
+ ) {
416
+ $sdk_symlink = $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink;
417
+ if ( 0 === strpos( $sdk_symlink, $plugins_or_theme_dir_path ) ) {
418
+ /**
419
+ * Make the symlink path relative.
420
+ *
421
+ * @author Leo Fajardo (@leorw)
422
+ */
423
+ $sdk_symlink = substr( $sdk_symlink, strlen( $plugins_or_theme_dir_path ) );
424
+
425
+ $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink;
426
+ update_option( 'fs_active_plugins', $fs_active_plugins );
427
+ }
428
+
429
+ $realpath = realpath( $plugins_or_theme_dir_path . $sdk_symlink );
430
+ if ( ! is_string( $realpath ) || ! file_exists( $realpath ) ) {
431
+ $sdk_symlink = null;
432
+ }
433
+ }
434
+
435
+ if ( empty( $sdk_symlink ) ) // Has symlinks, therefore, we need to configure WP_FS__DIR based on the symlink.
436
+ {
437
+ $partial_path_right = basename( $file_path );
438
+ $partial_path_left = dirname( $file_path );
439
+ $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right );
440
+
441
+ while ( '/' !== $partial_path_left &&
442
+ ( false === $realpath || $file_path !== fs_normalize_path( $realpath ) )
443
+ ) {
444
+ $partial_path_right = trailingslashit( basename( $partial_path_left ) ) . $partial_path_right;
445
+ $partial_path_left_prev = $partial_path_left;
446
+ $partial_path_left = dirname( $partial_path_left_prev );
447
+
448
+ /**
449
+ * Avoid infinite loop if for example `$partial_path_left_prev` is `C:/`, in this case,
450
+ * `dirname( 'C:/' )` will return `C:/`.
451
+ *
452
+ * @author Leo Fajardo (@leorw)
453
+ */
454
+ if ( $partial_path_left === $partial_path_left_prev ) {
455
+ $partial_path_left = '';
456
+ break;
457
+ }
458
+
459
+ $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right );
460
+ }
461
+
462
+ if ( ! empty( $partial_path_left ) && '/' !== $partial_path_left ) {
463
+ $sdk_symlink = fs_normalize_path( dirname( $partial_path_right ) );
464
+
465
+ // Cache value.
466
+ if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
467
+ is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] )
468
+ ) {
469
+ $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink;
470
+ update_option( 'fs_active_plugins', $fs_active_plugins );
471
+ }
472
+ }
473
+ }
474
+
475
+ if ( ! empty( $sdk_symlink ) ) {
476
+ // Set SDK dir to the symlink path.
477
+ define( 'WP_FS__DIR', $plugins_or_theme_dir_path . $sdk_symlink );
478
+ }
479
+ }
480
+
481
+ // Load SDK files.
482
+ require_once dirname( __FILE__ ) . '/require.php';
483
+
484
+ /**
485
+ * Quick shortcut to get Freemius for specified plugin.
486
+ * Used by various templates.
487
+ *
488
+ * @param number $module_id
489
+ *
490
+ * @return Freemius
491
+ */
492
+ function freemius( $module_id ) {
493
+ return Freemius::instance( $module_id );
494
+ }
495
+
496
+ /**
497
+ * @param string $slug
498
+ * @param number $plugin_id
499
+ * @param string $public_key
500
+ * @param bool $is_live Is live or test plugin.
501
+ * @param bool $is_premium Hints freemius if running the premium plugin or not.
502
+ *
503
+ * @return Freemius
504
+ *
505
+ * @deprecated Please use fs_dynamic_init().
506
+ */
507
+ function fs_init( $slug, $plugin_id, $public_key, $is_live = true, $is_premium = true ) {
508
+ $fs = Freemius::instance( $plugin_id, $slug, true );
509
+ $fs->init( $plugin_id, $public_key, $is_live, $is_premium );
510
+
511
+ return $fs;
512
+ }
513
+
514
+ /**
515
+ * @param array <string,string> $module Plugin or Theme details.
516
+ *
517
+ * @return Freemius
518
+ * @throws Freemius_Exception
519
+ */
520
+ function fs_dynamic_init( $module ) {
521
+ $fs = Freemius::instance( $module['id'], $module['slug'], true );
522
+ $fs->dynamic_init( $module );
523
+
524
+ return $fs;
525
+ }
526
+
527
+ function fs_dump_log() {
528
+ FS_Logger::dump();
529
+ }
530
  }
freemius/templates/account.php CHANGED
@@ -163,19 +163,28 @@
163
  }
164
  }
165
 
166
- $is_child_license = ( is_object( $license ) && FS_Plugin_License::is_valid_id( $license->parent_license_id ) );
167
- $bundle_subscription = null;
 
 
 
 
 
 
 
 
 
168
 
169
  if (
170
  $show_plan_row &&
171
  is_object( $license ) &&
172
- FS_Plugin_License::is_valid_id( $license->parent_license_id )
173
  ) {
174
- $bundle_subscription = $fs->_get_subscription( $license->parent_license_id );
 
 
175
  }
176
 
177
- $is_active_bundle_subscription = ( is_object( $bundle_subscription ) && $bundle_subscription->is_active() );
178
-
179
  $fs_blog_id = ( is_multisite() && ! is_network_admin() ) ?
180
  get_current_blog_id() :
181
  0;
@@ -183,6 +192,46 @@
183
  $active_plugins_directories_map = Freemius::get_active_plugins_directories_map( $fs_blog_id );
184
 
185
  $is_premium = $fs->is_premium();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  ?>
187
  <div class="wrap fs-section">
188
  <?php if ( ! $has_tabs && ! $fs->apply_filters( 'hide_account_tabs', false ) ) : ?>
@@ -392,7 +441,7 @@
392
  );
393
  }
394
 
395
- if ( $has_paid_plan ) {
396
  if ( $fs->is_trial() ) {
397
  if ( $show_plan_row ) {
398
  $profile[] = array(
@@ -407,18 +456,18 @@
407
  if ( $show_plan_row ) {
408
  $profile[] = array(
409
  'id' => 'plan',
410
- 'title' => ( $is_child_license ? ucfirst( $fs->get_module_type() ) . ' ' : '' ) . $plan_text,
411
  'value' => strtoupper( is_string( $plan->name ) ?
412
  $plan->title :
413
  strtoupper( $free_text )
414
  )
415
  );
416
 
417
- if ( $is_child_license ) {
418
  $profile[] = array(
419
  'id' => 'bundle_plan',
420
  'title' => $bundle_plan_text,
421
- 'value' => strtoupper( $license->parent_plan_title )
422
  );
423
  }
424
  }
@@ -525,7 +574,7 @@
525
  <?php endif ?>
526
  <?php elseif ( 'bundle_plan' === $p['id'] ) : ?>
527
  <?php if ( is_object( $bundle_subscription ) ) : ?>
528
- <?php if ( $is_active_bundle_subscription && ! $license->is_first_payment_pending() ) : ?>
529
  <label class="fs-tag fs-success"><?php echo esc_html( sprintf( $renews_in_text, human_time_diff( time(), strtotime( $bundle_subscription->next_payment ) ) ) ) ?></label>
530
  <?php endif ?>
531
  <?php endif ?>
@@ -555,7 +604,7 @@
555
  <div class="button-group">
556
  <?php if ( $is_paying || $fs->is_trial() ) : ?>
557
  <?php if ( ! $fs->is_allowed_to_install() ) : ?>
558
- <a target="_blank" class="button button-primary"
559
  href="<?php echo $fs->_get_latest_download_local_url() ?>"><?php
560
  $download_version_text_suffix = ( is_object( $update ) ? ' [' . $update->version . ']' : '' );
561
 
@@ -691,18 +740,6 @@
691
  </div>
692
  </div>
693
  <?php endif ?>
694
-
695
- <?php
696
- $account_addons = $fs->get_updated_account_addons();
697
-
698
- $installed_addons = $fs->get_installed_addons();
699
- $installed_addons_ids = array();
700
- foreach ( $installed_addons as $fs_addon ) {
701
- $installed_addons_ids[] = $fs_addon->get_id();
702
- }
703
-
704
- $addons_to_show = array_unique( array_merge( $installed_addons_ids, $account_addons ) );
705
- ?>
706
  <?php if ( 0 < count( $addons_to_show ) ) : ?>
707
  <!-- Add-Ons -->
708
  <div class="postbox">
@@ -1019,6 +1056,29 @@
1019
  });
1020
  });
1021
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1022
  })(jQuery);
1023
  </script>
1024
  <?php
163
  }
164
  }
165
 
166
+ $has_bundle_license = false;
167
+
168
+ if ( is_object( $license ) &&
169
+ FS_Plugin_License::is_valid_id( $license->parent_license_id )
170
+ ) {
171
+ // Context license has a parent license, therefore, the account has a bundle license.
172
+ $has_bundle_license = true;
173
+ }
174
+
175
+ $bundle_subscription = null;
176
+ $is_bundle_first_payment_pending = false;
177
 
178
  if (
179
  $show_plan_row &&
180
  is_object( $license ) &&
181
+ $has_bundle_license
182
  ) {
183
+ $bundle_plan_title = strtoupper( $license->parent_plan_title );
184
+ $bundle_subscription = $fs->_get_subscription( $license->parent_license_id );
185
+ $is_bundle_first_payment_pending = $license->is_first_payment_pending();
186
  }
187
 
 
 
188
  $fs_blog_id = ( is_multisite() && ! is_network_admin() ) ?
189
  get_current_blog_id() :
190
  0;
192
  $active_plugins_directories_map = Freemius::get_active_plugins_directories_map( $fs_blog_id );
193
 
194
  $is_premium = $fs->is_premium();
195
+
196
+ $account_addons = $fs->get_updated_account_addons();
197
+ $installed_addons = $fs->get_installed_addons();
198
+ $installed_addons_ids = array();
199
+
200
+ /**
201
+ * Store the installed add-ons' IDs into a collection which will be used in determining the add-ons to show on the "Account" page, and at the same time try to find an add-on that is activated with a bundle license if the core product is not.
202
+ *
203
+ * @author Leo Fajardo
204
+ *
205
+ * @since 2.4.0
206
+ */
207
+ foreach ( $installed_addons as $fs_addon ) {
208
+ $installed_addons_ids[] = $fs_addon->get_id();
209
+
210
+ if ( $has_bundle_license ) {
211
+ // We already have the context bundle license details, skip.
212
+ continue;
213
+ }
214
+
215
+ if (
216
+ $show_plan_row &&
217
+ $fs_addon->has_active_valid_license()
218
+ ) {
219
+ $addon_license = $fs_addon->_get_license();
220
+
221
+ if ( FS_Plugin_License::is_valid_id( $addon_license->parent_license_id ) ) {
222
+ // Add-on's license is associated with a parent/bundle license.
223
+ $has_bundle_license = true;
224
+
225
+ $bundle_plan_title = strtoupper( $addon_license->parent_plan_title );
226
+ $bundle_subscription = $fs_addon->_get_subscription( $addon_license->parent_license_id );
227
+ $is_bundle_first_payment_pending = $addon_license->is_first_payment_pending();
228
+ }
229
+ }
230
+ }
231
+
232
+ $addons_to_show = array_unique( array_merge( $installed_addons_ids, $account_addons ) );
233
+
234
+ $is_active_bundle_subscription = ( is_object( $bundle_subscription ) && $bundle_subscription->is_active() );
235
  ?>
236
  <div class="wrap fs-section">
237
  <?php if ( ! $has_tabs && ! $fs->apply_filters( 'hide_account_tabs', false ) ) : ?>
441
  );
442
  }
443
 
444
+ if ( $has_paid_plan || $has_bundle_license ) {
445
  if ( $fs->is_trial() ) {
446
  if ( $show_plan_row ) {
447
  $profile[] = array(
456
  if ( $show_plan_row ) {
457
  $profile[] = array(
458
  'id' => 'plan',
459
+ 'title' => ( $has_bundle_license ? ucfirst( $fs->get_module_type() ) . ' ' : '' ) . $plan_text,
460
  'value' => strtoupper( is_string( $plan->name ) ?
461
  $plan->title :
462
  strtoupper( $free_text )
463
  )
464
  );
465
 
466
+ if ( $has_bundle_license ) {
467
  $profile[] = array(
468
  'id' => 'bundle_plan',
469
  'title' => $bundle_plan_text,
470
+ 'value' => $bundle_plan_title
471
  );
472
  }
473
  }
574
  <?php endif ?>
575
  <?php elseif ( 'bundle_plan' === $p['id'] ) : ?>
576
  <?php if ( is_object( $bundle_subscription ) ) : ?>
577
+ <?php if ( $is_active_bundle_subscription && ! $is_bundle_first_payment_pending ) : ?>
578
  <label class="fs-tag fs-success"><?php echo esc_html( sprintf( $renews_in_text, human_time_diff( time(), strtotime( $bundle_subscription->next_payment ) ) ) ) ?></label>
579
  <?php endif ?>
580
  <?php endif ?>
604
  <div class="button-group">
605
  <?php if ( $is_paying || $fs->is_trial() ) : ?>
606
  <?php if ( ! $fs->is_allowed_to_install() ) : ?>
607
+ <a target="_blank" rel="noopener" class="button button-primary"
608
  href="<?php echo $fs->_get_latest_download_local_url() ?>"><?php
609
  $download_version_text_suffix = ( is_object( $update ) ? ' [' . $update->version . ']' : '' );
610
 
740
  </div>
741
  </div>
742
  <?php endif ?>
 
 
 
 
 
 
 
 
 
 
 
 
743
  <?php if ( 0 < count( $addons_to_show ) ) : ?>
744
  <!-- Add-Ons -->
745
  <div class="postbox">
1056
  });
1057
  });
1058
 
1059
+ $( '.fs-toggle-whitelabel-mode' ).click( function () {
1060
+ var $toggleLink = $( this );
1061
+
1062
+ $.ajax( {
1063
+ url : ajaxurl,
1064
+ method: 'POST',
1065
+ data : {
1066
+ action : '<?php echo $fs->get_ajax_action( 'toggle_whitelabel_mode' ) ?>',
1067
+ security : '<?php echo $fs->get_ajax_security( 'toggle_whitelabel_mode' ) ?>',
1068
+ module_id: <?php echo $fs->get_id() ?>
1069
+ },
1070
+ beforeSend: function () {
1071
+ $toggleLink.parent().text( '<?php
1072
+ $is_whitelabeled ?
1073
+ fs_esc_html_echo_inline( 'Disabling white-label mode', 'disabling-whitelabel-mode' ) :
1074
+ fs_esc_html_echo_inline( 'Enabling white-label mode', 'enabling-whitelabel-mode' )
1075
+ ?>' + '...' );
1076
+ },
1077
+ complete: function () {
1078
+ location.reload();
1079
+ }
1080
+ } );
1081
+ });
1082
  })(jQuery);
1083
  </script>
1084
  <?php
freemius/templates/account/partials/addon.php CHANGED
@@ -366,7 +366,7 @@
366
  );
367
  } else {
368
  $buttons[] = sprintf(
369
- '<a target="_blank" class="button button-primary edit" href="%s">%s</a>',
370
  $fs->_get_latest_download_local_url( $addon_id ),
371
  esc_html( $download_latest_text )
372
  );
@@ -417,7 +417,7 @@
417
  <a class="button button-primary"
418
  href="<?php echo wp_nonce_url( self_admin_url( 'update.php?' . ( ( isset( $addon_info['has_paid_plan'] ) && $addon_info['has_paid_plan'] ) ? 'fs_allow_updater_and_dialog=true&' : '' ) . 'action=install-plugin&plugin=' . $addon_info['slug'] ), 'install-plugin_' . $addon_info['slug'] ) ?>"><?php fs_esc_html_echo_inline( 'Install Now', 'install-now', $slug ) ?></a>
419
  <?php else : ?>
420
- <a target="_blank" class="button button-primary"
421
  href="<?php echo $fs->_get_latest_download_local_url( $addon_id ) ?>"><?php echo esc_html( $download_latest_text ) ?></a>
422
  <?php endif ?>
423
  <?php endif ?>
366
  );
367
  } else {
368
  $buttons[] = sprintf(
369
+ '<a target="_blank" rel="noopener" class="button button-primary edit" href="%s">%s</a>',
370
  $fs->_get_latest_download_local_url( $addon_id ),
371
  esc_html( $download_latest_text )
372
  );
417
  <a class="button button-primary"
418
  href="<?php echo wp_nonce_url( self_admin_url( 'update.php?' . ( ( isset( $addon_info['has_paid_plan'] ) && $addon_info['has_paid_plan'] ) ? 'fs_allow_updater_and_dialog=true&' : '' ) . 'action=install-plugin&plugin=' . $addon_info['slug'] ), 'install-plugin_' . $addon_info['slug'] ) ?>"><?php fs_esc_html_echo_inline( 'Install Now', 'install-now', $slug ) ?></a>
419
  <?php else : ?>
420
+ <a target="_blank" rel="noopener" class="button button-primary"
421
  href="<?php echo $fs->_get_latest_download_local_url( $addon_id ) ?>"><?php echo esc_html( $download_latest_text ) ?></a>
422
  <?php endif ?>
423
  <?php endif ?>
freemius/templates/account/payments.php CHANGED
@@ -47,7 +47,7 @@
47
  <td><?php echo $payment->formatted_gross() ?></td>
48
  <td><?php if (! $payment->is_migrated() ) : ?><a href="<?php echo $fs->_get_invoice_api_url( $payment->id ) ?>"
49
  class="button button-small"
50
- target="_blank"><?php fs_esc_html_echo_inline( 'Invoice', 'invoice', $slug ) ?></a><?php endif ?></td>
51
  </tr>
52
  <?php $odd = ! $odd; endforeach ?>
53
  </tbody>
47
  <td><?php echo $payment->formatted_gross() ?></td>
48
  <td><?php if (! $payment->is_migrated() ) : ?><a href="<?php echo $fs->_get_invoice_api_url( $payment->id ) ?>"
49
  class="button button-small"
50
+ target="_blank" rel="noopener"><?php fs_esc_html_echo_inline( 'Invoice', 'invoice', $slug ) ?></a><?php endif ?></td>
51
  </tr>
52
  <?php $odd = ! $odd; endforeach ?>
53
  </tbody>
freemius/templates/add-ons.php CHANGED
@@ -332,11 +332,11 @@
332
  }
333
  ?>
334
  <?php else : ?>
335
- <a target="_blank" class="button button-primary" href="<?php echo $latest_download_local_url ?>"><?php echo esc_html( $download_latest_text ) ?></a>
336
  <?php endif ?>
337
  <div class="button button-primary fs-dropdown-arrow-button"><span class="fs-dropdown-arrow"></span><ul class="fs-dropdown-list" style="display: none">
338
  <?php if ( $is_allowed_to_install && ! empty( $latest_download_local_url ) ) : ?>
339
- <li><a target="_blank" href="<?php echo $latest_download_local_url ?>"><?php echo esc_html( $download_latest_text ) ?></a></li>
340
  <?php endif ?>
341
  <li><?php
342
  echo sprintf(
332
  }
333
  ?>
334
  <?php else : ?>
335
+ <a target="_blank" rel="noopener" class="button button-primary" href="<?php echo $latest_download_local_url ?>"><?php echo esc_html( $download_latest_text ) ?></a>
336
  <?php endif ?>
337
  <div class="button button-primary fs-dropdown-arrow-button"><span class="fs-dropdown-arrow"></span><ul class="fs-dropdown-list" style="display: none">
338
  <?php if ( $is_allowed_to_install && ! empty( $latest_download_local_url ) ) : ?>
339
+ <li><a target="_blank" rel="noopener" href="<?php echo $latest_download_local_url ?>"><?php echo esc_html( $download_latest_text ) ?></a></li>
340
  <?php endif ?>
341
  <li><?php
342
  echo sprintf(
freemius/templates/auto-installation.php CHANGED
@@ -93,7 +93,7 @@
93
  fs_esc_html_inline( 'An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.', 'installing-in-n', $slug ),
94
  $plugin_title,
95
  sprintf(
96
- '<a href="%s" target="_blank">%s</a>',
97
  'https://freemius.com',
98
  'freemius.com'
99
  ),
93
  fs_esc_html_inline( 'An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.', 'installing-in-n', $slug ),
94
  $plugin_title,
95
  sprintf(
96
+ '<a href="%s" target="_blank" rel="noopener">%s</a>',
97
  'https://freemius.com',
98
  'freemius.com'
99
  ),
freemius/templates/checkout.php CHANGED
File without changes
freemius/templates/connect.php CHANGED
@@ -54,7 +54,7 @@
54
  ) );
55
  }
56
 
57
- $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" tabindex="1">freemius.com</a>';
58
 
59
  $error = fs_request_get( 'error' );
60
 
@@ -222,13 +222,13 @@
222
  esc_html( $default_optin_message ),
223
  '<b>' . esc_html( $fs->get_plugin_name() ) . '</b>',
224
  '<b>' . $current_user->user_login . '</b>',
225
- '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>',
226
  $freemius_link
227
  ),
228
  $first_name,
229
  $fs->get_plugin_name(),
230
  $current_user->user_login,
231
- '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>',
232
  $freemius_link,
233
  $is_gdpr_required
234
  );
@@ -399,11 +399,12 @@
399
  }
400
 
401
  $permissions['extensions'] = array(
402
- 'icon-class' => 'dashicons dashicons-menu',
403
- 'label' => $fs->get_text_inline( 'Plugins & Themes', 'permissions-extensions' ),
404
- 'desc' => $fs->get_text_inline( 'Title, slug, version, and is active', 'permissions-extensions_desc' ),
405
- 'priority' => 25,
406
- 'optional' => true,
 
407
  );
408
 
409
  // Allow filtering of the permissions list.
@@ -429,7 +430,7 @@
429
  class="fs-permission fs-<?php echo esc_attr( $id ); ?>">
430
  <i class="<?php echo esc_attr( $permission['icon-class'] ); ?>"></i>
431
  <?php if ( isset( $permission['optional'] ) && true === $permission['optional'] ) : ?>
432
- <div class="fs-switch fs-small fs-round fs-on">
433
  <div class="fs-toggle"></div>
434
  </div>
435
  <?php endif ?>
@@ -458,10 +459,10 @@
458
  </div>
459
  <?php endif ?>
460
  <div class="fs-terms">
461
- <a href="https://freemius.com/privacy/" target="_blank"
462
  tabindex="1"><?php fs_esc_html_echo_inline( 'Privacy Policy', 'privacy-policy', $slug ) ?></a>
463
  &nbsp;&nbsp;-&nbsp;&nbsp;
464
- <a href="<?php echo $require_license_key ? $freemius_plugin_terms_url : $freemius_usage_tracking_url ?>" target="_blank" tabindex="1"><?php $require_license_key ? fs_echo_inline( 'License Agreement', 'license-agreement', $slug ) : fs_echo_inline( 'Terms of Service', 'tos', $slug ) ?></a>
465
  </div>
466
  </div>
467
  <?php
54
  ) );
55
  }
56
 
57
+ $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" rel="noopener" tabindex="1">freemius.com</a>';
58
 
59
  $error = fs_request_get( 'error' );
60
 
222
  esc_html( $default_optin_message ),
223
  '<b>' . esc_html( $fs->get_plugin_name() ) . '</b>',
224
  '<b>' . $current_user->user_login . '</b>',
225
+ '<a href="' . $site_url . '" target="_blank" rel="noopener noreferrer">' . $site_url . '</a>',
226
  $freemius_link
227
  ),
228
  $first_name,
229
  $fs->get_plugin_name(),
230
  $current_user->user_login,
231
+ '<a href="' . $site_url . '" target="_blank" rel="noopener noreferrer">' . $site_url . '</a>',
232
  $freemius_link,
233
  $is_gdpr_required
234
  );
399
  }
400
 
401
  $permissions['extensions'] = array(
402
+ 'icon-class' => 'dashicons dashicons-menu',
403
+ 'label' => $fs->get_text_inline( 'Plugins & Themes', 'permissions-extensions' ),
404
+ 'desc' => $fs->get_text_inline( 'Title, slug, version, and is active', 'permissions-extensions_desc' ),
405
+ 'priority' => 25,
406
+ 'optional' => true,
407
+ 'default' => $fs->apply_filters( 'permission_extensions_default', true )
408
  );
409
 
410
  // Allow filtering of the permissions list.
430
  class="fs-permission fs-<?php echo esc_attr( $id ); ?>">
431
  <i class="<?php echo esc_attr( $permission['icon-class'] ); ?>"></i>
432
  <?php if ( isset( $permission['optional'] ) && true === $permission['optional'] ) : ?>
433
+ <div class="fs-switch fs-small fs-round fs-<?php echo (! isset( $permission['default'] ) || true === $permission['default'] ) ? 'on' : 'off' ?>">
434
  <div class="fs-toggle"></div>
435
  </div>
436
  <?php endif ?>
459
  </div>
460
  <?php endif ?>
461
  <div class="fs-terms">
462
+ <a href="https://freemius.com/privacy/" target="_blank" rel="noopener"
463
  tabindex="1"><?php fs_esc_html_echo_inline( 'Privacy Policy', 'privacy-policy', $slug ) ?></a>
464
  &nbsp;&nbsp;-&nbsp;&nbsp;
465
+ <a href="<?php echo $require_license_key ? $freemius_plugin_terms_url : $freemius_usage_tracking_url ?>" target="_blank" rel="noopener" tabindex="1"><?php $require_license_key ? fs_echo_inline( 'License Agreement', 'license-agreement', $slug ) : fs_echo_inline( 'Terms of Service', 'tos', $slug ) ?></a>
466
  </div>
467
  </div>
468
  <?php
freemius/templates/contact.php CHANGED
File without changes
freemius/templates/firewall-issues-js.php CHANGED
File without changes
freemius/templates/forms/affiliation.php CHANGED
@@ -83,6 +83,9 @@
83
  }
84
 
85
  $apply_to_become_affiliate_text = fs_text_inline( 'Apply to become an affiliate', 'apply-to-become-an-affiliate', $slug );
 
 
 
86
  ?>
87
  <div id="fs_affiliation_content_wrapper" class="wrap">
88
  <form method="post" action="">
@@ -104,7 +107,7 @@
104
  fs_esc_html_inline( "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.", 'affiliate-application-accepted', $slug ),
105
  $plugin_title,
106
  sprintf(
107
- '<a href="%s" target="_blank">%s</a>',
108
  $members_dashboard_login_url,
109
  $members_dashboard_login_url
110
  )
@@ -217,11 +220,17 @@
217
  <p class="description"><?php echo esc_html( sprintf( fs_text_inline( 'Please provide details on how you intend to promote %s (please be as specific as possible).', 'promotion-method-desc-field-desc', $slug ), $plugin_title ) ) ?></p>
218
  <?php endif ?>
219
  </div>
 
 
 
 
 
 
220
  </form>
221
  </div>
222
  <?php if ( ! $is_affiliate ) : ?>
223
  <a id="cancel_button" href="#" class="button button-secondary button-cancel" style="display: none"><?php fs_esc_html_echo_inline( 'Cancel', 'cancel', $slug ) ?></a>
224
- <a id="submit_button" class="button button-primary" href="#" style="display: none"><?php echo esc_html( $apply_to_become_affiliate_text ) ?></a>
225
  <a id="apply_button" class="button button-primary" href="#"><?php fs_esc_html_echo_inline( 'Become an affiliate', 'become-an-affiliate', $slug ) ?></a>
226
  <?php endif ?>
227
  </div>
@@ -242,7 +251,8 @@
242
  $errorMessageContainer = $('#error_message'),
243
  $domain = $('#domain'),
244
  $addDomain = $('#add_domain'),
245
- $extraDomainsContainer = $('#extra_domains_container');
 
246
 
247
  $applyButton.click(function (evt) {
248
  evt.preventDefault();
@@ -360,7 +370,7 @@
360
  data : {
361
  action : '<?php echo $fs->get_ajax_action( 'submit_affiliate_application' ) ?>',
362
  security : '<?php echo $fs->get_ajax_security( 'submit_affiliate_application' ) ?>',
363
- module_id: '<?php echo $fs->get_id() ?>',
364
  affiliate: affiliate
365
  },
366
  beforeSend: function () {
@@ -472,13 +482,26 @@
472
 
473
  window.scrollTo(0, 0);
474
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
475
  });
476
  </script>
477
  </div>
478
  <?php
479
  $params = array(
480
  'page' => 'affiliation',
481
- 'module_id' => $fs->get_id(),
482
  'module_slug' => $slug,
483
  'module_version' => $fs->get_plugin_version(),
484
  );
83
  }
84
 
85
  $apply_to_become_affiliate_text = fs_text_inline( 'Apply to become an affiliate', 'apply-to-become-an-affiliate', $slug );
86
+
87
+ $module_id = $fs->get_id();
88
+ $affiliate_program_terms_url = "https://freemius.com/plugin/{$module_id}/{$slug}/legal/affiliate-program/";
89
  ?>
90
  <div id="fs_affiliation_content_wrapper" class="wrap">
91
  <form method="post" action="">
107
  fs_esc_html_inline( "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.", 'affiliate-application-accepted', $slug ),
108
  $plugin_title,
109
  sprintf(
110
+ '<a href="%s" target="_blank" rel="noopener">%s</a>',
111
  $members_dashboard_login_url,
112
  $members_dashboard_login_url
113
  )
220
  <p class="description"><?php echo esc_html( sprintf( fs_text_inline( 'Please provide details on how you intend to promote %s (please be as specific as possible).', 'promotion-method-desc-field-desc', $slug ), $plugin_title ) ) ?></p>
221
  <?php endif ?>
222
  </div>
223
+ <?php if ( ! $is_affiliate ) : ?>
224
+ <div>
225
+ <input type="checkbox" id="legal_consent_checkbox">
226
+ <label for="legal_consent_checkbox">I agree to the <a href="<?php echo $affiliate_program_terms_url ?>" target="_blank" rel="noopener">Referrer Program</a>'s terms & conditions.</label>
227
+ </div>
228
+ <?php endif ?>
229
  </form>
230
  </div>
231
  <?php if ( ! $is_affiliate ) : ?>
232
  <a id="cancel_button" href="#" class="button button-secondary button-cancel" style="display: none"><?php fs_esc_html_echo_inline( 'Cancel', 'cancel', $slug ) ?></a>
233
+ <a id="submit_button" class="button button-primary disabled" href="#" style="display: none"><?php echo esc_html( $apply_to_become_affiliate_text ) ?></a>
234
  <a id="apply_button" class="button button-primary" href="#"><?php fs_esc_html_echo_inline( 'Become an affiliate', 'become-an-affiliate', $slug ) ?></a>
235
  <?php endif ?>
236
  </div>
251
  $errorMessageContainer = $('#error_message'),
252
  $domain = $('#domain'),
253
  $addDomain = $('#add_domain'),
254
+ $extraDomainsContainer = $('#extra_domains_container'),
255
+ $legalConsentCheckbox = $( '#legal_consent_checkbox' );
256
 
257
  $applyButton.click(function (evt) {
258
  evt.preventDefault();
370
  data : {
371
  action : '<?php echo $fs->get_ajax_action( 'submit_affiliate_application' ) ?>',
372
  security : '<?php echo $fs->get_ajax_security( 'submit_affiliate_application' ) ?>',
373
+ module_id: '<?php echo $module_id ?>',
374
  affiliate: affiliate
375
  },
376
  beforeSend: function () {
482
 
483
  window.scrollTo(0, 0);
484
  }
485
+
486
+ /**
487
+ * @author Xiaheng Chen (@xhchen)
488
+ *
489
+ * @since 2.4.0
490
+ */
491
+ $legalConsentCheckbox.click( function () {
492
+ if ( $( this ).prop( 'checked' ) ) {
493
+ $submitButton.removeClass( 'disabled' );
494
+ } else {
495
+ $submitButton.addClass( 'disabled' );
496
+ }
497
+ } );
498
  });
499
  </script>
500
  </div>
501
  <?php
502
  $params = array(
503
  'page' => 'affiliation',
504
+ 'module_id' => $module_id,
505
  'module_slug' => $slug,
506
  'module_version' => $fs->get_plugin_version(),
507
  );
freemius/templates/forms/deactivation/form.php CHANGED
@@ -79,8 +79,8 @@ HTML;
79
  ?>
80
  <script type="text/javascript">
81
  (function ($) {
82
- var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ) ?>,
83
- modalHtml =
84
  '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">'
85
  + ' <div class="fs-modal-dialog">'
86
  + ' <div class="fs-modal-header">'
@@ -97,19 +97,19 @@ HTML;
97
  + ' </div>'
98
  + ' </div>'
99
  + '</div>',
100
- $modal = $(modalHtml),
101
- $deactivateLink = $('#the-list .deactivate > [data-module-id=<?php echo $fs->get_id() ?>].fs-module-id').prev(),
102
- selectedReasonID = false,
103
- redirectLink = '',
104
- $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ),
105
- isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
106
- otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
107
- dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
108
- deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>,
109
  $subscriptionCancellationModal = $( '.fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>' ),
110
- showDeactivationFeedbackForm = <?php echo ( $show_deactivation_feedback_form ? 'true' : 'false' ) ?>;
 
111
 
112
- $modal.appendTo($('body'));
113
 
114
  if ( 0 !== $subscriptionCancellationModal.length ) {
115
  $subscriptionCancellationModal.on( '<?php echo $fs->get_action_tag( 'subscription_cancellation_action' ) ?>', function( evt, cancelSubscription ) {
@@ -181,7 +181,11 @@ HTML;
181
  registerEventHandlers();
182
 
183
  function registerEventHandlers() {
184
- $deactivateLink.click(function (evt) {
 
 
 
 
185
  evt.preventDefault();
186
 
187
  redirectLink = $(this).attr('href');
79
  ?>
80
  <script type="text/javascript">
81
  (function ($) {
82
+ var reasonsHtml = <?php echo json_encode( $reasons_list_items_html ) ?>,
83
+ modalHtml =
84
  '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">'
85
  + ' <div class="fs-modal-dialog">'
86
  + ' <div class="fs-modal-header">'
97
  + ' </div>'
98
  + ' </div>'
99
  + '</div>',
100
+ $modal = $(modalHtml),
101
+ selectedReasonID = false,
102
+ redirectLink = '',
103
+ $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ),
104
+ isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
105
+ otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
106
+ dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
107
+ deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>,
 
108
  $subscriptionCancellationModal = $( '.fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>' ),
109
+ showDeactivationFeedbackForm = <?php echo ( $show_deactivation_feedback_form ? 'true' : 'false' ) ?>,
110
+ $body = $( 'body' );
111
 
112
+ $modal.appendTo( $body );
113
 
114
  if ( 0 !== $subscriptionCancellationModal.length ) {
115
  $subscriptionCancellationModal.on( '<?php echo $fs->get_action_tag( 'subscription_cancellation_action' ) ?>', function( evt, cancelSubscription ) {
181
  registerEventHandlers();
182
 
183
  function registerEventHandlers() {
184
+ $body.on( 'click', '#the-list .deactivate > a', function ( evt ) {
185
+ if ( 0 === $( this ).next( '[data-module-id=<?php echo $fs->get_id() ?>].fs-module-id' ).length ) {
186
+ return true;
187
+ }
188
+
189
  evt.preventDefault();
190
 
191
  redirectLink = $(this).attr('href');
freemius/templates/forms/license-activation.php CHANGED
@@ -35,7 +35,7 @@
35
  // Insights platform information.
36
  $fs->get_usage_tracking_terms_url();
37
 
38
- $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" tabindex="0">freemius.com</a>';
39
 
40
  $message_below_input_field = sprintf(
41
  fs_text_inline( 'The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license.', 'license-sync-disclaimer', $slug ),
@@ -229,16 +229,16 @@ HTML;
229
  + ' </div>'
230
  + '</div>',
231
  $modal = $(modalHtml),
232
- $activateLicenseLink = $('span.activate-license.<?php echo $unique_affix ?> a, .activate-license-trigger.<?php echo $unique_affix ?>'),
233
  $activateLicenseButton = $modal.find('.button-activate-license'),
234
  $licenseKeyInput = $modal.find( 'input.fs-license-key' ),
235
  $licenseActivationMessage = $modal.find( '.license-activation-message' ),
236
  isNetworkActivation = <?php echo $is_network_activation ? 'true' : 'false' ?>,
237
  isUserChangeSupported = <?php echo $is_user_change_supported ? 'true' : 'false' ?>,
238
  isSingleSiteActivation = false,
239
- $ownershipChangeOptionContainer = $modal.find( '.ownership-change-option-container' );
 
240
 
241
- $modal.appendTo($('body'));
242
 
243
  var
244
  $licensesDropdown = $modal.find( '.fs-licenses' ),
@@ -459,7 +459,7 @@ HTML;
459
  });
460
  }
461
 
462
- $activateLicenseLink.click(function (evt) {
463
  evt.preventDefault();
464
 
465
  showModal( evt );
@@ -635,7 +635,7 @@ HTML;
635
 
636
  registerEventHandlers();
637
 
638
- $('body').trigger('licenseActivationLoaded');
639
 
640
  /**
641
  * @author Leo Fajardo (@leorw)
@@ -800,7 +800,7 @@ HTML;
800
 
801
  // Display the dialog box.
802
  $modal.addClass('active');
803
- $('body').addClass('has-fs-modal');
804
 
805
  var
806
  $singleInstallDetails = $( evt.target ).parents( 'tr.fs-install-details' ),
@@ -812,7 +812,9 @@ HTML;
812
  $singleInstallDetails.prev().data( 'blog-id' ) :
813
  null;
814
 
 
815
  $multisiteOptionsContainer.toggle( isNetworkActivation && ! isSingleSiteActivation );
 
816
 
817
  if ( hasLicenseTypes ) {
818
  $licenseTypes.attr( 'checked', false );
@@ -832,7 +834,7 @@ HTML;
832
 
833
  function closeModal() {
834
  $modal.removeClass('active');
835
- $('body').removeClass('has-fs-modal');
836
  }
837
 
838
  function resetActivateLicenseButton() {
35
  // Insights platform information.
36
  $fs->get_usage_tracking_terms_url();
37
 
38
+ $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" rel="noopener" tabindex="0">freemius.com</a>';
39
 
40
  $message_below_input_field = sprintf(
41
  fs_text_inline( 'The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license.', 'license-sync-disclaimer', $slug ),
229
  + ' </div>'
230
  + '</div>',
231
  $modal = $(modalHtml),
 
232
  $activateLicenseButton = $modal.find('.button-activate-license'),
233
  $licenseKeyInput = $modal.find( 'input.fs-license-key' ),
234
  $licenseActivationMessage = $modal.find( '.license-activation-message' ),
235
  isNetworkActivation = <?php echo $is_network_activation ? 'true' : 'false' ?>,
236
  isUserChangeSupported = <?php echo $is_user_change_supported ? 'true' : 'false' ?>,
237
  isSingleSiteActivation = false,
238
+ $ownershipChangeOptionContainer = $modal.find( '.ownership-change-option-container' ),
239
+ $body = $( 'body' );
240
 
241
+ $modal.appendTo( $body );
242
 
243
  var
244
  $licensesDropdown = $modal.find( '.fs-licenses' ),
459
  });
460
  }
461
 
462
+ $body.on( 'click', 'span.activate-license.<?php echo $unique_affix ?> a, .activate-license-trigger.<?php echo $unique_affix ?>', function (evt) {
463
  evt.preventDefault();
464
 
465
  showModal( evt );
635
 
636
  registerEventHandlers();
637
 
638
+ $body.trigger('licenseActivationLoaded');
639
 
640
  /**
641
  * @author Leo Fajardo (@leorw)
800
 
801
  // Display the dialog box.
802
  $modal.addClass('active');
803
+ $body.addClass('has-fs-modal');
804
 
805
  var
806
  $singleInstallDetails = $( evt.target ).parents( 'tr.fs-install-details' ),
812
  $singleInstallDetails.prev().data( 'blog-id' ) :
813
  null;
814
 
815
+ <?php if ( $fs->apply_filters( 'enable_per_site_activation', true ) ) : ?>
816
  $multisiteOptionsContainer.toggle( isNetworkActivation && ! isSingleSiteActivation );
817
+ <?php endif ?>
818
 
819
  if ( hasLicenseTypes ) {
820
  $licenseTypes.attr( 'checked', false );
834
 
835
  function closeModal() {
836
  $modal.removeClass('active');
837
+ $body.removeClass('has-fs-modal');
838
  }
839
 
840
  function resetActivateLicenseButton() {
freemius/templates/forms/optout.php CHANGED
@@ -49,7 +49,7 @@
49
  fs_text_inline( 'By clicking "Opt Out", we will no longer be sending any data from %s to %s.', 'opt-out-message-clicking-opt-out', $slug ),
50
  $plugin_title,
51
  sprintf(
52
- '<a href="%s" target="_blank">%s</a>',
53
  'https://freemius.com',
54
  'freemius.com'
55
  )
@@ -98,20 +98,21 @@
98
  $modal = $(modalHtml),
99
  $adminNotice = $( <?php echo json_encode( $admin_notice_html ) ?> ),
100
  action = '<?php echo $action ?>',
101
- $actionLink = $( 'span.opt-in-or-opt-out.<?php echo $slug ?> a' ),
102
  $optOutButton = $modal.find( '.button-opt-out' ),
103
  $optOutErrorMessage = $modal.find( '.opt-out-error-message' ),
104
  $extensionsTracking = $modal.find( '.fs-permission-extensions' ),
 
105
  moduleID = '<?php echo $fs->get_id() ?>';
106
 
107
- $actionLink.attr( 'data-action', action );
108
- $modal.appendTo( $( 'body' ) );
109
 
110
  function registerActionLinkClick() {
111
- $actionLink.click(function( evt ) {
112
  evt.preventDefault();
113
 
114
- if ( 'stop_tracking' == $actionLink.attr( 'data-action' ) ) {
115
  showModal();
116
  } else {
117
  optIn();
@@ -151,12 +152,12 @@
151
 
152
  // Display the dialog box.
153
  $modal.addClass( 'active' );
154
- $( 'body' ).addClass( 'has-fs-modal' );
155
  }
156
 
157
  function closeModal() {
158
  $modal.removeClass( 'active' );
159
- $( 'body' ).removeClass( 'has-fs-modal' );
160
  }
161
 
162
  function resetOptOutButton() {
@@ -178,6 +179,8 @@
178
  }
179
 
180
  function sendRequest() {
 
 
181
  $.ajax({
182
  url: ajaxurl,
183
  method: 'POST',
@@ -216,7 +219,7 @@
216
  }
217
  }
218
 
219
- $actionLink.attr( 'data-action', action );
220
  } else {
221
  showError( resultObj.error );
222
  resetOptOutButton();
@@ -315,7 +318,11 @@
315
  '<?php echo ( $fs->is_registered() ? '' : esc_js( $reconnect_url ) ) ?>' :
316
  '');
317
 
318
- $actionLink = $('<a id="fs_theme_opt_in_out" href="' + encodeURI(href) + '" class="button" data-action="' + action + '">' + label + '</a>');
 
 
 
 
319
 
320
  $('.theme-wrap .theme-actions .active-theme').append($actionLink);
321
 
49
  fs_text_inline( 'By clicking "Opt Out", we will no longer be sending any data from %s to %s.', 'opt-out-message-clicking-opt-out', $slug ),
50
  $plugin_title,
51
  sprintf(
52
+ '<a href="%s" target="_blank" rel="noopener">%s</a>',
53
  'https://freemius.com',
54
  'freemius.com'
55
  )
98
  $modal = $(modalHtml),
99
  $adminNotice = $( <?php echo json_encode( $admin_notice_html ) ?> ),
100
  action = '<?php echo $action ?>',
101
+ actionLinkSelector = 'span.opt-in-or-opt-out.<?php echo $slug ?> a',
102
  $optOutButton = $modal.find( '.button-opt-out' ),
103
  $optOutErrorMessage = $modal.find( '.opt-out-error-message' ),
104
  $extensionsTracking = $modal.find( '.fs-permission-extensions' ),
105
+ $body = $( 'body' ),
106
  moduleID = '<?php echo $fs->get_id() ?>';
107
 
108
+ $modal.data( 'action', action );
109
+ $modal.appendTo( $body );
110
 
111
  function registerActionLinkClick() {
112
+ $body.on( 'click', actionLinkSelector, function( evt ) {
113
  evt.preventDefault();
114
 
115
+ if ( 'stop_tracking' == $modal.data( 'action' ) ) {
116
  showModal();
117
  } else {
118
  optIn();
152
 
153
  // Display the dialog box.
154
  $modal.addClass( 'active' );
155
+ $body.addClass( 'has-fs-modal' );
156
  }
157
 
158
  function closeModal() {
159
  $modal.removeClass( 'active' );
160
+ $body.removeClass( 'has-fs-modal' );
161
  }
162
 
163
  function resetOptOutButton() {
179
  }
180
 
181
  function sendRequest() {
182
+ var $actionLink = $( actionLinkSelector );
183
+
184
  $.ajax({
185
  url: ajaxurl,
186
  method: 'POST',
219
  }
220
  }
221
 
222
+ $modal.data( 'action', action );
223
  } else {
224
  showError( resultObj.error );
225
  resetOptOutButton();
318
  '<?php echo ( $fs->is_registered() ? '' : esc_js( $reconnect_url ) ) ?>' :
319
  '');
320
 
321
+ var $actionLink = $('<a id="fs_theme_opt_in_out" href="' + encodeURI(href) + '" class="button">' + label + '</a>');
322
+
323
+ actionLinkSelector = '#fs_theme_opt_in_out';
324
+
325
+ $modal.data( 'action', action );
326
 
327
  $('.theme-wrap .theme-actions .active-theme').append($actionLink);
328
 
freemius/templates/forms/subscription-cancellation.php CHANGED
@@ -133,7 +133,7 @@ fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' );
133
  '<div class="fs-modal fs-modal-subscription-cancellation fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>">'
134
  + ' <div class="fs-modal-dialog">'
135
  + ' <div class="fs-modal-header">'
136
- + ' <h4><?php echo esc_attr( sprintf( fs_text_inline( 'Cancel %s?', 'cancel-x', $slug ), ucfirst( $subscription_cancellation_context ) ) ) ?></h4>'
137
  + ' </div>'
138
  + ' <div class="fs-modal-body">'
139
  + ' <div class="fs-modal-panel active">' + <?php echo json_encode( $subscription_cancellation_html ) ?> + '<p class="fs-price-increase-warning" style="display: none;">' + <?php echo json_encode( $prices_increase_text ) ?> + '</p></div>'
133
  '<div class="fs-modal fs-modal-subscription-cancellation fs-modal-subscription-cancellation-<?php echo $fs->get_id() ?>">'
134
  + ' <div class="fs-modal-dialog">'
135
  + ' <div class="fs-modal-header">'
136
+ + ' <h4><?php echo esc_html( sprintf( fs_text_inline( 'Cancel %s?', 'cancel-x', $slug ), ucfirst( $subscription_cancellation_context ) ) ) ?></h4>'
137
  + ' </div>'
138
  + ' <div class="fs-modal-body">'
139
  + ' <div class="fs-modal-panel active">' + <?php echo json_encode( $subscription_cancellation_html ) ?> + '<p class="fs-price-increase-warning" style="display: none;">' + <?php echo json_encode( $prices_increase_text ) ?> + '</p></div>'
freemius/templates/forms/trial-start.php CHANGED
@@ -28,7 +28,7 @@
28
  fs_text_inline( 'For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.', 'start-trial-prompt-message', $slug ),
29
  $fs->get_module_type(),
30
  sprintf(
31
- '<a href="%s" target="_blank">%s</a>',
32
  'https://freemius.com',
33
  'freemius.com'
34
  )
28
  fs_text_inline( 'For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.', 'start-trial-prompt-message', $slug ),
29
  $fs->get_module_type(),
30
  sprintf(
31
+ '<a href="%s" target="_blank" rel="noopener">%s</a>',
32
  'https://freemius.com',
33
  'freemius.com'
34
  )
freemius/templates/partials/index.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ //Silence is golden
freemius/templates/powered-by.php CHANGED
File without changes
freemius/templates/pricing.php CHANGED
@@ -1,177 +1,209 @@
1
- <?php
2
- /**
3
- * @package Freemius
4
- * @copyright Copyright (c) 2015, Freemius, Inc.
5
- * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
- * @since 1.0.3
7
- */
8
-
9
- /**
10
- * Note for WordPress.org Theme/Plugin reviewer:
11
- * Freemius is an SDK for plugin and theme developers. Since the core
12
- * of the SDK is relevant both for plugins and themes, for obvious reasons,
13
- * we only develop and maintain one code base.
14
- *
15
- * This code (and page) will not run for wp.org themes (only plugins).
16
- *
17
- * In addition, this page loads an i-frame. We intentionally named it 'frame'
18
- * so it will pass the "Theme Check" that is looking for the string "i" . "frame".
19
- *
20
- * UPDATE:
21
- * After ongoing conversations with the WordPress.org TRT we received
22
- * an official approval for including i-frames in the theme's WP Admin setting's
23
- * page tab (the SDK will never add any i-frames on the sitefront). i-frames
24
- * were never against the guidelines, but we wanted to get the team's blessings
25
- * before we move forward. For the record, I got the final approval from
26
- * Ulrich Pogson (@grapplerulrich), a team lead at the TRT during WordCamp
27
- * Europe 2017 (June 16th, 2017).
28
- *
29
- * If you have any questions or need clarifications, please don't hesitate
30
- * pinging me on slack, my username is @svovaf.
31
- *
32
- * @author Vova Feldman (@svovaf)
33
- * @since 1.2.2
34
- */
35
-
36
- if ( ! defined( 'ABSPATH' ) ) {
37
- exit;
38
- }
39
-
40
- wp_enqueue_script( 'jquery' );
41
- wp_enqueue_script( 'json2' );
42
- fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' );
43
- fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' );
44
- fs_enqueue_local_style( 'fs_common', '/admin/common.css' );
45
-
46
- /**
47
- * @var array $VARS
48
- * @var Freemius $fs
49
- */
50
- $fs = freemius( $VARS['id'] );
51
- $slug = $fs->get_slug();
52
- $timestamp = time();
53
-
54
- $context_params = array(
55
- 'plugin_id' => $fs->get_id(),
56
- 'plugin_public_key' => $fs->get_public_key(),
57
- 'plugin_version' => $fs->get_plugin_version(),
58
- );
59
-
60
- $bundle_id = $fs->get_bundle_id();
61
- if ( ! is_null( $bundle_id ) ) {
62
- $context_params['bundle_id'] = $bundle_id;
63
- }
64
-
65
- // Get site context secure params.
66
- if ( $fs->is_registered() ) {
67
- $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params(
68
- $fs->get_site(),
69
- $timestamp,
70
- 'upgrade'
71
- ) );
72
- } else {
73
- $context_params['home_url'] = home_url();
74
- }
75
-
76
- if ( $fs->is_payments_sandbox() ) // Append plugin secure token for sandbox mode authentication.)
77
- {
78
- $context_params['sandbox'] = FS_Security::instance()->get_secure_token(
79
- $fs->get_plugin(),
80
- $timestamp,
81
- 'checkout'
82
- );
83
- }
84
-
85
- $query_params = array_merge( $context_params, $_GET, array(
86
- 'next' => $fs->_get_sync_license_url( false, false ),
87
- 'plugin_version' => $fs->get_plugin_version(),
88
- // Billing cycle.
89
- 'billing_cycle' => fs_request_get( 'billing_cycle', WP_FS__PERIOD_ANNUALLY ),
90
- 'is_network_admin' => fs_is_network_admin() ? 'true' : 'false',
91
- 'currency' => $fs->apply_filters( 'default_currency', 'usd' ),
92
- ) );
93
-
94
- if ( ! $fs->is_registered() ) {
95
- $template_data = array(
96
- 'id' => $fs->get_id(),
97
- );
98
- fs_require_template( 'forms/trial-start.php', $template_data);
99
- }
100
-
101
- $view_params = array(
102
- 'id' => $VARS['id'],
103
- 'page' => strtolower( $fs->get_text_x_inline( 'Pricing', 'noun', 'pricing' ) ),
104
- );
105
- fs_require_once_template('secure-https-header.php', $view_params);
106
-
107
- $has_tabs = $fs->_add_tabs_before_content();
108
-
109
- if ( $has_tabs ) {
110
- $query_params['tabs'] = 'true';
111
- }
112
- ?>
113
- <div id="fs_pricing" class="wrap fs-section fs-full-size-wrapper">
114
- <div id="fs_frame"></div>
115
- <form action="" method="POST">
116
- <input type="hidden" name="user_id"/>
117
- <input type="hidden" name="user_email"/>
118
- <input type="hidden" name="site_id"/>
119
- <input type="hidden" name="public_key"/>
120
- <input type="hidden" name="secret_key"/>
121
- <input type="hidden" name="action" value="account"/>
122
- </form>
123
-
124
- <script type="text/javascript">
125
- (function ($, undef) {
126
- $(function () {
127
- var
128
- // Keep track of the i-frame height.
129
- frame_height = 800,
130
- base_url = '<?php echo WP_FS__ADDRESS ?>',
131
- // Pass the parent page URL into the i-frame in a meaningful way (this URL could be
132
- // passed via query string or hard coded into the child page, it depends on your needs).
133
- src = base_url + '/pricing/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href),
134
-
135
- // Append the I-frame into the DOM.
136
- frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent; width: 1px; min-width: 100%;"><\/i' + 'frame>')
137
- .appendTo('#fs_frame');
138
-
139
- FS.PostMessage.init(base_url, [frame[0]]);
140
-
141
- FS.PostMessage.receive('height', function (data) {
142
- var h = data.height;
143
- if (!isNaN(h) && h > 0 && h != frame_height) {
144
- frame_height = h;
145
- frame.height(frame_height + 'px');
146
-
147
- FS.PostMessage.postScroll(frame[0]);
148
- }
149
- });
150
-
151
- FS.PostMessage.receive('get_dimensions', function (data) {
152
- FS.PostMessage.post('dimensions', {
153
- height : $(document.body).height(),
154
- scrollTop: $(document).scrollTop()
155
- }, frame[0]);
156
- });
157
-
158
- FS.PostMessage.receive('start_trial', function (data) {
159
- openTrialConfirmationModal(data);
160
- });
161
- });
162
- })(jQuery);
163
- </script>
164
- </div>
165
- <?php
166
- if ( $has_tabs ) {
167
- $fs->_add_tabs_after_content();
168
- }
169
-
170
- $params = array(
171
- 'page' => 'pricing',
172
- 'module_id' => $fs->get_id(),
173
- 'module_type' => $fs->get_module_type(),
174
- 'module_slug' => $slug,
175
- 'module_version' => $fs->get_plugin_version(),
176
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  fs_require_template( 'powered-by.php', $params );
1
+ <?php
2
+ /**
3
+ * @package Freemius
4
+ * @copyright Copyright (c) 2015, Freemius, Inc.
5
+ * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6
+ * @since 1.0.3
7
+ */
8
+
9
+ /**
10
+ * Note for WordPress.org Theme/Plugin reviewer:
11
+ * Freemius is an SDK for plugin and theme developers. Since the core
12
+ * of the SDK is relevant both for plugins and themes, for obvious reasons,
13
+ * we only develop and maintain one code base.
14
+ *
15
+ * This code (and page) will not run for wp.org themes (only plugins).
16
+ *
17
+ * In addition, this page loads an i-frame. We intentionally named it 'frame'
18
+ * so it will pass the "Theme Check" that is looking for the string "i" . "frame".
19
+ *
20
+ * UPDATE:
21
+ * After ongoing conversations with the WordPress.org TRT we received
22
+ * an official approval for including i-frames in the theme's WP Admin setting's
23
+ * page tab (the SDK will never add any i-frames on the sitefront). i-frames
24
+ * were never against the guidelines, but we wanted to get the team's blessings
25
+ * before we move forward. For the record, I got the final approval from
26
+ * Ulrich Pogson (@grapplerulrich), a team lead at the TRT during WordCamp
27
+ * Europe 2017 (June 16th, 2017).
28
+ *
29
+ * If you have any questions or need clarifications, please don't hesitate
30
+ * pinging me on slack, my username is @svovaf.
31
+ *
32
+ * @author Vova Feldman (@svovaf)
33
+ * @since 1.2.2
34
+ */
35
+
36
+ if ( ! defined( 'ABSPATH' ) ) {
37
+ exit;
38
+ }
39
+
40
+ wp_enqueue_script( 'jquery' );
41
+ wp_enqueue_script( 'json2' );
42
+ fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' );
43
+ fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' );
44
+ fs_enqueue_local_style( 'fs_common', '/admin/common.css' );
45
+
46
+ /**
47
+ * @var array $VARS
48
+ * @var Freemius $fs
49
+ */
50
+ $fs = freemius( $VARS['id'] );
51
+ $slug = $fs->get_slug();
52
+ $timestamp = time();
53
+
54
+ $context_params = array(
55
+ 'plugin_id' => $fs->get_id(),
56
+ 'plugin_public_key' => $fs->get_public_key(),
57
+ 'plugin_version' => $fs->get_plugin_version(),
58
+ );
59
+
60
+ $bundle_id = $fs->get_bundle_id();
61
+ if ( ! is_null( $bundle_id ) ) {
62
+ $context_params['bundle_id'] = $bundle_id;
63
+ }
64
+
65
+ // Get site context secure params.
66
+ if ( $fs->is_registered() ) {
67
+ $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params(
68
+ $fs->get_site(),
69
+ $timestamp,
70
+ 'upgrade'
71
+ ) );
72
+ } else {
73
+ $context_params['home_url'] = home_url();
74
+ }
75
+
76
+ if ( $fs->is_payments_sandbox() ) // Append plugin secure token for sandbox mode authentication.)
77
+ {
78
+ $context_params['sandbox'] = FS_Security::instance()->get_secure_token(
79
+ $fs->get_plugin(),
80
+ $timestamp,
81
+ 'checkout'
82
+ );
83
+ }
84
+
85
+ $query_params = array_merge( $context_params, $_GET, array(
86
+ 'next' => $fs->_get_sync_license_url( false, false ),
87
+ 'plugin_version' => $fs->get_plugin_version(),
88
+ // Billing cycle.
89
+ 'billing_cycle' => fs_request_get( 'billing_cycle', WP_FS__PERIOD_ANNUALLY ),
90
+ 'is_network_admin' => fs_is_network_admin() ? 'true' : 'false',
91
+ 'currency' => $fs->apply_filters( 'default_currency', 'usd' ),
92
+ ) );
93
+
94
+ $use_external_pricing = $fs->should_use_external_pricing();
95
+
96
+ if ( ! $use_external_pricing ) {
97
+ $pricing_js_url = fs_asset_url( $fs->get_pricing_js_path() );
98
+ wp_enqueue_script( 'freemius-pricing', $pricing_js_url );
99
+ } else {
100
+ if ( ! $fs->is_registered() ) {
101
+ $template_data = array(
102
+ 'id' => $fs->get_id(),
103
+ );
104
+ fs_require_template( 'forms/trial-start.php', $template_data);
105
+ }
106
+
107
+ $view_params = array(
108
+ 'id' => $VARS['id'],
109
+ 'page' => strtolower( $fs->get_text_x_inline( 'Pricing', 'noun', 'pricing' ) ),
110
+ );
111
+ fs_require_once_template('secure-https-header.php', $view_params);
112
+ }
113
+
114
+ $has_tabs = $fs->_add_tabs_before_content();
115
+
116
+ if ( $has_tabs ) {
117
+ $query_params['tabs'] = 'true';
118
+ }
119
+ ?>
120
+ <div id="fs_pricing" class="wrap fs-section fs-full-size-wrapper">
121
+ <?php if ( ! $use_external_pricing ) : ?>
122
+ <div id="fs_pricing_wrapper" data-public-url="<?php echo trailingslashit( dirname( $pricing_js_url ) ) ?>"></div>
123
+ <?php
124
+ $pricing_config = array_merge( array(
125
+ 'contact_url' => $fs->contact_url(),
126
+ 'is_network_admin' => fs_is_network_admin(),
127
+ 'is_production' => ( defined( 'WP_FS__IS_PRODUCTION_MODE' ) ? WP_FS__IS_PRODUCTION_MODE : null ),
128
+ 'menu_slug' => $fs->get_menu_slug(),
129
+ 'mode' => 'dashboard',
130
+ 'fs_wp_endpoint_url' => WP_FS__ADDRESS,
131
+ 'request_handler_url' => admin_url(
132
+ 'admin-ajax.php?' . http_build_query( array(
133
+ 'module_id' => $fs->get_id(),
134
+ 'action' => $fs->get_ajax_action( 'pricing_ajax_action' ),
135
+ 'security' => $fs->get_ajax_security( 'pricing_ajax_action' )
136
+ ) )
137
+ ),
138
+ 'selector' => '#fs_pricing_wrapper',
139
+ 'unique_affix' => $fs->get_unique_affix(),
140
+ ), $query_params );
141
+
142
+ wp_add_inline_script( 'freemius-pricing', 'Freemius.pricing.new( ' . json_encode( $pricing_config ) . ' )' );
143
+ ?>
144
+ <?php else : ?>
145
+ <div id="fs_frame"></div>
146
+ <form action="" method="POST">
147
+ <input type="hidden" name="user_id"/>
148
+ <input type="hidden" name="user_email"/>
149
+ <input type="hidden" name="site_id"/>
150
+ <input type="hidden" name="public_key"/>
151
+ <input type="hidden" name="secret_key"/>
152
+ <input type="hidden" name="action" value="account"/>
153
+ </form>
154
+
155
+ <script type="text/javascript">
156
+ (function ($, undef) {
157
+ $(function () {
158
+ var
159
+ // Keep track of the i-frame height.
160
+ frame_height = 800,
161
+ base_url = '<?php echo WP_FS__ADDRESS ?>',
162
+ // Pass the parent page URL into the i-frame in a meaningful way (this URL could be
163
+ // passed via query string or hard coded into the child page, it depends on your needs).
164
+ src = base_url + '/pricing/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href),
165
+
166
+ // Append the I-frame into the DOM.
167
+ frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent; width: 1px; min-width: 100%;"><\/i' + 'frame>')
168
+ .appendTo('#fs_frame');
169
+
170
+ FS.PostMessage.init(base_url, [frame[0]]);
171
+
172
+ FS.PostMessage.receive('height', function (data) {
173
+ var h = data.height;
174
+ if (!isNaN(h) && h > 0 && h != frame_height) {
175
+ frame_height = h;
176
+ frame.height(frame_height + 'px');
177
+
178
+ FS.PostMessage.postScroll(frame[0]);
179
+ }
180
+ });
181
+
182
+ FS.PostMessage.receive('get_dimensions', function (data) {
183
+ FS.PostMessage.post('dimensions', {
184
+ height : $(document.body).height(),
185
+ scrollTop: $(document).scrollTop()
186
+ }, frame[0]);
187
+ });
188
+
189
+ FS.PostMessage.receive('start_trial', function (data) {
190
+ openTrialConfirmationModal(data);
191
+ });
192
+ });
193
+ })(jQuery);
194
+ </script>
195
+ <?php endif ?>
196
+ </div>
197
+ <?php
198
+ if ( $has_tabs ) {
199
+ $fs->_add_tabs_after_content();
200
+ }
201
+
202
+ $params = array(
203
+ 'page' => 'pricing',
204
+ 'module_id' => $fs->get_id(),
205
+ 'module_type' => $fs->get_module_type(),
206
+ 'module_slug' => $slug,
207
+ 'module_version' => $fs->get_plugin_version(),
208
+ );
209
  fs_require_template( 'powered-by.php', $params );
freemius/templates/secure-https-header.php CHANGED
@@ -30,7 +30,7 @@
30
  ) ) .
31
  ' - ' .
32
  sprintf(
33
- '<a class="fs-security-proof" href="%s" target="_blank">%s</a>',
34
  'https://www.mcafeesecure.com/verify?host=' . WP_FS__ROOT_DOMAIN_PRODUCTION,
35
  'Freemius Inc. [US]'
36
  );
30
  ) ) .
31
  ' - ' .
32
  sprintf(
33
+ '<a class="fs-security-proof" href="%s" target="_blank" rel="noopener">%s</a>',
34
  'https://www.mcafeesecure.com/verify?host=' . WP_FS__ROOT_DOMAIN_PRODUCTION,
35
  'Freemius Inc. [US]'
36
  );
freemius/templates/sticky-admin-notice-js.php CHANGED
File without changes
languages/premmerce-url-manager-ru_RU.mo CHANGED
File without changes
languages/premmerce-url-manager-ru_RU.po CHANGED
File without changes
languages/premmerce-url-manager-uk.mo CHANGED
File without changes
languages/premmerce-url-manager-uk.po CHANGED
File without changes
license.txt CHANGED
File without changes
premmerce-url-manager.php CHANGED
@@ -11,7 +11,7 @@ use Premmerce\UrlManager\UrlManagerPlugin;
11
  * Plugin Name: Premmerce Permalink Manager for WooCommerce
12
  * Plugin URI: https://premmerce.com/woocommerce-permalink-manager-remove-shop-product-product-category-url/
13
  * Description: Premmerce Permalink Manager for WooCommerce allows you to change WooCommerce permalink and remove product and product_category slugs from the URL.
14
- * Version: 2.2.0
15
  * Author: premmerce
16
  * Author URI: https://premmerce.com/
17
  * License: GPL-2.0+
@@ -20,7 +20,7 @@ use Premmerce\UrlManager\UrlManagerPlugin;
20
  * Domain Path: /languages
21
  *
22
  * WC requires at least: 3.0.0
23
- * WC tested up to: 4.1.0
24
  */
25
 
26
  // If this file is called directly, abort.
11
  * Plugin Name: Premmerce Permalink Manager for WooCommerce
12
  * Plugin URI: https://premmerce.com/woocommerce-permalink-manager-remove-shop-product-product-category-url/
13
  * Description: Premmerce Permalink Manager for WooCommerce allows you to change WooCommerce permalink and remove product and product_category slugs from the URL.
14
+ * Version: 2.3.0
15
  * Author: premmerce
16
  * Author URI: https://premmerce.com/
17
  * License: GPL-2.0+
20
  * Domain Path: /languages
21
  *
22
  * WC requires at least: 3.0.0
23
+ * WC tested up to: 4.8.0
24
  */
25
 
26
  // If this file is called directly, abort.
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: premmerce, freemius
3
  Tags: woocommerce url, remove product, remove product_category, woocommerce permalink, woocommerce, woocommerce seo
4
  Requires at least: 4.8
5
- Tested up to: 5.3
6
- Stable tag: 2.2.0
7
  Requires PHP: 5.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -12,10 +12,11 @@ Premmerce Permalink Manager for WooCommerce allows you to change WooCommerce per
12
 
13
  == Description ==
14
 
15
- Premmerce Permalink Manager for WooCommerce is developed to shortener the current WooCommerce URL and make it more SEO-friendly.
16
  According to several industry studies, we acknowledge at least two purposes to utilize Permalink Manager for eCommerce:
 
17
  * **URL Length.** According to [Ahrefs research](https://ahrefs.com/blog/on-page-seo/), there is a clear correlation between the number of characters in a URL and rankings.
18
- * **URL Path.** Another well-known fact in the industry is that the closer the page located to the homepage, the more authority boost it may get vs. pages hidden deep down in a site’s architecture. You can read more on top ranking factors on the [Backlinko article](https://backlinko.com/google-ranking-factors).
19
 
20
  [youtube https://www.youtube.com/watch?v=-TMpzsSPiMU]
21
 
@@ -43,6 +44,9 @@ According to several industry studies, we acknowledge at least two purposes to u
43
 
44
  * **Remove the base from the product tags URL**. E.g., site.com/best-deals instead of site.com/product-tag/best-deals
45
  * **Automatic creation of 301 redirects** for duplicated pages. It's extremely important in case you don't wanna lose old structure URLs weight in Google ranking
 
 
 
46
  * Premium support
47
 
48
  = DEMO =
@@ -58,7 +62,8 @@ and all other Premmerce plugins and themes developed by our team available here:
58
 
59
  * base WooCommerce functionality
60
  * Yoast SEO
61
- * WPML WooCommerce Multilingual & Polylang plugins
 
62
  * all the Premmerce plugins
63
 
64
  == Screenshots ==
@@ -71,10 +76,10 @@ and all other Premmerce plugins and themes developed by our team available here:
71
  == Frequently Asked Questions ==
72
 
73
  = Does the plugin affect the overall response rate of an online store? =
74
- We have tested how the plugin works with the basic WooCommerce kit and the standard storefront theme and haven’t noticed any influence on the response rate of the store.
75
 
76
  = Does the plugin create link duplicates? Does it affect SEO? =
77
- The plugin works perfectly with the Yoast SEO plugin installed. No link duplicates are generated. All similar URLs are automatically tagged as canonical in accordance with the search engines’ recommendations.
78
 
79
  = Documentation =
80
  Full documentation is available here: [Premmerce Permalink Manager for WooCommerce](https://premmerce.com/woocommerce-permalink-manager-remove-shop-product-product-category-url/)
@@ -83,9 +88,9 @@ Full documentation is available here: [Premmerce Permalink Manager for WooCommer
83
  Go to Plugins -> Add New section from your admin account and search for Premmerce Permalink Manager for WooCommerce.
84
 
85
  You can also install this plugin manually:
86
- * Download the plugin’s ZIP archive and unzip it.
87
  * Copy the unzipped permalink-manager folder to the /wp-content/plugins/ directory.
88
- * Activate the plugin through the ‘Plugins’ menu in WordPress
89
 
90
  == Changelog ==
91
 
@@ -278,3 +283,14 @@ Release Date: May 18, 2020
278
  * new feature "Url suffix"
279
  * support new symbols
280
  * minor improvements
 
 
 
 
 
 
 
 
 
 
 
2
  Contributors: premmerce, freemius
3
  Tags: woocommerce url, remove product, remove product_category, woocommerce permalink, woocommerce, woocommerce seo
4
  Requires at least: 4.8
5
+ Tested up to: 5.6
6
+ Stable tag: 2.3.0
7
  Requires PHP: 5.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
 
13
  == Description ==
14
 
15
+ Premmerce Permalink Manager for WooCommerce is developed to shortener the current WooCommerce URL to increase your site SEO ranking.
16
  According to several industry studies, we acknowledge at least two purposes to utilize Permalink Manager for eCommerce:
17
+
18
  * **URL Length.** According to [Ahrefs research](https://ahrefs.com/blog/on-page-seo/), there is a clear correlation between the number of characters in a URL and rankings.
19
+ * **URL Path.** Another well-known fact in the industry is that the closer the page located to the homepage, the more authority boost it may get vs. pages hidden deep down in a site's architecture. You can read more on top ranking factors on the [Backlinko article](https://backlinko.com/google-ranking-factors).
20
 
21
  [youtube https://www.youtube.com/watch?v=-TMpzsSPiMU]
22
 
44
 
45
  * **Remove the base from the product tags URL**. E.g., site.com/best-deals instead of site.com/product-tag/best-deals
46
  * **Automatic creation of 301 redirects** for duplicated pages. It's extremely important in case you don't wanna lose old structure URLs weight in Google ranking
47
+ * **Breadcrumbs Support**
48
+ * **Replace the product slug with an SKU**
49
+ * **Adding a suffix to the product and category URL**
50
  * Premium support
51
 
52
  = DEMO =
62
 
63
  * base WooCommerce functionality
64
  * Yoast SEO
65
+ * WPML WooCommerce Multilingual
66
+ * Polylang
67
  * all the Premmerce plugins
68
 
69
  == Screenshots ==
76
  == Frequently Asked Questions ==
77
 
78
  = Does the plugin affect the overall response rate of an online store? =
79
+ We have tested how the plugin works with the basic WooCommerce kit and the standard storefront theme and haven't noticed any influence on the response rate of the store.
80
 
81
  = Does the plugin create link duplicates? Does it affect SEO? =
82
+ The plugin works perfectly with the Yoast SEO plugin installed. No link duplicates are generated. All similar URLs are automatically tagged as canonical in accordance with the search engines' recommendations.
83
 
84
  = Documentation =
85
  Full documentation is available here: [Premmerce Permalink Manager for WooCommerce](https://premmerce.com/woocommerce-permalink-manager-remove-shop-product-product-category-url/)
88
  Go to Plugins -> Add New section from your admin account and search for Premmerce Permalink Manager for WooCommerce.
89
 
90
  You can also install this plugin manually:
91
+ * Download the plugin's ZIP archive and unzip it.
92
  * Copy the unzipped permalink-manager folder to the /wp-content/plugins/ directory.
93
+ * Activate the plugin through the ‘Plugins' menu in WordPress
94
 
95
  == Changelog ==
96
 
283
  * new feature "Url suffix"
284
  * support new symbols
285
  * minor improvements
286
+
287
+ = 2.3.0 =
288
+
289
+ Release Date: December 15, 2020
290
+
291
+ * Added new feature "Breadcrumbs Support"
292
+ * Added new feature "Replace the product slug with an SKU"
293
+ * Updated WooCommerce compatibility version to 4.8
294
+ * Updated WordPress compatibility version to 5.6
295
+ * Updated Freemius SDK to 2.4.1
296
+ * Minor improvements and fixes
src/Addons/AddonInterface.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php namespace Premmerce\UrlManager\Addons;
2
+
3
+ interface AddonInterface
4
+ {
5
+ /**
6
+ * Check if addon is active
7
+ */
8
+ public function isActive();
9
+
10
+ /**
11
+ * Innit addon
12
+ */
13
+ public function init();
14
+ }
src/Addons/AddonManager.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php namespace Premmerce\UrlManager\Addons;
2
+
3
+ class AddonManager
4
+ {
5
+ /**
6
+ * @return string[]
7
+ */
8
+ public function getAddons() {
9
+ return [
10
+ BreadcrumbsAddon::class,
11
+ YoastBreadcrumbsAddon::class
12
+ ];
13
+ }
14
+
15
+ /**
16
+ * Init Addons
17
+ */
18
+ public function initAddons() {
19
+ foreach ( $this->getAddons() as $addon ) {
20
+ $addon = new $addon;
21
+ if( $addon->isActive() ) {
22
+ $addon->init();
23
+ }
24
+ }
25
+ }
26
+ }
src/Addons/BreadcrumbsAddon.php ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php namespace Premmerce\UrlManager\Addons;
2
+
3
+ use Premmerce\UrlManager\Admin\Settings;
4
+
5
+ class BreadcrumbsAddon implements AddonInterface
6
+ {
7
+
8
+ /**
9
+ * Breadcrumbs
10
+ * @var array
11
+ */
12
+ protected $breadcrumbs = [];
13
+
14
+ /**
15
+ * Options
16
+ * @var array
17
+ */
18
+ protected $options = [];
19
+
20
+ /**
21
+ * constructor
22
+ */
23
+ public function __construct()
24
+ {
25
+ $options = get_option( Settings::OPTIONS );
26
+ $this->options = $options;
27
+ }
28
+
29
+ /**
30
+ * Is active
31
+ * @return boolean
32
+ */
33
+ public function isActive()
34
+ {
35
+ include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
36
+ if( ! empty( $this->options['breadcrumbs'] ) && is_plugin_active( 'woocommerce/woocommerce.php') ) {
37
+ return true;
38
+ }
39
+
40
+ return false;
41
+ }
42
+
43
+ /**
44
+ * Init reformat breadcrumbs
45
+ */
46
+ public function init()
47
+ {
48
+ add_filter( 'woocommerce_get_breadcrumb', [ $this, 'createBreadcrumbs' ], 999 );
49
+ }
50
+
51
+ /**
52
+ * Init reformat breadcrumbs
53
+ *
54
+ * @param array $crumbs
55
+ *
56
+ * @return array|void
57
+ */
58
+ public function createBreadcrumbs( $crumbs )
59
+ {
60
+ if( ! is_product() && ! is_product_category() ) {
61
+ return $crumbs;
62
+ }
63
+
64
+ $this->addCrumb( apply_filters( 'premmerce_permalink_home_breadcrumb_default', __( 'Home', 'premmerce-url-manager' ) ), get_site_url() );
65
+
66
+ if( empty( $this->options['br_remove_shop'] ) ) {
67
+ $this->addCrumb( apply_filters( 'premmerce_permalink_shop_breadcrumb_default', __( 'Shop', 'premmerce-url-manager' ) ), get_permalink( wc_get_page_id( 'shop' ) ) );
68
+ }
69
+
70
+
71
+ if( is_product() ) {
72
+
73
+ if ( ! empty( $this->options['product'] ) ) {
74
+ global $post;
75
+
76
+ $terms = wc_get_product_terms(
77
+ $post->ID,
78
+ 'product_cat',
79
+ array(
80
+ 'orderby' => 'parent',
81
+ 'order' => 'DESC',
82
+ )
83
+ );
84
+
85
+ if( $terms ) {
86
+ $mainTerm = $terms[0];
87
+ if( $this->options['product'] == 'category_slug' ) {
88
+ $this->addCrumb( $mainTerm->name, get_term_link( $mainTerm ) );
89
+ } elseif( $this->options['product'] == 'hierarchical' ) {
90
+ $this->addCrumbAncestors( $mainTerm->term_id, 'product_cat' );
91
+ $this->addCrumb( $mainTerm->name, get_term_link( $mainTerm ) );
92
+ }
93
+ }
94
+
95
+ $this->addCrumb( get_the_title( $post ), get_permalink( $post ) );
96
+ }
97
+
98
+ } elseif( is_product_category() ) {
99
+
100
+ if ( ! empty( $this->options['category'] ) ) {
101
+
102
+ $currentTerm = $GLOBALS['wp_query']->get_queried_object();
103
+
104
+ if( $this->options['category'] == 'hierarchical' ) {
105
+ $this->addCrumbAncestors( $currentTerm->term_id, 'product_cat' );
106
+ }
107
+
108
+ $this->addCrumb( $currentTerm->name, get_term_link( $currentTerm, 'product_cat' ) );
109
+ }
110
+ }
111
+
112
+ if( ! empty( $this->breadcrumbs ) ) {
113
+ return $this->getBreadcrumbs();
114
+ }
115
+
116
+ return $crumbs;
117
+ }
118
+
119
+ /**
120
+ * Get breadcrumbs
121
+ *
122
+ * @return array
123
+ */
124
+ protected function getBreadcrumbs() {
125
+ return $this->breadcrumbs;
126
+ }
127
+
128
+ /**
129
+ * Add crumbs for a term
130
+ *
131
+ * @param int $termId Term ID
132
+ * @param string $taxonomy Taxonomy
133
+ */
134
+ protected function addCrumbAncestors( $termId, $taxonomy )
135
+ {
136
+ $ancestors = get_ancestors( $termId, $taxonomy );
137
+ $ancestors = array_reverse( $ancestors );
138
+
139
+ foreach ( $ancestors as $ancestor ) {
140
+ $ancestor = get_term( $ancestor, $taxonomy );
141
+
142
+ if ( ! is_wp_error( $ancestor ) && $ancestor ) {
143
+ $this->addCrumb( $ancestor->name, get_term_link( $ancestor ) );
144
+ }
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Add a crumb
150
+ *
151
+ * @param string $name Name
152
+ * @param string $link Link
153
+ */
154
+ protected function addCrumb( $name, $link = '' )
155
+ {
156
+ $this->breadcrumbs[] = array(
157
+ wp_strip_all_tags( $name ),
158
+ $link,
159
+ );
160
+ }
161
+ }
src/Addons/YoastBreadcrumbsAddon.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php namespace Premmerce\UrlManager\Addons;
2
+
3
+ class YoastBreadcrumbsAddon extends BreadcrumbsAddon
4
+ {
5
+ /**
6
+ * Is active
7
+ * @return boolean
8
+ */
9
+ public function isActive()
10
+ {
11
+ include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
12
+ if( ! empty( $this->options['breadcrumbs'] ) && is_plugin_active( 'wordpress-seo/wp-seo.php' ) ) {
13
+ return true;
14
+ }
15
+
16
+ return false;
17
+ }
18
+
19
+ /**
20
+ * Init reformat breadcrumbs
21
+ */
22
+ public function init()
23
+ {
24
+ add_filter( 'wpseo_breadcrumb_links', [ $this, 'createBreadcrumbs' ], 999 );
25
+ }
26
+
27
+ /**
28
+ * Get breadcrumbs
29
+ *
30
+ * @return array
31
+ */
32
+ public function getBreadcrumbs()
33
+ {
34
+ return array_map( [ $this, 'reformatBreadcrumbs' ], $this->breadcrumbs );
35
+ }
36
+
37
+ /**
38
+ * Reformat breadcrumbs
39
+ *
40
+ * @return array
41
+ */
42
+ protected function reformatBreadcrumbs( $arr )
43
+ {
44
+ return [
45
+ 'text' => $arr[0],
46
+ 'url' => $arr[1],
47
+ ];
48
+ }
49
+ }
src/Admin/Settings.php CHANGED
@@ -15,7 +15,7 @@ class Settings {
15
 
16
  const PERMALINK_STRUCTURE = '/%postname%/';
17
 
18
- const PERMALINK_WC_PRODUCT_CAT = '/shop/%product_cat%/';
19
 
20
  const PERMALINK_WC_PRODUCT = 'product';
21
 
@@ -43,6 +43,11 @@ class Settings {
43
  'productSection',
44
  ], self::SETTINGS_PAGE );
45
 
 
 
 
 
 
46
  add_settings_section( 'additional', __( 'Additional', 'premmerce-url-manager' ), [
47
  $this,
48
  'canonicalSection',
@@ -82,6 +87,12 @@ class Settings {
82
  ] );
83
  }
84
 
 
 
 
 
 
 
85
 
86
  public function canonicalSection() {
87
  $this->fileManager->includeTemplate( 'admin/section/additional.php', [
@@ -89,6 +100,8 @@ class Settings {
89
  'canonical' => $this->getOption( 'canonical' ),
90
  'redirect' => $this->getOption( 'redirect' ),
91
  'use_primary_category' => $this->getOption( 'use_primary_category' ),
 
 
92
  ] );
93
  }
94
 
15
 
16
  const PERMALINK_STRUCTURE = '/%postname%/';
17
 
18
+ const PERMALINK_WC_PRODUCT_CAT = '/product/%product_cat%/';
19
 
20
  const PERMALINK_WC_PRODUCT = 'product';
21
 
43
  'productSection',
44
  ], self::SETTINGS_PAGE );
45
 
46
+ add_settings_section('sku_link', __('SKU', 'premmerce-url-manager'), [
47
+ $this,
48
+ 'skuSection',
49
+ ], self::SETTINGS_PAGE);
50
+
51
  add_settings_section( 'additional', __( 'Additional', 'premmerce-url-manager' ), [
52
  $this,
53
  'canonicalSection',
87
  ] );
88
  }
89
 
90
+ public function skuSection() {
91
+ $this->fileManager->includeTemplate( 'admin/section/sku.php', [
92
+ 'sku' => $this->getOption( 'sku' ),
93
+ 'product' => $this->getOption( 'product' ),
94
+ ] );
95
+ }
96
 
97
  public function canonicalSection() {
98
  $this->fileManager->includeTemplate( 'admin/section/additional.php', [
100
  'canonical' => $this->getOption( 'canonical' ),
101
  'redirect' => $this->getOption( 'redirect' ),
102
  'use_primary_category' => $this->getOption( 'use_primary_category' ),
103
+ 'breadcrumbs' => $this->getOption( 'breadcrumbs' ),
104
+ 'br_remove_shop' => $this->getOption( 'br_remove_shop' ),
105
  ] );
106
  }
107
 
src/Frontend/Frontend.php CHANGED
@@ -13,19 +13,56 @@ use WP_Term ;
13
  class Frontend
14
  {
15
  const WOO_PRODUCT = 'product' ;
 
 
 
 
 
 
16
  /**
17
  * Frontend constructor.
18
  */
19
  public function __construct()
20
  {
21
  $options = get_option( Settings::OPTIONS );
22
- if ( !empty($options['product']) ) {
 
23
  add_action( 'request', [ $this, 'replaceRequest' ], 11 );
24
  }
25
  if ( !empty($options['canonical']) ) {
26
  add_action( 'wp_head', [ $this, 'addCanonical' ] );
27
  }
28
  #/premmerce_clear
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  }
30
 
31
  /**
@@ -38,6 +75,9 @@ class Frontend
38
  public function replaceRequest( $request )
39
  {
40
  global $wp, $wpdb ;
 
 
 
41
  $url = $wp->request;
42
 
43
  if ( !empty($url) ) {
@@ -134,5 +174,46 @@ class Frontend
134
  return user_trailingslashit( $canonical );
135
  }
136
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
 
138
  }
13
  class Frontend
14
  {
15
  const WOO_PRODUCT = 'product' ;
16
+ const WOO_CATEGORY = 'product_cat' ;
17
+ /**
18
+ * Options
19
+ * @var array
20
+ */
21
+ protected $options = array() ;
22
  /**
23
  * Frontend constructor.
24
  */
25
  public function __construct()
26
  {
27
  $options = get_option( Settings::OPTIONS );
28
+ $this->options = $options;
29
+ if ( !empty($options['product']) || !empty($options['sku']) ) {
30
  add_action( 'request', [ $this, 'replaceRequest' ], 11 );
31
  }
32
  if ( !empty($options['canonical']) ) {
33
  add_action( 'wp_head', [ $this, 'addCanonical' ] );
34
  }
35
  #/premmerce_clear
36
+ if ( class_exists( 'SitePress' ) ) {
37
+ add_filter( 'icl_ls_languages', [ $this, 'modifyWpmlLanguageSwitcher' ], 20 );
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Modify wpml Language Switcher
43
+ *
44
+ * @param array $languages
45
+ *
46
+ * @return array
47
+ */
48
+ public function modifyWpmlLanguageSwitcher( $languages )
49
+ {
50
+ global $sitepress ;
51
+ foreach ( $languages as $key => $val ) {
52
+ $switcherLink = $val['url'];
53
+ $parsedLink = parse_url( $switcherLink );
54
+ if ( isset( $parsedLink['query'] ) ) {
55
+ $switcherLink = str_replace( '?' . $parsedLink['query'], '', $switcherLink );
56
+ }
57
+
58
+ if ( $key != $sitepress->get_default_language() ) {
59
+ $languages[$key]['url'] = $switcherLink . '?lang=' . $key;
60
+ } else {
61
+ $languages[$key]['url'] = $switcherLink;
62
+ }
63
+
64
+ }
65
+ return $languages;
66
  }
67
 
68
  /**
75
  public function replaceRequest( $request )
76
  {
77
  global $wp, $wpdb ;
78
+ if ( $this->checkIfWooCategoryExists( $request ) ) {
79
+ return $request;
80
+ }
81
  $url = $wp->request;
82
 
83
  if ( !empty($url) ) {
174
  return user_trailingslashit( $canonical );
175
  }
176
  }
177
+
178
+ /**
179
+ * Find current slug by product SKU
180
+ *
181
+ * @param string $sku
182
+ *
183
+ * @return string
184
+ */
185
+ protected function findSlugBySku( $sku )
186
+ {
187
+ global $wpdb ;
188
+ $sql = "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_value = %s AND meta_key = '_sku'";
189
+ $query = $wpdb->prepare( $sql, [ $sku ] );
190
+ $skuId = $wpdb->get_row( $query, ARRAY_A );
191
+
192
+ if ( isset( $skuId['post_id'] ) ) {
193
+ $postSlug = get_post_field( 'post_name', $skuId['post_id'] );
194
+ if ( $postSlug != '' ) {
195
+ return $postSlug;
196
+ }
197
+ }
198
+
199
+ return $sku;
200
+ }
201
+
202
+ /**
203
+ * Check if woocommerce category exists in request
204
+ *
205
+ * @param array $request
206
+ *
207
+ * @return boolean
208
+ */
209
+ protected function checkIfWooCategoryExists( $request )
210
+ {
211
+ if ( !empty($this->options['category']) && in_array( $this->options['product'], [ 'category_slug', 'hierarchical' ] ) ) {
212
+ if ( array_key_exists( self::WOO_CATEGORY, $request ) ) {
213
+ return true;
214
+ }
215
+ }
216
+ return false;
217
+ }
218
 
219
  }
src/PermalinkListener.php CHANGED
@@ -30,6 +30,7 @@ class PermalinkListener
30
  'suffix' => ( !empty($options['suffix']) ? $options['suffix'] : false ),
31
  'enable_suffix_categories' => isset( $options['enable_suffix_categories'] ),
32
  'enable_suffix_products' => isset( $options['enable_suffix_products'] ),
 
33
  ];
34
  $this->taxonomyOptions['product_cat'] = ( isset( $options['category'] ) ? $options['category'] : '' );
35
  #/premmerce_clear
@@ -297,7 +298,7 @@ class PermalinkListener
297
  }
298
 
299
  if ( function_exists( 'wp_list_sort' ) ) {
300
- $terms = wp_list_sort( $terms, 'term_id', 'ASC' );
301
  } else {
302
  usort( $terms, '_usort_terms_by_ID' );
303
  }
@@ -329,5 +330,58 @@ class PermalinkListener
329
  }
330
  return function_exists( 'is_plugin_active' ) && defined( 'WPSEO_BASENAME' ) && is_plugin_active( WPSEO_BASENAME ) && function_exists( 'yoast_get_primary_term_id' );
331
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
 
333
  }
30
  'suffix' => ( !empty($options['suffix']) ? $options['suffix'] : false ),
31
  'enable_suffix_categories' => isset( $options['enable_suffix_categories'] ),
32
  'enable_suffix_products' => isset( $options['enable_suffix_products'] ),
33
+ 'sku' => ( isset( $options['sku'] ) ? $options['sku'] : '' ),
34
  ];
35
  $this->taxonomyOptions['product_cat'] = ( isset( $options['category'] ) ? $options['category'] : '' );
36
  #/premmerce_clear
298
  }
299
 
300
  if ( function_exists( 'wp_list_sort' ) ) {
301
+ $terms = wp_list_sort( $terms, 'term_id', 'DESC' );
302
  } else {
303
  usort( $terms, '_usort_terms_by_ID' );
304
  }
330
  }
331
  return function_exists( 'is_plugin_active' ) && defined( 'WPSEO_BASENAME' ) && is_plugin_active( WPSEO_BASENAME ) && function_exists( 'yoast_get_primary_term_id' );
332
  }
333
+
334
+ /**
335
+ * Check that WPML plugin is enabled and available to use
336
+ *
337
+ * @return bool
338
+ */
339
+ protected function checkWpmlPlugin()
340
+ {
341
+ return class_exists( 'SitePress' );
342
+ }
343
+
344
+ /**
345
+ * Replace current post slug with woocommerce SKU
346
+ *
347
+ * @param string $permalink
348
+ * @param integer $postID
349
+ *
350
+ * @return string
351
+ */
352
+ protected function replaceSlugWithSku( $permalink, $postID )
353
+ {
354
+ $skuString = get_post_meta( $postID, '_sku', true );
355
+ if ( $skuString != '' ) {
356
+ if ( $this->options['sku'] == 'sku' ) {
357
+ return str_replace( basename( $permalink ), $skuString, $permalink );
358
+ }
359
+ }
360
+ return $permalink;
361
+ }
362
+
363
+ /**
364
+ * Add parameters to permalink
365
+ *
366
+ * @param string $permalink
367
+ *
368
+ * @return string
369
+ */
370
+ protected function addParamsToPermalink( $permalink )
371
+ {
372
+ $parsedUrl = parse_url( $permalink, PHP_URL_QUERY );
373
+ parse_str( $parsedUrl, $output );
374
+ if ( isset( $output['lang'] ) ) {
375
+ return $permalink;
376
+ }
377
+ global $sitepress ;
378
+ $isGetParamUrlFormat = apply_filters( 'wpml_setting', 0, 'language_negotiation_type' ) == '3';
379
+ if ( $sitepress->get_default_language() != ICL_LANGUAGE_CODE && $isGetParamUrlFormat ) {
380
+ return add_query_arg( array(
381
+ 'lang' => ICL_LANGUAGE_CODE,
382
+ ), $permalink );
383
+ }
384
+ return $permalink;
385
+ }
386
 
387
  }
src/UrlManagerPlugin.php CHANGED
@@ -5,6 +5,7 @@ use Premmerce\SDK\V2\Notifications\AdminNotifier;
5
  use Premmerce\UrlManager\Admin\Admin;
6
  use Premmerce\UrlManager\Admin\Settings;
7
  use Premmerce\UrlManager\Frontend\Frontend;
 
8
 
9
  /**
10
  * Class UrlManagerPlugin
@@ -13,6 +14,7 @@ use Premmerce\UrlManager\Frontend\Frontend;
13
  */
14
  class UrlManagerPlugin
15
  {
 
16
  const DOMAIN = 'premmerce-url-manager';
17
 
18
  const VERSION = '2.2.0';
@@ -58,8 +60,8 @@ class UrlManagerPlugin
58
  new Frontend();
59
  }
60
  (new PermalinkListener())->registerFilters();
 
61
  }
62
-
63
  }
64
 
65
  /**
5
  use Premmerce\UrlManager\Admin\Admin;
6
  use Premmerce\UrlManager\Admin\Settings;
7
  use Premmerce\UrlManager\Frontend\Frontend;
8
+ use Premmerce\UrlManager\Addons\AddonManager;
9
 
10
  /**
11
  * Class UrlManagerPlugin
14
  */
15
  class UrlManagerPlugin
16
  {
17
+
18
  const DOMAIN = 'premmerce-url-manager';
19
 
20
  const VERSION = '2.2.0';
60
  new Frontend();
61
  }
62
  (new PermalinkListener())->registerFilters();
63
+ (new AddonManager())->initAddons();
64
  }
 
65
  }
66
 
67
  /**
vendor/composer/ClassLoader.php CHANGED
@@ -60,7 +60,7 @@ class ClassLoader
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
63
- return call_user_func_array('array_merge', $this->prefixesPsr0);
64
  }
65
 
66
  return array();
@@ -279,7 +279,7 @@ class ClassLoader
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
282
- $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
283
  }
284
 
285
  /**
@@ -377,7 +377,7 @@ class ClassLoader
377
  $subPath = $class;
378
  while (false !== $lastPos = strrpos($subPath, '\\')) {
379
  $subPath = substr($subPath, 0, $lastPos);
380
- $search = $subPath.'\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
382
  $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
383
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
63
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
64
  }
65
 
66
  return array();
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
282
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
283
  }
284
 
285
  /**
377
  $subPath = $class;
378
  while (false !== $lastPos = strrpos($subPath, '\\')) {
379
  $subPath = substr($subPath, 0, $lastPos);
380
+ $search = $subPath . '\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
382
  $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
383
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
vendor/composer/autoload_real.php CHANGED
@@ -13,6 +13,9 @@ class ComposerAutoloaderInitae9fc0c0f8fb8c17ea09a1107590889c
13
  }
14
  }
15
 
 
 
 
16
  public static function getLoader()
17
  {
18
  if (null !== self::$loader) {
13
  }
14
  }
15
 
16
+ /**
17
+ * @return \Composer\Autoload\ClassLoader
18
+ */
19
  public static function getLoader()
20
  {
21
  if (null !== self::$loader) {
views/admin/banner.php CHANGED
@@ -12,24 +12,24 @@ if ( ! defined('WPINC')) {
12
  <div class="notice woo-permalink-manager-banner" data-get-woo-permalink-manager-banner>
13
  <p>
14
  <img src="<?php echo esc_url($fm->locateAsset('admin/images/filter-icon.png')); ?>"
15
- alt="<? esc_attr_e('Premmerce WooCommerce Product Filter Premium', 'premmerce-url-manager') ?>">
16
  </p>
17
  <h1 class="woo-permalink-manager-banner--heading">
18
- <?php _e('Premmerce WooCommerce Product Filter Premium', 'premmerce-url-manager') ?>
19
  </h1>
20
  <p>
21
- <?php _e('Get clean URLs and additional Pro SEO settings for your Filter pages with Premmerce WooCommerce Filter Premium for only $69!', 'premmerce-url-manager') ?>
22
  <a
23
  href="<?php echo esc_url(add_query_arg(array('action' => 'premmerce_url_manager_ignore_banner'),
24
- site_url('wp-admin/admin-ajax.php'))) ?>"
25
  class="notice-dismiss dashicons dashicons-dismiss dashicons-dismiss-icon"
26
  data-get-woo-permalink-manager-banner--ignore></a>
27
 
28
  </p>
29
  <p>
30
- <a href="<?php echo esc_url('https://premmerce.com/premmerce-woocommerce-product-filter/') ?>"
31
  class="button button-primary button-hero" style="text-decoration: none;">
32
- <?php _e('Get it now', 'saleszone'); ?>
33
  </a>
34
  </p>
35
  </div>
12
  <div class="notice woo-permalink-manager-banner" data-get-woo-permalink-manager-banner>
13
  <p>
14
  <img src="<?php echo esc_url($fm->locateAsset('admin/images/filter-icon.png')); ?>"
15
+ alt="<? esc_attr_e( 'Premmerce WooCommerce Product Filter Premium', 'premmerce-url-manager' ); ?>">
16
  </p>
17
  <h1 class="woo-permalink-manager-banner--heading">
18
+ <?php esc_html_e( 'Premmerce WooCommerce Product Filter Premium', 'premmerce-url-manager' ); ?>
19
  </h1>
20
  <p>
21
+ <?php esc_html_e( 'Get clean URLs and additional Pro SEO settings for your Filter pages with Premmerce WooCommerce Filter Premium for only $69!', 'premmerce-url-manager' ); ?>
22
  <a
23
  href="<?php echo esc_url(add_query_arg(array('action' => 'premmerce_url_manager_ignore_banner'),
24
+ site_url('wp-admin/admin-ajax.php'))); ?>"
25
  class="notice-dismiss dashicons dashicons-dismiss dashicons-dismiss-icon"
26
  data-get-woo-permalink-manager-banner--ignore></a>
27
 
28
  </p>
29
  <p>
30
+ <a href="<?php echo esc_url( 'https://premmerce.com/premmerce-woocommerce-product-filter/' ); ?>"
31
  class="button button-primary button-hero" style="text-decoration: none;">
32
+ <?php esc_html_e( 'Get it now', 'saleszone' ); ?>
33
  </a>
34
  </p>
35
  </div>
views/admin/main.php CHANGED
@@ -6,18 +6,18 @@ if ( ! defined('WPINC')) {
6
 
7
  ?>
8
  <div class="wrap">
9
- <h2><?php _e('WooCommerce Permalink Settings', 'premmerce-url-manager') ?></h2>
10
 
11
  <h2 class="nav-tab-wrapper">
12
  <?php foreach ($tabs as $tab => $name): ?>
13
  <?php $class = ($tab == $current) ? ' nav-tab-active' : ''; ?>
14
- <a class='nav-tab<?php echo $class ?>'
15
- href='?page=premmerce-url-manager-admin&tab=<?php echo $tab ?>'><?php echo $name ?></a>
16
  <?php endforeach; ?>
17
  </h2>
18
 
19
- <?php $file = __DIR__ . "/tabs/{$current}.php" ?>
20
  <?php if (file_exists($file)): ?>
21
- <?php include $file ?>
22
  <?php endif; ?>
23
  </div>
6
 
7
  ?>
8
  <div class="wrap">
9
+ <h2><?php esc_html_e('WooCommerce Permalink Settings', 'premmerce-url-manager'); ?></h2>
10
 
11
  <h2 class="nav-tab-wrapper">
12
  <?php foreach ($tabs as $tab => $name): ?>
13
  <?php $class = ($tab == $current) ? ' nav-tab-active' : ''; ?>
14
+ <a class='nav-tab<?php echo $class; ?>'
15
+ href='?page=premmerce-url-manager-admin&tab=<?php echo $tab; ?>'><?php echo $name; ?></a>
16
  <?php endforeach; ?>
17
  </h2>
18
 
19
+ <?php $file = __DIR__ . "/tabs/{$current}.php"; ?>
20
  <?php if (file_exists($file)): ?>
21
+ <?php include $file; ?>
22
  <?php endif; ?>
23
  </div>
views/admin/section/additional.php CHANGED
@@ -5,8 +5,12 @@ if ( !defined( 'WPINC' ) ) {
5
  }
6
  /**
7
  * @var bool $free
 
8
  * @var string $canonical
9
- * @var string $postfix
 
 
 
10
  */
11
  use Premmerce\UrlManager\Admin\Settings ;
12
  #premmerce_clear
@@ -30,12 +34,12 @@ echo Settings::OPTIONS ;
30
  checked( 'slug', $tag );
31
  ?>>
32
  <?php
33
- _e( 'Remove product tag base', 'premmerce-url-manager' );
34
  ?>
35
  </label>
36
  <p class="description">
37
  <span class="premium-only-feature"><?php
38
- _e( 'Available only in premium version', 'premmerce-url-manager' );
39
  ?></span>
40
  </p>
41
  </th>
@@ -50,11 +54,11 @@ echo Settings::OPTIONS ;
50
  checked( 'on', $use_primary_category );
51
  ?>>
52
  <?php
53
- _e( 'Use primary category', 'premmerce-url-manager' );
54
  ?>
55
  </label>
56
  <p class="description"><?php
57
- _e( "Use 'Yoast SEO' primary category to build product path", 'premmerce-url-manager' );
58
  ?></p>
59
  </th>
60
  </tr>
@@ -68,11 +72,11 @@ echo Settings::OPTIONS ;
68
  checked( 'on', $canonical );
69
  ?>>
70
  <?php
71
- _e( 'Add canonicals', 'premmerce-url-manager' );
72
  ?>
73
  </label>
74
  <p class="description"><?php
75
- _e( 'Add canonical meta tag to duplicated pages', 'premmerce-url-manager' );
76
  ?></p>
77
  </th>
78
  </tr>
@@ -88,15 +92,65 @@ echo Settings::OPTIONS ;
88
  checked( 'on', $redirect );
89
  ?>>
90
  <?php
91
- _e( 'Create redirects', 'premmerce-url-manager' );
92
  ?>
93
  </label>
94
  <p class="description">
95
  <span class="premium-only-feature"><?php
96
- _e( 'Available only in premium version', 'premmerce-url-manager' );
97
  ?></span>
98
  <?php
99
- _e( 'Create 301 redirect from duplicated pages', 'premmerce-url-manager' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  ?>
101
  </p>
102
  </th>
5
  }
6
  /**
7
  * @var bool $free
8
+ * @var string $tag
9
  * @var string $canonical
10
+ * @var string $redirect
11
+ * @var string $use_primary_category
12
+ * @var string $breadcrumbs
13
+ * @var string $br_remove_shop
14
  */
15
  use Premmerce\UrlManager\Admin\Settings ;
16
  #premmerce_clear
34
  checked( 'slug', $tag );
35
  ?>>
36
  <?php
37
+ esc_html_e( 'Remove product tag base', 'premmerce-url-manager' );
38
  ?>
39
  </label>
40
  <p class="description">
41
  <span class="premium-only-feature"><?php
42
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
43
  ?></span>
44
  </p>
45
  </th>
54
  checked( 'on', $use_primary_category );
55
  ?>>
56
  <?php
57
+ esc_html_e( 'Use primary category', 'premmerce-url-manager' );
58
  ?>
59
  </label>
60
  <p class="description"><?php
61
+ esc_html_e( "Use 'Yoast SEO' primary category to build product path", 'premmerce-url-manager' );
62
  ?></p>
63
  </th>
64
  </tr>
72
  checked( 'on', $canonical );
73
  ?>>
74
  <?php
75
+ esc_html_e( 'Add canonicals', 'premmerce-url-manager' );
76
  ?>
77
  </label>
78
  <p class="description"><?php
79
+ esc_html_e( 'Add canonical meta tag to duplicated pages', 'premmerce-url-manager' );
80
  ?></p>
81
  </th>
82
  </tr>
92
  checked( 'on', $redirect );
93
  ?>>
94
  <?php
95
+ esc_html_e( 'Create redirects', 'premmerce-url-manager' );
96
  ?>
97
  </label>
98
  <p class="description">
99
  <span class="premium-only-feature"><?php
100
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
101
  ?></span>
102
  <?php
103
+ esc_html_e( 'Create 301 redirect from duplicated pages', 'premmerce-url-manager' );
104
+ ?>
105
+ </p>
106
+ </th>
107
+ </tr>
108
+ <tr>
109
+ <th>
110
+ <label class="premium-only-label">
111
+ <input <?php
112
+ echo ( $free ? 'disabled' : '' ) ;
113
+ ?> type="checkbox" name="<?php
114
+ echo Settings::OPTIONS ;
115
+ ?>[breadcrumbs]"
116
+ <?php
117
+ checked( 'on', $breadcrumbs );
118
+ ?>>
119
+ <?php
120
+ esc_html_e( 'Support breadcrumbs', 'premmerce-url-manager' );
121
+ ?>
122
+ </label>
123
+ <p class="description">
124
+ <span class="premium-only-feature"><?php
125
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
126
+ ?></span>
127
+ <?php
128
+ esc_html_e( 'Enable breadcrumbs support', 'premmerce-url-manager' );
129
+ ?>
130
+ </p>
131
+ </th>
132
+ </tr>
133
+ <tr>
134
+ <th>
135
+ <label class="premium-only-label">
136
+ <input <?php
137
+ echo ( $free ? 'disabled' : '' ) ;
138
+ ?> type="checkbox" name="<?php
139
+ echo Settings::OPTIONS ;
140
+ ?>[br_remove_shop]"
141
+ <?php
142
+ checked( 'on', $br_remove_shop );
143
+ ?>>
144
+ <?php
145
+ esc_html_e( 'Remove Shop', 'premmerce-url-manager' );
146
+ ?>
147
+ </label>
148
+ <p class="description">
149
+ <span class="premium-only-feature"><?php
150
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
151
+ ?></span>
152
+ <?php
153
+ esc_html_e( 'Remove "Shop" from breadcrumbs', 'premmerce-url-manager' );
154
  ?>
155
  </p>
156
  </th>
views/admin/section/category.php CHANGED
@@ -12,34 +12,34 @@ use Premmerce\UrlManager\Admin\Settings;
12
  <tr>
13
  <th>
14
  <label class="flex-label">
15
- <input type="radio" name="<?= Settings::OPTIONS ?>[category]"
16
  value="" <?php checked( '', $category ); ?>>
17
- <?php _e( 'Use WooCommerce settings', 'premmerce-url-manager' ) ?>
18
  </label>
19
  </th>
20
  </tr>
21
  <tr>
22
  <th>
23
  <label class="flex-label">
24
- <input type="radio" name="<?= Settings::OPTIONS ?>[category]"
25
  value="slug" <?php checked( 'slug', $category ); ?>>
26
- <?php _e( 'Category slug', 'premmerce-url-manager' ) ?>
27
  </label>
28
  </th>
29
  <td>
30
- <code><?= home_url( '/category' ) ?></code>
31
  </td>
32
  </tr>
33
  <tr>
34
  <th>
35
  <label class="flex-label">
36
- <input type="radio" name="<?= Settings::OPTIONS ?>[category]"
37
  value="hierarchical" <?php checked( 'hierarchical', $category ); ?>>
38
- <?php _e( 'Full category path', 'premmerce-url-manager' ) ?>
39
  </label>
40
  </th>
41
  <td>
42
- <code><?= home_url( 'parent-category/category' ) ?></code>
43
  </td>
44
  </tr>
45
  </tbody>
12
  <tr>
13
  <th>
14
  <label class="flex-label">
15
+ <input type="radio" name="<?php echo Settings::OPTIONS; ?>[category]"
16
  value="" <?php checked( '', $category ); ?>>
17
+ <?php esc_html_e( 'Use WooCommerce settings', 'premmerce-url-manager' ); ?>
18
  </label>
19
  </th>
20
  </tr>
21
  <tr>
22
  <th>
23
  <label class="flex-label">
24
+ <input type="radio" name="<?php echo Settings::OPTIONS; ?>[category]"
25
  value="slug" <?php checked( 'slug', $category ); ?>>
26
+ <?php esc_html_e( 'Category slug', 'premmerce-url-manager' ) ?>
27
  </label>
28
  </th>
29
  <td>
30
+ <code><?php echo home_url( '/category' ); ?></code>
31
  </td>
32
  </tr>
33
  <tr>
34
  <th>
35
  <label class="flex-label">
36
+ <input type="radio" name="<?php echo Settings::OPTIONS; ?>[category]"
37
  value="hierarchical" <?php checked( 'hierarchical', $category ); ?>>
38
+ <?php esc_html_e( 'Full category path', 'premmerce-url-manager' ); ?>
39
  </label>
40
  </th>
41
  <td>
42
+ <code><?php echo home_url( 'parent-category/category' ); ?></code>
43
  </td>
44
  </tr>
45
  </tbody>
views/admin/section/product.php CHANGED
@@ -12,10 +12,10 @@ use Premmerce\UrlManager\Admin\Settings;
12
  <tr>
13
  <th>
14
  <label class="flex-label">
15
- <input type="radio" name="<?=Settings::OPTIONS?>[product]"
16
- value="" <?php checked('', $product); ?>>
17
  <span>
18
- <?php _e('Use WooCommerce settings', 'premmerce-url-manager') ?>
19
  </span>
20
 
21
  </label>
@@ -24,37 +24,37 @@ use Premmerce\UrlManager\Admin\Settings;
24
  <tr>
25
  <th>
26
  <label class="flex-label">
27
- <input type="radio" name="<?=Settings::OPTIONS?>[product]"
28
- value="slug" <?php checked('slug', $product); ?>>
29
- <?php _e('Product slug', 'premmerce-url-manager') ?>
30
  </label>
31
  </th>
32
  <td>
33
- <code><?=home_url('/sample-product')?></code>
34
  </td>
35
  </tr>
36
  <tr>
37
  <th>
38
  <label class="flex-label">
39
- <input type="radio" name="<?=Settings::OPTIONS?>[product]"
40
- value="category_slug" <?php checked('category_slug', $product); ?>>
41
- <?php _e('Product slug with primary category', 'premmerce-url-manager') ?>
42
  </label>
43
  </th>
44
  <td>
45
- <code><?=home_url('/category/sample-product')?></code>
46
  </td>
47
  </tr>
48
  <tr>
49
  <th>
50
  <label class="flex-label">
51
- <input type="radio" name="<?=Settings::OPTIONS?>[product]"
52
- value="hierarchical" <?php checked('hierarchical', $product); ?>>
53
- <?php _e('Full product path', 'premmerce-url-manager') ?>
54
  </label>
55
  </th>
56
  <td>
57
- <code><?=home_url('parent-category/category/sample-product')?></code>
58
  </td>
59
  </tr>
60
  </tbody>
12
  <tr>
13
  <th>
14
  <label class="flex-label">
15
+ <input type="radio" name="<?php echo Settings::OPTIONS; ?>[product]"
16
+ value="" <?php checked( '', $product ); ?>>
17
  <span>
18
+ <?php esc_html_e( 'Use WooCommerce settings', 'premmerce-url-manager' ); ?>
19
  </span>
20
 
21
  </label>
24
  <tr>
25
  <th>
26
  <label class="flex-label">
27
+ <input type="radio" name="<?php echo Settings::OPTIONS; ?>[product]"
28
+ value="slug" <?php checked( 'slug', $product ); ?>>
29
+ <?php esc_html_e( 'Product slug', 'premmerce-url-manager' ); ?>
30
  </label>
31
  </th>
32
  <td>
33
+ <code><?php echo home_url( '/sample-product' ); ?></code>
34
  </td>
35
  </tr>
36
  <tr>
37
  <th>
38
  <label class="flex-label">
39
+ <input type="radio" name="<?php echo Settings::OPTIONS; ?>[product]"
40
+ value="category_slug" <?php checked( 'category_slug', $product ); ?>>
41
+ <?php esc_html_e( 'Product slug with primary category', 'premmerce-url-manager' ); ?>
42
  </label>
43
  </th>
44
  <td>
45
+ <code><?php echo home_url( '/category/sample-product' ); ?></code>
46
  </td>
47
  </tr>
48
  <tr>
49
  <th>
50
  <label class="flex-label">
51
+ <input type="radio" name="<?php echo Settings::OPTIONS; ?>[product]"
52
+ value="hierarchical" <?php checked( 'hierarchical', $product ); ?>>
53
+ <?php esc_html_e( 'Full product path', 'premmerce-url-manager' ); ?>
54
  </label>
55
  </th>
56
  <td>
57
+ <code><?php echo home_url( 'parent-category/category/sample-product' ); ?></code>
58
  </td>
59
  </tr>
60
  </tbody>
views/admin/section/sku.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( !defined( 'WPINC' ) ) {
4
+ die;
5
+ }
6
+ /**
7
+ * @var bool $free
8
+ * @var string $sku
9
+ * @var string $product
10
+ * @var string $productPath
11
+ */
12
+ use Premmerce\UrlManager\Admin\Settings ;
13
+ #premmerce_clear
14
+ $free = true;
15
+ #/premmerce_clear
16
+ switch ( $product ) {
17
+ case 'category_slug':
18
+ $productPath = '/category';
19
+ break;
20
+ case 'hierarchical':
21
+ $productPath = 'parent-category/category';
22
+ break;
23
+ default:
24
+ $productPath = '';
25
+ break;
26
+ }
27
+ ?>
28
+ <table class="form-table">
29
+ <tbody class="<?php
30
+ echo ( $free ? 'is-free' : '' ) ;
31
+ ?>">
32
+ <tr>
33
+ <th>
34
+ <label class="flex-label">
35
+ <input type="radio" name="<?php
36
+ echo Settings::OPTIONS ;
37
+ ?>[sku]"
38
+ value="" <?php
39
+ checked( '', $sku );
40
+ ?>>
41
+ <span>
42
+ <?php
43
+ esc_html_e( 'Use WooCommerce settings', 'premmerce-url-manager' );
44
+ ?>
45
+ </span>
46
+
47
+ </label>
48
+ </th>
49
+ </tr>
50
+ <tr>
51
+ <th>
52
+ <label class="flex-label">
53
+ <input <?php
54
+ echo ( $free ? 'disabled' : '' ) ;
55
+ ?> type="radio" name="<?php
56
+ echo Settings::OPTIONS ;
57
+ ?>[sku]"
58
+ value="sku" <?php
59
+ checked( 'sku', $sku );
60
+ ?>>
61
+ <?php
62
+ esc_html_e( 'Replace product slug', 'premmerce-url-manager' );
63
+ ?>
64
+ </label>
65
+ <p class="description">
66
+ <span class="premium-only-feature"><?php
67
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
68
+ ?></span>
69
+ </p>
70
+ </th>
71
+ <td>
72
+ <code><?php
73
+ echo home_url( $productPath . '/SKU' ) ;
74
+ ?></code>
75
+ </td>
76
+ </tr>
77
+ </tbody>
78
+ </table>
views/admin/section/suffix.php CHANGED
@@ -49,10 +49,10 @@ echo $suffix ;
49
  </label>
50
  <p class="description">
51
  <span class="premium-only-feature"><?php
52
- _e( 'Available only in premium version', 'premmerce-url-manager' );
53
  ?></span>
54
  <?php
55
- _e( 'Specify suffix for your urls. For example ', 'premmerce-url-manager' );
56
  ?> <b>.html</b>
57
  </p>
58
  </th>
@@ -71,12 +71,12 @@ echo Settings::OPTIONS ;
71
  checked( 'on', $enable_suffix_products );
72
  ?>>
73
  <?php
74
- _e( 'Enable for products', 'premmerce-url-manager' );
75
  ?>
76
  </label>
77
  <p class="description">
78
  <span class="premium-only-feature"><?php
79
- _e( 'Available only in premium version', 'premmerce-url-manager' );
80
  ?></span>
81
  <br>
82
  <?php
@@ -112,7 +112,9 @@ if ( $product == 'slug' ) {
112
  <?php
113
  echo home_url( 'parent-category/category/sample-product' ) ;
114
  ?><span
115
- class="permalink_url_suffix"></span>
 
 
116
  </code>
117
 
118
  <?php
@@ -136,12 +138,12 @@ echo Settings::OPTIONS ;
136
  checked( 'on', $enable_suffix_categories );
137
  ?>>
138
  <?php
139
- _e( 'Enable for categories', 'premmerce-url-manager' );
140
  ?>
141
  </label>
142
  <p class="description">
143
  <span class="premium-only-feature"><?php
144
- _e( 'Available only in premium version', 'premmerce-url-manager' );
145
  ?></span>
146
  <br>
147
  <?php
49
  </label>
50
  <p class="description">
51
  <span class="premium-only-feature"><?php
52
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
53
  ?></span>
54
  <?php
55
+ esc_html_e( 'Specify suffix for your urls. For example ', 'premmerce-url-manager' );
56
  ?> <b>.html</b>
57
  </p>
58
  </th>
71
  checked( 'on', $enable_suffix_products );
72
  ?>>
73
  <?php
74
+ esc_html_e( 'Enable for products', 'premmerce-url-manager' );
75
  ?>
76
  </label>
77
  <p class="description">
78
  <span class="premium-only-feature"><?php
79
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
80
  ?></span>
81
  <br>
82
  <?php
112
  <?php
113
  echo home_url( 'parent-category/category/sample-product' ) ;
114
  ?><span
115
+ class="permalink_url_suffix"><?php
116
+ echo $suffix ;
117
+ ?></span>
118
  </code>
119
 
120
  <?php
138
  checked( 'on', $enable_suffix_categories );
139
  ?>>
140
  <?php
141
+ esc_html_e( 'Enable for categories', 'premmerce-url-manager' );
142
  ?>
143
  </label>
144
  <p class="description">
145
  <span class="premium-only-feature"><?php
146
+ esc_html_e( 'Available only in premium version', 'premmerce-url-manager' );
147
  ?></span>
148
  <br>
149
  <?php
views/admin/tabs/settings.php CHANGED
@@ -7,7 +7,7 @@ if ( ! defined('WPINC')) {
7
  ?>
8
 
9
  <p>
10
- <?php _e('WooCommerce Permalink Manager offers you the ability to create a custom URL structure for your permalinks. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A number of settings are available, and here are some examples to get you started.',
11
  'premmerce-url-manager'); ?>
12
  </p>
13
  <?php $settings->show(); ?>
7
  ?>
8
 
9
  <p>
10
+ <?php esc_html_e('WooCommerce Permalink Manager offers you the ability to create a custom URL structure for your permalinks. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A number of settings are available, and here are some examples to get you started.',
11
  'premmerce-url-manager'); ?>
12
  </p>
13
  <?php $settings->show(); ?>