Version Description
- Css fix for gutenberg compatibility
Download this release
Release Info
Developer | Dudo |
Plugin | Yasr – Yet Another Stars Rating |
Version | 1.6.7 |
Comparing to | |
See all releases |
Code changes from version 1.6.6 to 1.6.7
- css/yasr-admin.css +16 -5
- freemius/assets/css/admin/common.css +1 -1
- freemius/assets/scss/admin/common.scss +1 -1
- freemius/includes/class-freemius.php +209 -62
- freemius/includes/class-fs-plugin-updater.php +179 -2
- freemius/includes/customizer/class-fs-customizer-upsell-control.php +1 -1
- freemius/includes/entities/class-fs-site.php +4 -1
- freemius/includes/fs-plugin-info-dialog.php +12 -9
- freemius/package.json +1 -1
- freemius/start.php +1 -1
- freemius/templates/account/partials/addon.php +2 -2
- freemius/templates/add-ons.php +5 -1
- freemius/templates/checkout.php +2 -2
- freemius/templates/connect.php +16 -2
- freemius/templates/contact.php +1 -1
- freemius/templates/debug.php +10 -0
- freemius/templates/forms/deactivation/form.php +1 -1
- freemius/templates/pricing.php +1 -1
- freemius/templates/tabs.php +5 -1
- readme.txt +6 -2
- yet-another-stars-rating.php +2 -2
css/yasr-admin.css
CHANGED
@@ -264,9 +264,18 @@ div.bigstars .rateit-selected
|
|
264 |
transition: margin 0.3s ease-in 0s;
|
265 |
}
|
266 |
.yasr-onoffswitch-inner:before, .yasr-onoffswitch-inner:after {
|
267 |
-
display: block;
|
268 |
-
|
269 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
}
|
271 |
.yasr-onoffswitch-inner:before {
|
272 |
content: "YES";
|
@@ -280,12 +289,14 @@ div.bigstars .rateit-selected
|
|
280 |
text-align: right;
|
281 |
}
|
282 |
.yasr-onoffswitch-switch {
|
283 |
-
display: block;
|
|
|
|
|
284 |
background: #A1A1A1;
|
285 |
position: absolute; top: 0; bottom: 0;
|
286 |
right: 51px;
|
287 |
border: 2px solid #FFFFFF; border-radius: 35px;
|
288 |
-
transition: all 0.
|
289 |
}
|
290 |
|
291 |
.yasr-onoffswitch-checkbox:checked + .yasr-onoffswitch-label .yasr-onoffswitch-inner {
|
264 |
transition: margin 0.3s ease-in 0s;
|
265 |
}
|
266 |
.yasr-onoffswitch-inner:before, .yasr-onoffswitch-inner:after {
|
267 |
+
display: block;
|
268 |
+
float: left;
|
269 |
+
width: 50%;
|
270 |
+
height: 30px;
|
271 |
+
padding: 0;
|
272 |
+
line-height: 30px;
|
273 |
+
font-size: 18px;
|
274 |
+
color: white;
|
275 |
+
font-family: Trebuchet, Arial, sans-serif;
|
276 |
+
font-weight: bold;
|
277 |
+
box-sizing: border-box !important; /*important for Gutenberg compatibility*/
|
278 |
+
|
279 |
}
|
280 |
.yasr-onoffswitch-inner:before {
|
281 |
content: "YES";
|
289 |
text-align: right;
|
290 |
}
|
291 |
.yasr-onoffswitch-switch {
|
292 |
+
display: block;
|
293 |
+
width: 30px;
|
294 |
+
margin: 0px;
|
295 |
background: #A1A1A1;
|
296 |
position: absolute; top: 0; bottom: 0;
|
297 |
right: 51px;
|
298 |
border: 2px solid #FFFFFF; border-radius: 35px;
|
299 |
+
transition: all 0.1s ease-in 0s;
|
300 |
}
|
301 |
|
302 |
.yasr-onoffswitch-checkbox:checked + .yasr-onoffswitch-label .yasr-onoffswitch-inner {
|
freemius/assets/css/admin/common.css
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
.theme-browser .theme .fs-premium-theme-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;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);font-size:1.1em}#iframe{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media (max-width: 600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}}
|
2 |
-
.fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,0.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,0.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,0.3);box-shadow:0 2px 2px rgba(6,113,6,0.3);opacity:0.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 500px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:greenyellow}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("
|
1 |
.theme-browser .theme .fs-premium-theme-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;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);font-size:1.1em}#iframe{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media (max-width: 600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}}
|
2 |
+
.fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,0.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,0.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,0.3);box-shadow:0 2px 2px rgba(6,113,6,0.3);opacity:0.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 500px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:greenyellow}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("/wp-admin/images/wpspin_light-2x.gif");background-size:contain}.wrap.fs-section h2{text-align:left}
|
freemius/assets/scss/admin/common.scss
CHANGED
@@ -207,7 +207,7 @@ span.fs-submenu-item.fs-sub:before
|
|
207 |
margin-right: 5px;
|
208 |
vertical-align: sub;
|
209 |
display: inline-block;
|
210 |
-
background: url('
|
211 |
background-size: contain;
|
212 |
}
|
213 |
|
207 |
margin-right: 5px;
|
208 |
vertical-align: sub;
|
209 |
display: inline-block;
|
210 |
+
background: url('/wp-admin/images/wpspin_light-2x.gif');
|
211 |
background-size: contain;
|
212 |
}
|
213 |
|
freemius/includes/class-freemius.php
CHANGED
@@ -1348,7 +1348,10 @@
|
|
1348 |
add_action( 'make_ham_blog', array( &$this, '_after_site_reactivated_callback' ) );
|
1349 |
}
|
1350 |
|
1351 |
-
if ( $this->is_theme() &&
|
|
|
|
|
|
|
1352 |
// Register customizer upsell.
|
1353 |
add_action( 'customize_register', array( &$this, '_customizer_register' ) );
|
1354 |
}
|
@@ -1488,13 +1491,6 @@
|
|
1488 |
array( &$this, '_submit_uninstall_reason_action' )
|
1489 |
);
|
1490 |
|
1491 |
-
if ( $this->is_theme() && $this->is_premium() && ! $this->has_active_valid_license() ) {
|
1492 |
-
$this->add_ajax_action(
|
1493 |
-
'delete_theme_update_data',
|
1494 |
-
array( &$this, '_delete_theme_update_data_action' )
|
1495 |
-
);
|
1496 |
-
}
|
1497 |
-
|
1498 |
if ( ! $this->is_addon() || $this->is_parent_plugin_installed() ) {
|
1499 |
if ( ( $this->is_plugin() && self::is_plugins_page() ) ||
|
1500 |
( $this->is_theme() && self::is_themes_page() )
|
@@ -2634,26 +2630,28 @@
|
|
2634 |
self::$_accounts = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true );
|
2635 |
|
2636 |
if ( is_multisite() ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2637 |
/**
|
2638 |
-
* If the
|
2639 |
* network level storage, it means that we need to process the storage with migration.
|
2640 |
*
|
2641 |
-
* The code in this `if` scope will only be executed once and only for the first site that will execute it because once we migrate the storage data,
|
2642 |
*
|
2643 |
* @author Vova Feldman (@svovaf)
|
2644 |
* @since 2.0.0
|
2645 |
*/
|
2646 |
-
if (
|
2647 |
-
|
|
|
|
|
2648 |
) {
|
2649 |
-
self::
|
2650 |
-
|
2651 |
-
// Migrate API options from site level to network level.
|
2652 |
-
$api_network_options = FS_Option_Manager::get_manager( WP_FS__OPTIONS_OPTION_NAME, true, true );
|
2653 |
-
$api_network_options->migrate_to_network();
|
2654 |
-
|
2655 |
-
// Migrate API cache to network level storage.
|
2656 |
-
FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME )->migrate_to_network();
|
2657 |
}
|
2658 |
}
|
2659 |
|
@@ -2683,6 +2681,24 @@
|
|
2683 |
self::$_statics_loaded = true;
|
2684 |
}
|
2685 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2686 |
#----------------------------------------------------------------------------------
|
2687 |
#region Localization
|
2688 |
#----------------------------------------------------------------------------------
|
@@ -2909,6 +2925,10 @@
|
|
2909 |
}
|
2910 |
|
2911 |
fs_redirect( $download_url );
|
|
|
|
|
|
|
|
|
2912 |
}
|
2913 |
}
|
2914 |
|
@@ -3961,6 +3981,13 @@
|
|
3961 |
|
3962 |
$this->parse_settings( $plugin_info );
|
3963 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3964 |
if ( ! self::is_ajax() ) {
|
3965 |
if ( ! $this->is_addon() || $this->is_only_premium() ) {
|
3966 |
add_action(
|
@@ -5984,7 +6011,7 @@
|
|
5984 |
* @param int $except_blog_id Since 2.0.0 when running in a multisite network environment, the cron execution is consolidated. This param allows excluding excluded specified blog ID from being the cron executor.
|
5985 |
*/
|
5986 |
private function schedule_install_sync( $except_blog_id = 0 ) {
|
5987 |
-
$this->schedule_cron( 'install_sync', 'install_sync', 'single',
|
5988 |
}
|
5989 |
|
5990 |
/**
|
@@ -6192,19 +6219,21 @@
|
|
6192 |
}
|
6193 |
|
6194 |
if ( $this->is_plugin_new_install() || $this->is_only_premium() ) {
|
6195 |
-
|
6196 |
-
|
6197 |
-
|
6198 |
-
|
6199 |
-
|
6200 |
-
|
6201 |
-
|
6202 |
-
|
6203 |
-
|
6204 |
-
|
6205 |
-
|
6206 |
-
|
6207 |
-
|
|
|
|
|
6208 |
} else {
|
6209 |
if ( $this->should_add_sticky_optin_notice() ) {
|
6210 |
$this->add_sticky_optin_admin_notice();
|
@@ -10569,7 +10598,7 @@
|
|
10569 |
return;
|
10570 |
}
|
10571 |
|
10572 |
-
if ( ! $this->is_premium() || $this->
|
10573 |
// This is relevant only to the free versions and premium versions without an active license.
|
10574 |
return;
|
10575 |
}
|
@@ -14756,13 +14785,15 @@
|
|
14756 |
private function add_submenu_items() {
|
14757 |
$this->_logger->entrance();
|
14758 |
|
|
|
|
|
14759 |
if ( $this->is_addon() ) {
|
14760 |
// No submenu items for add-ons.
|
14761 |
$add_submenu_items = false;
|
14762 |
} else if ( $this->is_free_wp_org_theme() && ! fs_is_network_admin() ) {
|
14763 |
// Also add submenu items when running in a free .org theme so the tabs will be visible.
|
14764 |
$add_submenu_items = true;
|
14765 |
-
} else if ( $
|
14766 |
$add_submenu_items = false;
|
14767 |
} else if ( fs_is_network_admin() ) {
|
14768 |
/**
|
@@ -14793,7 +14824,15 @@
|
|
14793 |
$this->is_submenu_item_visible( 'affiliation' )
|
14794 |
);
|
14795 |
}
|
|
|
14796 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14797 |
if ( ! WP_FS__DEMO_MODE && $this->is_registered() ) {
|
14798 |
$show_account = (
|
14799 |
$this->is_submenu_item_visible( 'account' ) &&
|
@@ -14812,10 +14851,12 @@
|
|
14812 |
'account',
|
14813 |
array( &$this, '_account_page_load' ),
|
14814 |
WP_FS__DEFAULT_PRIORITY,
|
14815 |
-
$show_account
|
14816 |
);
|
14817 |
}
|
|
|
14818 |
|
|
|
14819 |
// Add contact page.
|
14820 |
$this->add_submenu_item(
|
14821 |
$this->get_text_inline( 'Contact Us', 'contact-us' ),
|
@@ -14840,7 +14881,11 @@
|
|
14840 |
$this->is_submenu_item_visible( 'addons' )
|
14841 |
);
|
14842 |
}
|
|
|
14843 |
|
|
|
|
|
|
|
14844 |
if ( ! WP_FS__DEMO_MODE ) {
|
14845 |
$show_pricing = (
|
14846 |
$this->is_submenu_item_visible( 'pricing' ) &&
|
@@ -14862,14 +14907,14 @@
|
|
14862 |
|
14863 |
// Add upgrade/pricing page.
|
14864 |
$this->add_submenu_item(
|
14865 |
-
$pricing_cta_text . ' ' . ( is_rtl() ? '←' : '➤' ),
|
14866 |
array( &$this, '_pricing_page_render' ),
|
14867 |
$this->get_plugin_name() . ' – ' . $this->get_text_x_inline( 'Pricing', 'noun', 'pricing' ),
|
14868 |
'manage_options',
|
14869 |
'pricing',
|
14870 |
'Freemius::_clean_admin_content_section',
|
14871 |
WP_FS__LOWEST_PRIORITY,
|
14872 |
-
$show_pricing,
|
14873 |
$pricing_class
|
14874 |
);
|
14875 |
}
|
@@ -15569,7 +15614,8 @@
|
|
15569 |
return;
|
15570 |
}
|
15571 |
|
15572 |
-
$
|
|
|
15573 |
|
15574 |
$sites = self::get_all_sites( $this->_module_type, $network_level_or_blog_id );
|
15575 |
|
@@ -15937,7 +15983,7 @@
|
|
15937 |
/**
|
15938 |
* @since 1.2.3 When running in DEV mode, retrieve pending plans as well.
|
15939 |
*/
|
15940 |
-
$result = $api->get( "/plugins/{$this->_module_id}/plans.json
|
15941 |
|
15942 |
if ( $this->is_api_result_object( $result, 'plans' ) && is_array( $result->plans ) ) {
|
15943 |
for ( $i = 0, $len = count( $result->plans ); $i < $len; $i ++ ) {
|
@@ -16267,14 +16313,62 @@
|
|
16267 |
* @since 1.2.1
|
16268 |
*/
|
16269 |
function has_active_valid_license() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16270 |
return (
|
16271 |
-
is_object( $
|
16272 |
-
|
16273 |
-
$
|
16274 |
-
$
|
16275 |
);
|
16276 |
}
|
16277 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16278 |
/**
|
16279 |
* Check if site assigned with license with enabled features.
|
16280 |
*
|
@@ -16405,7 +16499,7 @@
|
|
16405 |
$this->_update_licenses( $licenses, $addon->id );
|
16406 |
|
16407 |
if ( ! $this->is_addon_installed( $addon->id ) && FS_License_Manager::has_premium_license( $licenses ) ) {
|
16408 |
-
$plans_result = $this->get_api_site_or_plugin_scope()->get( "/addons/{$addon_id}/plans.json" );
|
16409 |
|
16410 |
if ( ! isset( $plans_result->error ) ) {
|
16411 |
$plans = array();
|
@@ -16733,6 +16827,7 @@
|
|
16733 |
'trial_promotion',
|
16734 |
'trial_expired',
|
16735 |
'activation_complete',
|
|
|
16736 |
) );
|
16737 |
break;
|
16738 |
case 'changed':
|
@@ -17267,7 +17362,7 @@
|
|
17267 |
* @return bool
|
17268 |
*/
|
17269 |
private function _can_download_premium() {
|
17270 |
-
return $this->
|
17271 |
( $this->is_trial() && ! $this->get_trial_plan()->is_free() );
|
17272 |
}
|
17273 |
|
@@ -17570,19 +17665,21 @@
|
|
17570 |
|
17571 |
$api = $this->get_api_site_or_plugin_scope();
|
17572 |
|
|
|
|
|
17573 |
/**
|
17574 |
* @since 1.2.1
|
17575 |
*
|
17576 |
* If there's a cached version of the add-ons and not asking
|
17577 |
* for a flush, just use the currently stored add-ons.
|
17578 |
*/
|
17579 |
-
if ( ! $flush && $api->is_cached(
|
17580 |
$addons = self::get_all_addons();
|
17581 |
|
17582 |
return $addons[ $this->_plugin->id ];
|
17583 |
}
|
17584 |
|
17585 |
-
$result = $api->get(
|
17586 |
|
17587 |
$addons = array();
|
17588 |
if ( $this->is_api_result_object( $result, 'plugins' ) &&
|
@@ -18398,9 +18495,9 @@
|
|
18398 |
$vars = array( 'id' => $this->_module_id );
|
18399 |
|
18400 |
if ( 'true' === fs_request_get( 'checkout', false ) ) {
|
18401 |
-
|
18402 |
} else {
|
18403 |
-
|
18404 |
}
|
18405 |
}
|
18406 |
|
@@ -18418,7 +18515,15 @@
|
|
18418 |
$this->_logger->entrance();
|
18419 |
|
18420 |
$vars = array( 'id' => $this->_module_id );
|
18421 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18422 |
}
|
18423 |
|
18424 |
#endregion ------------------------------------------------------------------------
|
@@ -18515,7 +18620,9 @@
|
|
18515 |
* @return FS_Api
|
18516 |
*/
|
18517 |
private function get_current_or_network_user_api_scope( $flush = false ) {
|
18518 |
-
if ( ! $this->_is_network_active ||
|
|
|
|
|
18519 |
return $this->get_api_user_scope( $flush );
|
18520 |
}
|
18521 |
|
@@ -18603,9 +18710,19 @@
|
|
18603 |
* @author Vova Feldman (@svovaf)
|
18604 |
* @since 1.0.9
|
18605 |
*
|
18606 |
-
* @param $plans
|
18607 |
*/
|
18608 |
function _check_for_trial_plans( $plans ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18609 |
$this->_storage->has_trial_plan = FS_Plan_Manager::instance()->has_trial_plan( $plans );
|
18610 |
}
|
18611 |
|
@@ -18712,14 +18829,14 @@
|
|
18712 |
|
18713 |
// Show promotion if never shown before and 24 hours after initial activation with FS.
|
18714 |
if ( ! $was_promotion_shown_before &&
|
18715 |
-
$this->_storage->install_timestamp > ( time() - WP_FS__TIME_24_HOURS_IN_SEC )
|
18716 |
) {
|
18717 |
return false;
|
18718 |
}
|
18719 |
|
18720 |
// OR if promotion was shown before, try showing it every 30 days.
|
18721 |
if ( $was_promotion_shown_before &&
|
18722 |
-
30 * WP_FS__TIME_24_HOURS_IN_SEC > time() - $last_time_trial_promotion_shown
|
18723 |
) {
|
18724 |
return false;
|
18725 |
}
|
@@ -19344,14 +19461,16 @@
|
|
19344 |
* @param array $request
|
19345 |
* @param int $success_cache_expiration
|
19346 |
* @param int $failure_cache_expiration
|
|
|
19347 |
*
|
19348 |
* @return WP_Error|array
|
19349 |
*/
|
19350 |
-
|
19351 |
&$url,
|
19352 |
$request,
|
19353 |
$success_cache_expiration = 0,
|
19354 |
-
$failure_cache_expiration = 0
|
|
|
19355 |
) {
|
19356 |
$should_cache = ($success_cache_expiration + $failure_cache_expiration > 0);
|
19357 |
|
@@ -19362,7 +19481,9 @@
|
|
19362 |
false;
|
19363 |
|
19364 |
if ( false === $response ) {
|
19365 |
-
|
|
|
|
|
19366 |
|
19367 |
$response = wp_remote_post( $url, $request );
|
19368 |
|
@@ -20117,6 +20238,10 @@
|
|
20117 |
$icon_found = false;
|
20118 |
$local_path = fs_normalize_path( "{$img_dir}/{$this->_slug}.png" );
|
20119 |
|
|
|
|
|
|
|
|
|
20120 |
$have_write_permissions = ( 'direct' === get_filesystem_method( array(), fs_normalize_path( $img_dir ) ) );
|
20121 |
|
20122 |
/**
|
@@ -20633,9 +20758,7 @@
|
|
20633 |
* @since 2.1.0
|
20634 |
*/
|
20635 |
function _maybe_add_gdpr_optin_ajax_handler() {
|
20636 |
-
|
20637 |
-
$this->add_ajax_action( 'fetch_is_marketing_required_flag_value', array( &$this, '_fetch_is_marketing_required_flag_value_ajax_action' ) );
|
20638 |
-
}
|
20639 |
|
20640 |
if ( FS_GDPR_Manager::instance()->is_opt_in_notice_shown() ) {
|
20641 |
$this->add_gdpr_optin_ajax_handler_and_style();
|
@@ -20819,4 +20942,28 @@
|
|
20819 |
}
|
20820 |
|
20821 |
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20822 |
}
|
1348 |
add_action( 'make_ham_blog', array( &$this, '_after_site_reactivated_callback' ) );
|
1349 |
}
|
1350 |
|
1351 |
+
if ( $this->is_theme() &&
|
1352 |
+
self::is_customizer() &&
|
1353 |
+
$this->apply_filters( 'show_customizer_upsell', true )
|
1354 |
+
) {
|
1355 |
// Register customizer upsell.
|
1356 |
add_action( 'customize_register', array( &$this, '_customizer_register' ) );
|
1357 |
}
|
1491 |
array( &$this, '_submit_uninstall_reason_action' )
|
1492 |
);
|
1493 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1494 |
if ( ! $this->is_addon() || $this->is_parent_plugin_installed() ) {
|
1495 |
if ( ( $this->is_plugin() && self::is_plugins_page() ) ||
|
1496 |
( $this->is_theme() && self::is_themes_page() )
|
2630 |
self::$_accounts = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true );
|
2631 |
|
2632 |
if ( is_multisite() ) {
|
2633 |
+
$has_skipped_migration = (
|
2634 |
+
// 'id_slug_type_path_map' - was never stored on older versions, therefore, not exists on the site level.
|
2635 |
+
null === self::$_accounts->get_option( 'id_slug_type_path_map', null, false ) &&
|
2636 |
+
// 'file_slug_map' stored on the site level, so it was running an SDK version before it was integrated with MS-network.
|
2637 |
+
null !== self::$_accounts->get_option( 'file_slug_map', null, false )
|
2638 |
+
);
|
2639 |
+
|
2640 |
/**
|
2641 |
+
* If the file_slug_map exists on the site level but doesn't exist on the
|
2642 |
* network level storage, it means that we need to process the storage with migration.
|
2643 |
*
|
2644 |
+
* The code in this `if` scope will only be executed once and only for the first site that will execute it because once we migrate the storage data, file_slug_map will be already set in the network level storage.
|
2645 |
*
|
2646 |
* @author Vova Feldman (@svovaf)
|
2647 |
* @since 2.0.0
|
2648 |
*/
|
2649 |
+
if (
|
2650 |
+
( $has_skipped_migration && true !== self::$_accounts->get_option( 'ms_migration_complete', false, true ) ) ||
|
2651 |
+
( null === self::$_accounts->get_option( 'file_slug_map', null, true ) &&
|
2652 |
+
null !== self::$_accounts->get_option( 'file_slug_map', null, false ) )
|
2653 |
) {
|
2654 |
+
self::migrate_options_to_network();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2655 |
}
|
2656 |
}
|
2657 |
|
2681 |
self::$_statics_loaded = true;
|
2682 |
}
|
2683 |
|
2684 |
+
/**
|
2685 |
+
* @author Leo Fajardo (@leorw)
|
2686 |
+
*
|
2687 |
+
* @since 2.1.3
|
2688 |
+
*/
|
2689 |
+
private static function migrate_options_to_network() {
|
2690 |
+
self::migrate_accounts_to_network();
|
2691 |
+
|
2692 |
+
// Migrate API options from site level to network level.
|
2693 |
+
$api_network_options = FS_Option_Manager::get_manager( WP_FS__OPTIONS_OPTION_NAME, true, true );
|
2694 |
+
$api_network_options->migrate_to_network();
|
2695 |
+
|
2696 |
+
// Migrate API cache to network level storage.
|
2697 |
+
FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME )->migrate_to_network();
|
2698 |
+
|
2699 |
+
self::$_accounts->set_option( 'ms_migration_complete', true, true );
|
2700 |
+
}
|
2701 |
+
|
2702 |
#----------------------------------------------------------------------------------
|
2703 |
#region Localization
|
2704 |
#----------------------------------------------------------------------------------
|
2925 |
}
|
2926 |
|
2927 |
fs_redirect( $download_url );
|
2928 |
+
} else if ( fs_request_is_action( 'migrate_options_to_network' ) ) {
|
2929 |
+
check_admin_referer( 'migrate_options_to_network' );
|
2930 |
+
|
2931 |
+
self::migrate_options_to_network();
|
2932 |
}
|
2933 |
}
|
2934 |
|
3981 |
|
3982 |
$this->parse_settings( $plugin_info );
|
3983 |
|
3984 |
+
if ( is_admin() && $this->is_theme() && $this->is_premium() && ! $this->has_active_valid_license() ) {
|
3985 |
+
$this->add_ajax_action(
|
3986 |
+
'delete_theme_update_data',
|
3987 |
+
array( &$this, '_delete_theme_update_data_action' )
|
3988 |
+
);
|
3989 |
+
}
|
3990 |
+
|
3991 |
if ( ! self::is_ajax() ) {
|
3992 |
if ( ! $this->is_addon() || $this->is_only_premium() ) {
|
3993 |
add_action(
|
6011 |
* @param int $except_blog_id Since 2.0.0 when running in a multisite network environment, the cron execution is consolidated. This param allows excluding excluded specified blog ID from being the cron executor.
|
6012 |
*/
|
6013 |
private function schedule_install_sync( $except_blog_id = 0 ) {
|
6014 |
+
$this->schedule_cron( 'install_sync', 'install_sync', 'single', WP_FS__SCRIPT_START_TIME, false, $except_blog_id );
|
6015 |
}
|
6016 |
|
6017 |
/**
|
6219 |
}
|
6220 |
|
6221 |
if ( $this->is_plugin_new_install() || $this->is_only_premium() ) {
|
6222 |
+
if ( ! $this->_anonymous_mode ) {
|
6223 |
+
// Show notice for new plugin installations.
|
6224 |
+
$this->_admin_notices->add(
|
6225 |
+
sprintf(
|
6226 |
+
$this->get_text_inline( 'You are just one step away - %s', 'you-are-step-away' ),
|
6227 |
+
sprintf( '<b><a href="%s">%s</a></b>',
|
6228 |
+
$this->get_activation_url( array(), ! $this->is_delegated_connection() ),
|
6229 |
+
sprintf( $this->get_text_x_inline( 'Complete "%s" Activation Now',
|
6230 |
+
'%s - plugin name. As complete "PluginX" activation now', 'activate-x-now' ), $this->get_plugin_name() )
|
6231 |
+
)
|
6232 |
+
),
|
6233 |
+
'',
|
6234 |
+
'update-nag'
|
6235 |
+
);
|
6236 |
+
}
|
6237 |
} else {
|
6238 |
if ( $this->should_add_sticky_optin_notice() ) {
|
6239 |
$this->add_sticky_optin_admin_notice();
|
10598 |
return;
|
10599 |
}
|
10600 |
|
10601 |
+
if ( ! $this->is_premium() || $this->has_any_active_valid_license() ) {
|
10602 |
// This is relevant only to the free versions and premium versions without an active license.
|
10603 |
return;
|
10604 |
}
|
14785 |
private function add_submenu_items() {
|
14786 |
$this->_logger->entrance();
|
14787 |
|
14788 |
+
$is_activation_mode = $this->is_activation_mode();
|
14789 |
+
|
14790 |
if ( $this->is_addon() ) {
|
14791 |
// No submenu items for add-ons.
|
14792 |
$add_submenu_items = false;
|
14793 |
} else if ( $this->is_free_wp_org_theme() && ! fs_is_network_admin() ) {
|
14794 |
// Also add submenu items when running in a free .org theme so the tabs will be visible.
|
14795 |
$add_submenu_items = true;
|
14796 |
+
} else if ( $is_activation_mode && ! $this->is_free_wp_org_theme() ) {
|
14797 |
$add_submenu_items = false;
|
14798 |
} else if ( fs_is_network_admin() ) {
|
14799 |
/**
|
14824 |
$this->is_submenu_item_visible( 'affiliation' )
|
14825 |
);
|
14826 |
}
|
14827 |
+
}
|
14828 |
|
14829 |
+
if ( $add_submenu_items ||
|
14830 |
+
( $is_activation_mode &&
|
14831 |
+
$this->is_only_premium() &&
|
14832 |
+
$this->is_admin_page( 'account' ) &&
|
14833 |
+
fs_request_is_action( $this->get_unique_affix() . '_sync_license' )
|
14834 |
+
)
|
14835 |
+
) {
|
14836 |
if ( ! WP_FS__DEMO_MODE && $this->is_registered() ) {
|
14837 |
$show_account = (
|
14838 |
$this->is_submenu_item_visible( 'account' ) &&
|
14851 |
'account',
|
14852 |
array( &$this, '_account_page_load' ),
|
14853 |
WP_FS__DEFAULT_PRIORITY,
|
14854 |
+
( $add_submenu_items && $show_account )
|
14855 |
);
|
14856 |
}
|
14857 |
+
}
|
14858 |
|
14859 |
+
if ( $add_submenu_items ) {
|
14860 |
// Add contact page.
|
14861 |
$this->add_submenu_item(
|
14862 |
$this->get_text_inline( 'Contact Us', 'contact-us' ),
|
14881 |
$this->is_submenu_item_visible( 'addons' )
|
14882 |
);
|
14883 |
}
|
14884 |
+
}
|
14885 |
|
14886 |
+
if ( $add_submenu_items ||
|
14887 |
+
( $is_activation_mode && $this->is_only_premium() && $this->is_admin_page( 'pricing' ) )
|
14888 |
+
) {
|
14889 |
if ( ! WP_FS__DEMO_MODE ) {
|
14890 |
$show_pricing = (
|
14891 |
$this->is_submenu_item_visible( 'pricing' ) &&
|
14907 |
|
14908 |
// Add upgrade/pricing page.
|
14909 |
$this->add_submenu_item(
|
14910 |
+
$pricing_cta_text . ' ' . ( is_rtl() ? $this->get_text_x_inline( '←', 'ASCII arrow left icon', 'symbol_arrow-left' ) : $this->get_text_x_inline( '➤', 'ASCII arrow right icon', 'symbol_arrow-right' ) ),
|
14911 |
array( &$this, '_pricing_page_render' ),
|
14912 |
$this->get_plugin_name() . ' – ' . $this->get_text_x_inline( 'Pricing', 'noun', 'pricing' ),
|
14913 |
'manage_options',
|
14914 |
'pricing',
|
14915 |
'Freemius::_clean_admin_content_section',
|
14916 |
WP_FS__LOWEST_PRIORITY,
|
14917 |
+
( $add_submenu_items && $show_pricing ),
|
14918 |
$pricing_class
|
14919 |
);
|
14920 |
}
|
15614 |
return;
|
15615 |
}
|
15616 |
|
15617 |
+
$site_clone = is_object( $site ) ? $site : $this->_site;
|
15618 |
+
$encrypted_site = clone $site_clone;
|
15619 |
|
15620 |
$sites = self::get_all_sites( $this->_module_type, $network_level_or_blog_id );
|
15621 |
|
15983 |
/**
|
15984 |
* @since 1.2.3 When running in DEV mode, retrieve pending plans as well.
|
15985 |
*/
|
15986 |
+
$result = $api->get( $this->add_show_pending( "/plugins/{$this->_module_id}/plans.json" ), true );
|
15987 |
|
15988 |
if ( $this->is_api_result_object( $result, 'plans' ) && is_array( $result->plans ) ) {
|
15989 |
for ( $i = 0, $len = count( $result->plans ); $i < $len; $i ++ ) {
|
16313 |
* @since 1.2.1
|
16314 |
*/
|
16315 |
function has_active_valid_license() {
|
16316 |
+
return self::is_active_valid_license( $this->_license );
|
16317 |
+
}
|
16318 |
+
|
16319 |
+
/**
|
16320 |
+
* Check if a given license is active & valid (not expired).
|
16321 |
+
*
|
16322 |
+
* @author Vova Feldman (@svovaf)
|
16323 |
+
* @since 2.1.3
|
16324 |
+
*
|
16325 |
+
* @param FS_Plugin_License $license
|
16326 |
+
*
|
16327 |
+
* @return bool
|
16328 |
+
*/
|
16329 |
+
private static function is_active_valid_license( $license ) {
|
16330 |
return (
|
16331 |
+
is_object( $license ) &&
|
16332 |
+
FS_Plugin_License::is_valid_id( $license->id ) &&
|
16333 |
+
$license->is_active() &&
|
16334 |
+
$license->is_valid()
|
16335 |
);
|
16336 |
}
|
16337 |
|
16338 |
+
/**
|
16339 |
+
* Checks if there's any site that is associated with an active & valid license.
|
16340 |
+
* This logic is used to determine if the admin can download the premium code base from a network level admin.
|
16341 |
+
*
|
16342 |
+
* @author Vova Feldman (@svovaf)
|
16343 |
+
* @since 2.1.3
|
16344 |
+
*
|
16345 |
+
* @return bool
|
16346 |
+
*/
|
16347 |
+
function has_any_active_valid_license() {
|
16348 |
+
if ( ! fs_is_network_admin() ) {
|
16349 |
+
return $this->has_active_valid_license();
|
16350 |
+
}
|
16351 |
+
|
16352 |
+
$installs = $this->get_blog_install_map();
|
16353 |
+
$all_plugin_licenses = self::get_all_licenses( $this->_module_id );
|
16354 |
+
|
16355 |
+
foreach ( $installs as $blog_id => $install ) {
|
16356 |
+
if ( ! FS_Plugin_License::is_valid_id( $install->license_id ) ) {
|
16357 |
+
continue;
|
16358 |
+
}
|
16359 |
+
|
16360 |
+
foreach ( $all_plugin_licenses as $license ) {
|
16361 |
+
if ( $license->id == $install->license_id ) {
|
16362 |
+
if ( self::is_active_valid_license( $license ) ) {
|
16363 |
+
return true;
|
16364 |
+
}
|
16365 |
+
}
|
16366 |
+
}
|
16367 |
+
}
|
16368 |
+
|
16369 |
+
return false;
|
16370 |
+
}
|
16371 |
+
|
16372 |
/**
|
16373 |
* Check if site assigned with license with enabled features.
|
16374 |
*
|
16499 |
$this->_update_licenses( $licenses, $addon->id );
|
16500 |
|
16501 |
if ( ! $this->is_addon_installed( $addon->id ) && FS_License_Manager::has_premium_license( $licenses ) ) {
|
16502 |
+
$plans_result = $this->get_api_site_or_plugin_scope()->get( $this->add_show_pending( "/addons/{$addon_id}/plans.json" ) );
|
16503 |
|
16504 |
if ( ! isset( $plans_result->error ) ) {
|
16505 |
$plans = array();
|
16827 |
'trial_promotion',
|
16828 |
'trial_expired',
|
16829 |
'activation_complete',
|
16830 |
+
'license_expired',
|
16831 |
) );
|
16832 |
break;
|
16833 |
case 'changed':
|
17362 |
* @return bool
|
17363 |
*/
|
17364 |
private function _can_download_premium() {
|
17365 |
+
return $this->has_any_active_valid_license() ||
|
17366 |
( $this->is_trial() && ! $this->get_trial_plan()->is_free() );
|
17367 |
}
|
17368 |
|
17665 |
|
17666 |
$api = $this->get_api_site_or_plugin_scope();
|
17667 |
|
17668 |
+
$path = $this->add_show_pending( '/addons.json?enriched=true' );
|
17669 |
+
|
17670 |
/**
|
17671 |
* @since 1.2.1
|
17672 |
*
|
17673 |
* If there's a cached version of the add-ons and not asking
|
17674 |
* for a flush, just use the currently stored add-ons.
|
17675 |
*/
|
17676 |
+
if ( ! $flush && $api->is_cached( $path ) ) {
|
17677 |
$addons = self::get_all_addons();
|
17678 |
|
17679 |
return $addons[ $this->_plugin->id ];
|
17680 |
}
|
17681 |
|
17682 |
+
$result = $api->get( $path, $flush );
|
17683 |
|
17684 |
$addons = array();
|
17685 |
if ( $this->is_api_result_object( $result, 'plugins' ) &&
|
18495 |
$vars = array( 'id' => $this->_module_id );
|
18496 |
|
18497 |
if ( 'true' === fs_request_get( 'checkout', false ) ) {
|
18498 |
+
echo $this->apply_filters( 'templates/checkout.php', fs_get_template( 'checkout.php', $vars ) );
|
18499 |
} else {
|
18500 |
+
echo $this->apply_filters( 'templates/pricing.php', fs_get_template( 'pricing.php', $vars ) );
|
18501 |
}
|
18502 |
}
|
18503 |
|
18515 |
$this->_logger->entrance();
|
18516 |
|
18517 |
$vars = array( 'id' => $this->_module_id );
|
18518 |
+
|
18519 |
+
/**
|
18520 |
+
* Added filter to the template to allow developers wrapping the template
|
18521 |
+
* in custom HTML (e.g. within a wizard/tabs).
|
18522 |
+
*
|
18523 |
+
* @author Vova Feldman (@svovaf)
|
18524 |
+
* @since 2.1.3
|
18525 |
+
*/
|
18526 |
+
echo $this->apply_filters( 'templates/contact.php', fs_get_template( 'contact.php', $vars ) );
|
18527 |
}
|
18528 |
|
18529 |
#endregion ------------------------------------------------------------------------
|
18620 |
* @return FS_Api
|
18621 |
*/
|
18622 |
private function get_current_or_network_user_api_scope( $flush = false ) {
|
18623 |
+
if ( ! $this->_is_network_active ||
|
18624 |
+
( isset( $this->_user ) && $this->_user instanceof FS_User )
|
18625 |
+
) {
|
18626 |
return $this->get_api_user_scope( $flush );
|
18627 |
}
|
18628 |
|
18710 |
* @author Vova Feldman (@svovaf)
|
18711 |
* @since 1.0.9
|
18712 |
*
|
18713 |
+
* @param FS_Plugin_Plan[] $plans
|
18714 |
*/
|
18715 |
function _check_for_trial_plans( $plans ) {
|
18716 |
+
/**
|
18717 |
+
* For some reason core's do_action() flattens arrays when it has a single object item. Therefore, we need to restructure the array as expected.
|
18718 |
+
*
|
18719 |
+
* @author Vova Feldman (@svovaf)
|
18720 |
+
* @since 2.1.2
|
18721 |
+
*/
|
18722 |
+
if ( ! is_array( $plans ) && is_object( $plans ) ) {
|
18723 |
+
$plans = array( $plans );
|
18724 |
+
}
|
18725 |
+
|
18726 |
$this->_storage->has_trial_plan = FS_Plan_Manager::instance()->has_trial_plan( $plans );
|
18727 |
}
|
18728 |
|
18829 |
|
18830 |
// Show promotion if never shown before and 24 hours after initial activation with FS.
|
18831 |
if ( ! $was_promotion_shown_before &&
|
18832 |
+
$this->_storage->install_timestamp > ( time() - $this->apply_filters( 'show_first_trial_after_n_sec', WP_FS__TIME_24_HOURS_IN_SEC ) )
|
18833 |
) {
|
18834 |
return false;
|
18835 |
}
|
18836 |
|
18837 |
// OR if promotion was shown before, try showing it every 30 days.
|
18838 |
if ( $was_promotion_shown_before &&
|
18839 |
+
$this->apply_filters( 'reshow_trial_after_every_n_sec', 30 * WP_FS__TIME_24_HOURS_IN_SEC ) > time() - $last_time_trial_promotion_shown
|
18840 |
) {
|
18841 |
return false;
|
18842 |
}
|
19461 |
* @param array $request
|
19462 |
* @param int $success_cache_expiration
|
19463 |
* @param int $failure_cache_expiration
|
19464 |
+
* @param bool $maybe_enrich_request_for_debug
|
19465 |
*
|
19466 |
* @return WP_Error|array
|
19467 |
*/
|
19468 |
+
static function safe_remote_post(
|
19469 |
&$url,
|
19470 |
$request,
|
19471 |
$success_cache_expiration = 0,
|
19472 |
+
$failure_cache_expiration = 0,
|
19473 |
+
$maybe_enrich_request_for_debug = true
|
19474 |
) {
|
19475 |
$should_cache = ($success_cache_expiration + $failure_cache_expiration > 0);
|
19476 |
|
19481 |
false;
|
19482 |
|
19483 |
if ( false === $response ) {
|
19484 |
+
if ( $maybe_enrich_request_for_debug ) {
|
19485 |
+
self::enrich_request_for_debug( $url, $request );
|
19486 |
+
}
|
19487 |
|
19488 |
$response = wp_remote_post( $url, $request );
|
19489 |
|
20238 |
$icon_found = false;
|
20239 |
$local_path = fs_normalize_path( "{$img_dir}/{$this->_slug}.png" );
|
20240 |
|
20241 |
+
if ( ! function_exists( 'get_filesystem_method' ) ) {
|
20242 |
+
require_once ABSPATH . 'wp-admin/includes/file.php';
|
20243 |
+
}
|
20244 |
+
|
20245 |
$have_write_permissions = ( 'direct' === get_filesystem_method( array(), fs_normalize_path( $img_dir ) ) );
|
20246 |
|
20247 |
/**
|
20758 |
* @since 2.1.0
|
20759 |
*/
|
20760 |
function _maybe_add_gdpr_optin_ajax_handler() {
|
20761 |
+
$this->add_ajax_action( 'fetch_is_marketing_required_flag_value', array( &$this, '_fetch_is_marketing_required_flag_value_ajax_action' ) );
|
|
|
|
|
20762 |
|
20763 |
if ( FS_GDPR_Manager::instance()->is_opt_in_notice_shown() ) {
|
20764 |
$this->add_gdpr_optin_ajax_handler_and_style();
|
20942 |
}
|
20943 |
|
20944 |
#endregion
|
20945 |
+
|
20946 |
+
#----------------------------------------------------------------------------------
|
20947 |
+
#region Helper
|
20948 |
+
#----------------------------------------------------------------------------------
|
20949 |
+
|
20950 |
+
/**
|
20951 |
+
* If running with a secret key, assume it's the developer and show pending plans as well.
|
20952 |
+
*
|
20953 |
+
* @author Vova Feldman (@svovaf)
|
20954 |
+
* @since 2.1.2
|
20955 |
+
*
|
20956 |
+
* @param string $path
|
20957 |
+
*
|
20958 |
+
* @return string
|
20959 |
+
*/
|
20960 |
+
function add_show_pending( $path ) {
|
20961 |
+
if ( ! $this->has_secret_key() ) {
|
20962 |
+
return $path;
|
20963 |
+
}
|
20964 |
+
|
20965 |
+
return $path . ( false !== strpos( $path, '?' ) ? '&' : '?' ) . 'show_pending=true';
|
20966 |
+
}
|
20967 |
+
|
20968 |
+
#endregion
|
20969 |
}
|
freemius/includes/class-fs-plugin-updater.php
CHANGED
@@ -29,6 +29,11 @@
|
|
29 |
* @since 1.1.8.1
|
30 |
*/
|
31 |
private $_update_details;
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
#--------------------------------------------------------------------------------
|
34 |
#region Singleton
|
@@ -77,7 +82,7 @@
|
|
77 |
|
78 |
$this->add_transient_filters();
|
79 |
|
80 |
-
if ( ! $this->_fs->
|
81 |
/**
|
82 |
* If user has the premium plugin's code but do NOT have an active license,
|
83 |
* encourage him to upgrade by showing that there's a new release, but instead
|
@@ -109,7 +114,7 @@
|
|
109 |
add_filter( 'upgrader_post_install', array( &$this, '_maybe_update_folder_name' ), 10, 3 );
|
110 |
}
|
111 |
|
112 |
-
if ( ! $this->_fs->
|
113 |
add_filter( 'wp_prepare_themes_for_js', array( &$this, 'change_theme_update_info_html' ), 10, 1 );
|
114 |
}
|
115 |
}
|
@@ -324,6 +329,46 @@
|
|
324 |
(array) $this->_update_details;
|
325 |
}
|
326 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
327 |
return $transient_data;
|
328 |
}
|
329 |
|
@@ -508,6 +553,138 @@
|
|
508 |
return $res;
|
509 |
}
|
510 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
511 |
/**
|
512 |
* Updates information on the "View version x.x details" page with custom data.
|
513 |
*
|
29 |
* @since 1.1.8.1
|
30 |
*/
|
31 |
private $_update_details;
|
32 |
+
/**
|
33 |
+
* @var array
|
34 |
+
* @since 2.1.2
|
35 |
+
*/
|
36 |
+
private $_translation_updates;
|
37 |
|
38 |
#--------------------------------------------------------------------------------
|
39 |
#region Singleton
|
82 |
|
83 |
$this->add_transient_filters();
|
84 |
|
85 |
+
if ( ! $this->_fs->has_any_active_valid_license() ) {
|
86 |
/**
|
87 |
* If user has the premium plugin's code but do NOT have an active license,
|
88 |
* encourage him to upgrade by showing that there's a new release, but instead
|
114 |
add_filter( 'upgrader_post_install', array( &$this, '_maybe_update_folder_name' ), 10, 3 );
|
115 |
}
|
116 |
|
117 |
+
if ( ! $this->_fs->has_any_active_valid_license() ) {
|
118 |
add_filter( 'wp_prepare_themes_for_js', array( &$this, 'change_theme_update_info_html' ), 10, 1 );
|
119 |
}
|
120 |
}
|
329 |
(array) $this->_update_details;
|
330 |
}
|
331 |
|
332 |
+
$slug = $this->_fs->get_slug();
|
333 |
+
|
334 |
+
if ( $this->_fs->is_org_repo_compliant() && $this->_fs->is_freemium() ) {
|
335 |
+
if ( ! isset( $this->_translation_updates ) ) {
|
336 |
+
$this->_translation_updates = array();
|
337 |
+
|
338 |
+
if ( current_user_can( 'update_languages' ) ) {
|
339 |
+
$translation_updates = $this->fetch_wp_org_module_translation_updates( $module_type, $slug );
|
340 |
+
if ( ! empty( $translation_updates ) ) {
|
341 |
+
$this->_translation_updates = $translation_updates;
|
342 |
+
}
|
343 |
+
}
|
344 |
+
}
|
345 |
+
|
346 |
+
if ( ! empty( $this->_translation_updates ) ) {
|
347 |
+
$all_translation_updates = ( isset( $transient_data->translations ) && is_array( $transient_data->translations ) ) ?
|
348 |
+
$transient_data->translations :
|
349 |
+
array();
|
350 |
+
|
351 |
+
$current_plugin_translation_updates_map = array();
|
352 |
+
foreach ( $all_translation_updates as $key => $translation_update ) {
|
353 |
+
if ( $module_type === ( $translation_update['type'] . 's' ) && $slug === $translation_update['slug'] ) {
|
354 |
+
$current_plugin_translation_updates_map[ $translation_update['language'] ] = $translation_update;
|
355 |
+
unset( $all_translation_updates[ $key ] );
|
356 |
+
}
|
357 |
+
}
|
358 |
+
|
359 |
+
foreach ( $this->_translation_updates as $translation_update ) {
|
360 |
+
$lang = $translation_update['language'];
|
361 |
+
if ( ! isset( $current_plugin_translation_updates_map[ $lang ] ) ||
|
362 |
+
version_compare( $translation_update['version'], $current_plugin_translation_updates_map[ $lang ]['version'], '>' )
|
363 |
+
) {
|
364 |
+
$current_plugin_translation_updates_map[ $lang ] = $translation_update;
|
365 |
+
}
|
366 |
+
}
|
367 |
+
|
368 |
+
$transient_data->translations = array_merge( $all_translation_updates, array_values( $current_plugin_translation_updates_map ) );
|
369 |
+
}
|
370 |
+
}
|
371 |
+
|
372 |
return $transient_data;
|
373 |
}
|
374 |
|
553 |
return $res;
|
554 |
}
|
555 |
|
556 |
+
/**
|
557 |
+
* Fetches module translation updates from wordpress.org.
|
558 |
+
*
|
559 |
+
* @author Leo Fajardo (@leorw)
|
560 |
+
* @since 2.1.2
|
561 |
+
*
|
562 |
+
* @param string $module_type
|
563 |
+
* @param string $slug
|
564 |
+
*
|
565 |
+
* @return array|null
|
566 |
+
*/
|
567 |
+
private function fetch_wp_org_module_translation_updates( $module_type, $slug ) {
|
568 |
+
$plugin_data = $this->_fs->get_plugin_data();
|
569 |
+
|
570 |
+
$locales = array_values( get_available_languages() );
|
571 |
+
$locales = apply_filters( "{$module_type}_update_check_locales", $locales );
|
572 |
+
$locales = array_unique( $locales );
|
573 |
+
|
574 |
+
$plugin_basename = $this->_fs->get_plugin_basename();
|
575 |
+
if ( 'themes' === $module_type ) {
|
576 |
+
$plugin_basename = str_replace( '-premium', '', $plugin_basename );
|
577 |
+
}
|
578 |
+
|
579 |
+
global $wp_version;
|
580 |
+
|
581 |
+
$request_args = array(
|
582 |
+
'timeout' => 15,
|
583 |
+
'body' => array(
|
584 |
+
"{$module_type}" => json_encode(
|
585 |
+
array(
|
586 |
+
"{$module_type}" => array(
|
587 |
+
$plugin_basename => array(
|
588 |
+
'Name' => trim( str_replace( '(Premium)', '', $plugin_data['Name'] ) ),
|
589 |
+
'Author' => $plugin_data['Author'],
|
590 |
+
)
|
591 |
+
)
|
592 |
+
)
|
593 |
+
),
|
594 |
+
'translations' => json_encode( $this->get_installed_translations( $module_type, $slug ) ),
|
595 |
+
'locale' => json_encode( $locales )
|
596 |
+
),
|
597 |
+
'user-agent' => ( 'WordPress/' . $wp_version . '; ' . home_url( '/' ) )
|
598 |
+
);
|
599 |
+
|
600 |
+
$url = "http://api.wordpress.org/{$module_type}/update-check/1.1/";
|
601 |
+
if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) {
|
602 |
+
$url = set_url_scheme( $url, 'https' );
|
603 |
+
}
|
604 |
+
|
605 |
+
$raw_response = Freemius::safe_remote_post(
|
606 |
+
$url,
|
607 |
+
$request_args,
|
608 |
+
WP_FS__TIME_24_HOURS_IN_SEC,
|
609 |
+
WP_FS__TIME_12_HOURS_IN_SEC,
|
610 |
+
false
|
611 |
+
);
|
612 |
+
|
613 |
+
if ( is_wp_error( $raw_response ) ) {
|
614 |
+
return null;
|
615 |
+
}
|
616 |
+
|
617 |
+
$response = json_decode( wp_remote_retrieve_body( $raw_response ), true );
|
618 |
+
|
619 |
+
if ( ! is_array( $response ) ) {
|
620 |
+
return null;
|
621 |
+
}
|
622 |
+
|
623 |
+
if ( ! isset( $response['translations'] ) || empty( $response['translations'] ) ) {
|
624 |
+
return null;
|
625 |
+
}
|
626 |
+
|
627 |
+
return $response['translations'];
|
628 |
+
}
|
629 |
+
|
630 |
+
/**
|
631 |
+
* @author Leo Fajardo (@leorw)
|
632 |
+
* @since 2.1.2
|
633 |
+
*
|
634 |
+
* @param string $module_type
|
635 |
+
* @param string $slug
|
636 |
+
*
|
637 |
+
* @return array
|
638 |
+
*/
|
639 |
+
private function get_installed_translations( $module_type, $slug ) {
|
640 |
+
if ( function_exists( 'wp_get_installed_translations' ) ) {
|
641 |
+
return wp_get_installed_translations( $module_type );
|
642 |
+
}
|
643 |
+
|
644 |
+
$dir = "/{$module_type}";
|
645 |
+
|
646 |
+
if ( ! is_dir( WP_LANG_DIR . $dir ) )
|
647 |
+
return array();
|
648 |
+
|
649 |
+
$files = scandir( WP_LANG_DIR . $dir );
|
650 |
+
if ( ! $files )
|
651 |
+
return array();
|
652 |
+
|
653 |
+
$language_data = array();
|
654 |
+
|
655 |
+
foreach ( $files as $file ) {
|
656 |
+
if ( 0 !== strpos( $file, $slug ) ) {
|
657 |
+
continue;
|
658 |
+
}
|
659 |
+
|
660 |
+
if ( '.' === $file[0] || is_dir( WP_LANG_DIR . "{$dir}/{$file}" ) ) {
|
661 |
+
continue;
|
662 |
+
}
|
663 |
+
|
664 |
+
if ( substr( $file, -3 ) !== '.po' ) {
|
665 |
+
continue;
|
666 |
+
}
|
667 |
+
|
668 |
+
if ( ! preg_match( '/(?:(.+)-)?([a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z0-9]+)?).po/', $file, $match ) ) {
|
669 |
+
continue;
|
670 |
+
}
|
671 |
+
|
672 |
+
if ( ! in_array( substr( $file, 0, -3 ) . '.mo', $files ) ) {
|
673 |
+
continue;
|
674 |
+
}
|
675 |
+
|
676 |
+
list( , $textdomain, $language ) = $match;
|
677 |
+
|
678 |
+
if ( '' === $textdomain ) {
|
679 |
+
$textdomain = 'default';
|
680 |
+
}
|
681 |
+
|
682 |
+
$language_data[ $textdomain ][ $language ] = wp_get_pomo_file_data( WP_LANG_DIR . "{$dir}/{$file}" );
|
683 |
+
}
|
684 |
+
|
685 |
+
return $language_data;
|
686 |
+
}
|
687 |
+
|
688 |
/**
|
689 |
* Updates information on the "View version x.x details" page with custom data.
|
690 |
*
|
freemius/includes/customizer/class-fs-customizer-upsell-control.php
CHANGED
@@ -59,7 +59,7 @@
|
|
59 |
$this->fs->get_upgrade_url();
|
60 |
|
61 |
// Load features.
|
62 |
-
$pricing = $this->fs->get_api_plugin_scope()->get(
|
63 |
|
64 |
if ( $this->fs->is_api_result_object( $pricing, 'plans' ) ) {
|
65 |
// Add support features.
|
59 |
$this->fs->get_upgrade_url();
|
60 |
|
61 |
// Load features.
|
62 |
+
$pricing = $this->fs->get_api_plugin_scope()->get( $this->fs->add_show_pending( "pricing.json" ) );
|
63 |
|
64 |
if ( $this->fs->is_api_result_object( $pricing, 'plans' ) ) {
|
65 |
// Add support features.
|
freemius/includes/entities/class-fs-site.php
CHANGED
@@ -150,6 +150,7 @@
|
|
150 |
fs_starts_with( $subdomain, 'local.' ) ||
|
151 |
fs_starts_with( $subdomain, 'dev.' ) ||
|
152 |
fs_starts_with( $subdomain, 'test.' ) ||
|
|
|
153 |
fs_starts_with( $subdomain, 'staging.' ) ||
|
154 |
|
155 |
// Ends with.
|
@@ -171,7 +172,9 @@
|
|
171 |
( fs_ends_with($subdomain, 'pantheonsite.io') &&
|
172 |
(fs_starts_with($subdomain, 'test-') || fs_starts_with($subdomain, 'dev-'))) ||
|
173 |
// Cloudways
|
174 |
-
fs_ends_with( $subdomain, '.cloudwaysapps.com' )
|
|
|
|
|
175 |
);
|
176 |
}
|
177 |
|
150 |
fs_starts_with( $subdomain, 'local.' ) ||
|
151 |
fs_starts_with( $subdomain, 'dev.' ) ||
|
152 |
fs_starts_with( $subdomain, 'test.' ) ||
|
153 |
+
fs_starts_with( $subdomain, 'stage.' ) ||
|
154 |
fs_starts_with( $subdomain, 'staging.' ) ||
|
155 |
|
156 |
// Ends with.
|
172 |
( fs_ends_with($subdomain, 'pantheonsite.io') &&
|
173 |
(fs_starts_with($subdomain, 'test-') || fs_starts_with($subdomain, 'dev-'))) ||
|
174 |
// Cloudways
|
175 |
+
fs_ends_with( $subdomain, '.cloudwaysapps.com' ) ||
|
176 |
+
// Kinsta
|
177 |
+
(fs_ends_with($subdomain, '.kinsta.com') && fs_starts_with($subdomain, 'staging-'))
|
178 |
);
|
179 |
}
|
180 |
|
freemius/includes/fs-plugin-info-dialog.php
CHANGED
@@ -101,7 +101,7 @@
|
|
101 |
$has_features = false;
|
102 |
$plans = false;
|
103 |
|
104 |
-
$result = $this->_fs->get_api_plugin_scope()->get( "/addons/{$selected_addon->id}/pricing.json?type=visible" );
|
105 |
|
106 |
if ( ! isset( $result->error ) ) {
|
107 |
$plans = $result->plans;
|
@@ -165,6 +165,8 @@
|
|
165 |
// Plugin is missing, not on Freemius nor WP.org.
|
166 |
$data->wp_org_missing = true;
|
167 |
}
|
|
|
|
|
168 |
} else {
|
169 |
$data->wp_org_missing = false;
|
170 |
|
@@ -183,12 +185,7 @@
|
|
183 |
|
184 |
// Fetch as much as possible info from local files.
|
185 |
$plugin_local_data = $this->_fs->get_plugin_data();
|
186 |
-
$data->name = $selected_addon->title;
|
187 |
$data->author = $plugin_local_data['Author'];
|
188 |
-
$view_vars = array( 'plugin' => $selected_addon );
|
189 |
-
$data->sections = array(
|
190 |
-
'description' => fs_get_template( '/plugin-info/description.php', $view_vars ),
|
191 |
-
);
|
192 |
|
193 |
if ( ! empty( $selected_addon->info->banner_url ) ) {
|
194 |
$data->banners = array(
|
@@ -206,7 +203,7 @@
|
|
206 |
|
207 |
if ( is_object( $latest ) ) {
|
208 |
$data->version = $latest->version;
|
209 |
-
$data->last_updated =
|
210 |
$data->requires = $latest->requires_platform_version;
|
211 |
$data->tested = $latest->tested_up_to_version;
|
212 |
} else {
|
@@ -217,6 +214,12 @@
|
|
217 |
}
|
218 |
}
|
219 |
|
|
|
|
|
|
|
|
|
|
|
|
|
220 |
if ( $has_pricing ) {
|
221 |
// Add plans to data.
|
222 |
$data->plans = $plans;
|
@@ -950,7 +953,7 @@
|
|
950 |
</li>
|
951 |
<?php
|
952 |
}
|
953 |
-
if ( ! empty( $api->slug ) &&
|
954 |
?>
|
955 |
<li><a target="_blank"
|
956 |
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 ) ?>
|
@@ -1094,7 +1097,7 @@
|
|
1094 |
echo "</div>\n"; // #plugin-information-scrollable
|
1095 |
echo "<div id='$tab-footer'>\n";
|
1096 |
|
1097 |
-
if ( ! empty( $api->checkout_link ) ) {
|
1098 |
echo $this->get_checkout_cta( $api );
|
1099 |
}
|
1100 |
|
101 |
$has_features = false;
|
102 |
$plans = false;
|
103 |
|
104 |
+
$result = $this->_fs->get_api_plugin_scope()->get( $this->_fs->add_show_pending( "/addons/{$selected_addon->id}/pricing.json?type=visible" ) );
|
105 |
|
106 |
if ( ! isset( $result->error ) ) {
|
107 |
$plans = $result->plans;
|
165 |
// Plugin is missing, not on Freemius nor WP.org.
|
166 |
$data->wp_org_missing = true;
|
167 |
}
|
168 |
+
|
169 |
+
$data->fs_missing = ( ! $has_free_plan || $data->wp_org_missing );
|
170 |
} else {
|
171 |
$data->wp_org_missing = false;
|
172 |
|
185 |
|
186 |
// Fetch as much as possible info from local files.
|
187 |
$plugin_local_data = $this->_fs->get_plugin_data();
|
|
|
188 |
$data->author = $plugin_local_data['Author'];
|
|
|
|
|
|
|
|
|
189 |
|
190 |
if ( ! empty( $selected_addon->info->banner_url ) ) {
|
191 |
$data->banners = array(
|
203 |
|
204 |
if ( is_object( $latest ) ) {
|
205 |
$data->version = $latest->version;
|
206 |
+
$data->last_updated = $latest->created;
|
207 |
$data->requires = $latest->requires_platform_version;
|
208 |
$data->tested = $latest->tested_up_to_version;
|
209 |
} else {
|
214 |
}
|
215 |
}
|
216 |
|
217 |
+
$data->name = $selected_addon->title;
|
218 |
+
$view_vars = array( 'plugin' => $selected_addon );
|
219 |
+
$data->sections = array(
|
220 |
+
'description' => fs_get_template( '/plugin-info/description.php', $view_vars ),
|
221 |
+
);
|
222 |
+
|
223 |
if ( $has_pricing ) {
|
224 |
// Add plans to data.
|
225 |
$data->plans = $plans;
|
953 |
</li>
|
954 |
<?php
|
955 |
}
|
956 |
+
if ( ! empty( $api->slug ) && true == $api->is_wp_org_compliant ) {
|
957 |
?>
|
958 |
<li><a target="_blank"
|
959 |
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 ) ?>
|
1097 |
echo "</div>\n"; // #plugin-information-scrollable
|
1098 |
echo "<div id='$tab-footer'>\n";
|
1099 |
|
1100 |
+
if ( $api->has_paid_plan && ! empty( $api->checkout_link ) ) {
|
1101 |
echo $this->get_checkout_cta( $api );
|
1102 |
}
|
1103 |
|
freemius/package.json
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
"author": "Freemius, Inc.",
|
5 |
"license": "GPL-3.0",
|
6 |
"homepage": "https://freemius.com",
|
7 |
-
"version": "1.2
|
8 |
"main": "gulpfile.js",
|
9 |
"dependencies": {},
|
10 |
"scripts": {
|
4 |
"author": "Freemius, Inc.",
|
5 |
"license": "GPL-3.0",
|
6 |
"homepage": "https://freemius.com",
|
7 |
+
"version": "2.1.2",
|
8 |
"main": "gulpfile.js",
|
9 |
"dependencies": {},
|
10 |
"scripts": {
|
freemius/start.php
CHANGED
@@ -15,7 +15,7 @@
|
|
15 |
*
|
16 |
* @var string
|
17 |
*/
|
18 |
-
$this_sdk_version = '2.1.
|
19 |
|
20 |
#region SDK Selection Logic --------------------------------------------------------------------
|
21 |
|
15 |
*
|
16 |
* @var string
|
17 |
*/
|
18 |
+
$this_sdk_version = '2.1.3';
|
19 |
|
20 |
#region SDK Selection Logic --------------------------------------------------------------------
|
21 |
|
freemius/templates/account/partials/addon.php
CHANGED
@@ -61,7 +61,7 @@
|
|
61 |
$plan = $fs_addon->get_plan();
|
62 |
$is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() );
|
63 |
$is_paid_trial = $fs_addon->is_paid_trial();
|
64 |
-
$show_upgrade = ( ! $is_paying && ! $is_paid_trial && ! $fs_addon->_has_premium_license() );
|
65 |
$is_current_license_expired = is_object( $license ) && $license->is_expired();
|
66 |
}
|
67 |
?>
|
@@ -220,7 +220,7 @@
|
|
220 |
}
|
221 |
|
222 |
if ( 0 == count( $buttons ) ) {
|
223 |
-
if ( $fs_addon->is_premium() ) {
|
224 |
$fs_addon->_add_license_activation_dialog_box();
|
225 |
|
226 |
$buttons[] = fs_ui_get_action_button(
|
61 |
$plan = $fs_addon->get_plan();
|
62 |
$is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() );
|
63 |
$is_paid_trial = $fs_addon->is_paid_trial();
|
64 |
+
$show_upgrade = ( $fs_addon->has_paid_plan() && ! $is_paying && ! $is_paid_trial && ! $fs_addon->_has_premium_license() );
|
65 |
$is_current_license_expired = is_object( $license ) && $license->is_expired();
|
66 |
}
|
67 |
?>
|
220 |
}
|
221 |
|
222 |
if ( 0 == count( $buttons ) ) {
|
223 |
+
if ( $show_upgrade && $fs_addon->is_premium() ) {
|
224 |
$fs_addon->_add_license_activation_dialog_box();
|
225 |
|
226 |
$buttons[] = fs_ui_get_action_button(
|
freemius/templates/add-ons.php
CHANGED
@@ -55,7 +55,7 @@
|
|
55 |
$has_free_plan = false;
|
56 |
$has_paid_plan = false;
|
57 |
|
58 |
-
$result = $fs->get_api_plugin_scope()->get( "/addons/{$addon->id}/pricing.json?type=visible" );
|
59 |
if ( ! isset( $result->error ) ) {
|
60 |
$plans = $result->plans;
|
61 |
|
@@ -89,6 +89,10 @@
|
|
89 |
|
90 |
}
|
91 |
}
|
|
|
|
|
|
|
|
|
92 |
}
|
93 |
?>
|
94 |
<li class="fs-card fs-addon" data-slug="<?php echo $addon->slug ?>">
|
55 |
$has_free_plan = false;
|
56 |
$has_paid_plan = false;
|
57 |
|
58 |
+
$result = $fs->get_api_plugin_scope()->get( $fs->add_show_pending( "/addons/{$addon->id}/pricing.json?type=visible" ) );
|
59 |
if ( ! isset( $result->error ) ) {
|
60 |
$plans = $result->plans;
|
61 |
|
89 |
|
90 |
}
|
91 |
}
|
92 |
+
|
93 |
+
if ( ! $has_paid_plan && ! $has_free_plan ) {
|
94 |
+
continue;
|
95 |
+
}
|
96 |
}
|
97 |
?>
|
98 |
<li class="fs-card fs-addon" data-slug="<?php echo $addon->slug ?>">
|
freemius/templates/checkout.php
CHANGED
@@ -121,7 +121,7 @@
|
|
121 |
|
122 |
$fs_user = Freemius::_get_user_by_email( $current_user->user_email );
|
123 |
|
124 |
-
if ( is_object( $fs_user ) ) {
|
125 |
$context_params = array_merge( $context_params, FS_Security::instance()->get_context_params(
|
126 |
$fs_user,
|
127 |
$timestamp,
|
@@ -233,7 +233,7 @@
|
|
233 |
// passed via query string or hard coded into the child page, it depends on your needs).
|
234 |
src = base_url + '/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href),
|
235 |
// Append the i-frame into the DOM.
|
236 |
-
frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent;"><\/i' + 'frame>')
|
237 |
.appendTo('#frame');
|
238 |
|
239 |
FS.PostMessage.init(base_url, [frame[0]]);
|
121 |
|
122 |
$fs_user = Freemius::_get_user_by_email( $current_user->user_email );
|
123 |
|
124 |
+
if ( is_object( $fs_user ) && $fs_user->is_verified() ) {
|
125 |
$context_params = array_merge( $context_params, FS_Security::instance()->get_context_params(
|
126 |
$fs_user,
|
127 |
$timestamp,
|
233 |
// passed via query string or hard coded into the child page, it depends on your needs).
|
234 |
src = base_url + '/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href),
|
235 |
// Append the i-frame into the DOM.
|
236 |
+
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>')
|
237 |
.appendTo('#frame');
|
238 |
|
239 |
FS.PostMessage.init(base_url, [frame[0]]);
|
freemius/templates/connect.php
CHANGED
@@ -253,6 +253,17 @@
|
|
253 |
<a class="show-license-resend-modal show-license-resend-modal-<?php echo $fs->get_unique_affix() ?>"
|
254 |
href="#"><?php fs_esc_html_echo_inline( "Can't find your license key?", 'cant-find-license-key', $slug ); ?></a>
|
255 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
256 |
<?php
|
257 |
$send_updates_text = sprintf(
|
258 |
'%s<span class="action-description"> - %s</span>',
|
@@ -718,11 +729,14 @@
|
|
718 |
// Redirect to the "Account" page and sync the license.
|
719 |
window.location.href = resultObj.next_page;
|
720 |
} else {
|
|
|
|
|
721 |
// Show error.
|
722 |
$('.fs-content').prepend('<p class="fs-error">' + (resultObj.error.message ? resultObj.error.message : resultObj.error) + '</p>');
|
723 |
-
|
724 |
-
resetLoadingMode();
|
725 |
}
|
|
|
|
|
|
|
726 |
}
|
727 |
});
|
728 |
|
253 |
<a class="show-license-resend-modal show-license-resend-modal-<?php echo $fs->get_unique_affix() ?>"
|
254 |
href="#"><?php fs_esc_html_echo_inline( "Can't find your license key?", 'cant-find-license-key', $slug ); ?></a>
|
255 |
</div>
|
256 |
+
|
257 |
+
<?php
|
258 |
+
/**
|
259 |
+
* Allows developers to include custom HTML after the license input container.
|
260 |
+
*
|
261 |
+
* @author Vova Feldman
|
262 |
+
* @since 2.1.2
|
263 |
+
*/
|
264 |
+
$fs->do_action( 'connect/after_license_input' );
|
265 |
+
?>
|
266 |
+
|
267 |
<?php
|
268 |
$send_updates_text = sprintf(
|
269 |
'%s<span class="action-description"> - %s</span>',
|
729 |
// Redirect to the "Account" page and sync the license.
|
730 |
window.location.href = resultObj.next_page;
|
731 |
} else {
|
732 |
+
resetLoadingMode();
|
733 |
+
|
734 |
// Show error.
|
735 |
$('.fs-content').prepend('<p class="fs-error">' + (resultObj.error.message ? resultObj.error.message : resultObj.error) + '</p>');
|
|
|
|
|
736 |
}
|
737 |
+
},
|
738 |
+
error: function () {
|
739 |
+
resetLoadingMode();
|
740 |
}
|
741 |
});
|
742 |
|
freemius/templates/contact.php
CHANGED
@@ -98,7 +98,7 @@
|
|
98 |
src = base_url + '/contact/?<?php echo http_build_query($query_params) ?>#' + encodeURIComponent(document.location.href),
|
99 |
|
100 |
// Append the i-frame into the DOM.
|
101 |
-
frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent;"><\/i' + 'frame>')
|
102 |
.appendTo('#frame');
|
103 |
|
104 |
FS.PostMessage.init(base_url);
|
98 |
src = base_url + '/contact/?<?php echo http_build_query($query_params) ?>#' + encodeURIComponent(document.location.href),
|
99 |
|
100 |
// Append the i-frame into the DOM.
|
101 |
+
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>')
|
102 |
.appendTo('#frame');
|
103 |
|
104 |
FS.PostMessage.init(base_url);
|
freemius/templates/debug.php
CHANGED
@@ -86,6 +86,16 @@
|
|
86 |
<button class="button button-primary"><?php fs_esc_html_echo_inline( 'Sync Data From Server' ) ?></button>
|
87 |
</form>
|
88 |
</td>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
<td>
|
90 |
<button id="fs_load_db_option" class="button"><?php fs_esc_html_echo_inline( 'Load DB Option' ) ?></button>
|
91 |
</td>
|
86 |
<button class="button button-primary"><?php fs_esc_html_echo_inline( 'Sync Data From Server' ) ?></button>
|
87 |
</form>
|
88 |
</td>
|
89 |
+
<?php if ( fs_is_network_admin() && true !== $fs_options->get_option( 'ms_migration_complete', false, true ) ) : ?>
|
90 |
+
<td>
|
91 |
+
<!-- Migrate Options to Network -->
|
92 |
+
<form action="" method="POST">
|
93 |
+
<input type="hidden" name="fs_action" value="migrate_options_to_network">
|
94 |
+
<?php wp_nonce_field( 'migrate_options_to_network' ) ?>
|
95 |
+
<button class="button button-primary"><?php fs_esc_html_echo_inline( 'Migrate Options to Network' ) ?></button>
|
96 |
+
</form>
|
97 |
+
</td>
|
98 |
+
<?php endif ?>
|
99 |
<td>
|
100 |
<button id="fs_load_db_option" class="button"><?php fs_esc_html_echo_inline( 'Load DB Option' ) ?></button>
|
101 |
</td>
|
freemius/templates/forms/deactivation/form.php
CHANGED
@@ -94,7 +94,7 @@ HTML;
|
|
94 |
isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
|
95 |
otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
|
96 |
dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
|
97 |
-
deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->
|
98 |
|
99 |
$modal.appendTo($('body'));
|
100 |
|
94 |
isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>,
|
95 |
otherReasonID = <?php echo Freemius::REASON_OTHER; ?>,
|
96 |
dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>,
|
97 |
+
deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>;
|
98 |
|
99 |
$modal.appendTo($('body'));
|
100 |
|
freemius/templates/pricing.php
CHANGED
@@ -127,7 +127,7 @@
|
|
127 |
src = base_url + '/pricing/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href),
|
128 |
|
129 |
// Append the I-frame into the DOM.
|
130 |
-
frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent;"><\/i' + 'frame>')
|
131 |
.appendTo('#frame');
|
132 |
|
133 |
FS.PostMessage.init(base_url, [frame[0]]);
|
127 |
src = base_url + '/pricing/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href),
|
128 |
|
129 |
// Append the I-frame into the DOM.
|
130 |
+
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>')
|
131 |
.appendTo('#frame');
|
132 |
|
133 |
FS.PostMessage.init(base_url, [frame[0]]);
|
freemius/templates/tabs.php
CHANGED
@@ -26,7 +26,11 @@
|
|
26 |
foreach ( $menu_items as $priority => $items ) {
|
27 |
foreach ( $items as $item ) {
|
28 |
if ( ! $item['show_submenu'] ) {
|
29 |
-
|
|
|
|
|
|
|
|
|
30 |
continue;
|
31 |
}
|
32 |
}
|
26 |
foreach ( $menu_items as $priority => $items ) {
|
27 |
foreach ( $items as $item ) {
|
28 |
if ( ! $item['show_submenu'] ) {
|
29 |
+
$submenu_name = ('wp-support-forum' === $item['menu_slug']) ?
|
30 |
+
'support' :
|
31 |
+
$item['menu_slug'];
|
32 |
+
|
33 |
+
if ( ! $is_free_wp_org_theme || ! $fs->is_submenu_item_visible( $submenu_name, true ) ) {
|
34 |
continue;
|
35 |
}
|
36 |
}
|
readme.txt
CHANGED
@@ -4,7 +4,8 @@ Tags: ratings, rating, postrating, google rating, 5 star, review, reviews, star
|
|
4 |
Requires at least: 4.3.0
|
5 |
Contributors: Dudo
|
6 |
Tested up to: 5.0
|
7 |
-
|
|
|
8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
9 |
|
10 |
Boost the way people interact with your website, e-commerce or blog with an easy and intuitive WordPress rating system!
|
@@ -107,11 +108,14 @@ Of course not: you can easily add it on the visual editor just by clicking the "
|
|
107 |
|
108 |
The full changelog can be found in the plugin's directory. Recent entries:
|
109 |
|
|
|
|
|
|
|
110 |
= 1.6.6 =
|
111 |
* Minor changes
|
112 |
|
113 |
= 1.6.5 =
|
114 |
-
* NEW FEATURE: is it possible to use YASR without jquery
|
115 |
This functionality is still in beta and for now and works only with yasr_overall_rating and yasr_visitor_votes shortcode.
|
116 |
You can enable/disable this in every moment in the settings
|
117 |
|
4 |
Requires at least: 4.3.0
|
5 |
Contributors: Dudo
|
6 |
Tested up to: 5.0
|
7 |
+
Requires PHP: 5.4
|
8 |
+
Stable tag: 1.6.7
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
11 |
Boost the way people interact with your website, e-commerce or blog with an easy and intuitive WordPress rating system!
|
108 |
|
109 |
The full changelog can be found in the plugin's directory. Recent entries:
|
110 |
|
111 |
+
= 1.6.7 =
|
112 |
+
* Css fix for gutenberg compatibility
|
113 |
+
|
114 |
= 1.6.6 =
|
115 |
* Minor changes
|
116 |
|
117 |
= 1.6.5 =
|
118 |
+
* NEW FEATURE: is it possible to use YASR without jquery (so it will work on ANP pages!!).
|
119 |
This functionality is still in beta and for now and works only with yasr_overall_rating and yasr_visitor_votes shortcode.
|
120 |
You can enable/disable this in every moment in the settings
|
121 |
|
yet-another-stars-rating.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
* Plugin Name: Yet Another Stars Rating
|
5 |
* Plugin URI: http://wordpress.org/plugins/yet-another-stars-rating/
|
6 |
* Description: Yet Another Stars Rating turn your WordPress into a complete review website.
|
7 |
-
* Version: 1.6.
|
8 |
* Author: Dario Curvino
|
9 |
* Author URI: https://yetanotherstarsrating.com/
|
10 |
* Text Domain: yet-another-stars-rating
|
@@ -74,7 +74,7 @@ function yasr_fs()
|
|
74 |
yasr_fs();
|
75 |
// Signal that SDK was initiated.
|
76 |
do_action( 'yasr_fs_loaded' );
|
77 |
-
define( 'YASR_VERSION_NUM', '1.6.
|
78 |
//Plugin relative path
|
79 |
define( "YASR_ABSOLUTE_PATH", dirname( __FILE__ ) );
|
80 |
//Plugin RELATIVE PATH without slashes (just the directory's name)
|
4 |
* Plugin Name: Yet Another Stars Rating
|
5 |
* Plugin URI: http://wordpress.org/plugins/yet-another-stars-rating/
|
6 |
* Description: Yet Another Stars Rating turn your WordPress into a complete review website.
|
7 |
+
* Version: 1.6.7
|
8 |
* Author: Dario Curvino
|
9 |
* Author URI: https://yetanotherstarsrating.com/
|
10 |
* Text Domain: yet-another-stars-rating
|
74 |
yasr_fs();
|
75 |
// Signal that SDK was initiated.
|
76 |
do_action( 'yasr_fs_loaded' );
|
77 |
+
define( 'YASR_VERSION_NUM', '1.6.7' );
|
78 |
//Plugin relative path
|
79 |
define( "YASR_ABSOLUTE_PATH", dirname( __FILE__ ) );
|
80 |
//Plugin RELATIVE PATH without slashes (just the directory's name)
|