PluginProbe
Passster – Password Protect Pages and Content / 4.3.16
Passster – Password Protect Pages and Content v4.3.16
4.3.16 4.3.15 4.3.14 4.3.12 4.3.13 4.3.11 4.3.10 4.3.9 4.3.8 4.3.7 4.3.6 4.3.5 trunk 3.5.4 3.5.5.2 3.5.5.8 3.5.5.9 4.0 4.1.4 4.2.10 4.2.11 4.2.12 4.2.13 4.2.14 4.2.15 All 48 releases
← All changes | inc/freemius/start.php +97 -27 4.2.114.3.16 View file →
@@ -6,9 +6,9 @@
6 6 * @since 1.0.3
7 7 */
8 8
9 9 if ( ! defined( 'ABSPATH' ) ) {
10 - exit;
10 + return;
11 11 }
12 12
13 13 /**
14 14 * Freemius SDK Version.
@@ -14,9 +14,9 @@
14 14 * Freemius SDK Version.
15 15 *
16 16 * @var string
17 17 */
18 - $this_sdk_version = '2.9.0';
18 + $this_sdk_version = '2.13.4';
19 19
20 20 #region SDK Selection Logic --------------------------------------------------------------------
21 21
22 22 /**
@@ -35,9 +35,18 @@
35 35 // Require SDK essentials.
36 36 require_once dirname( __FILE__ ) . '/includes/fs-essential-functions.php';
37 37 }
38 38
39 - /**
39 + /**
40 + * We updated the logic to support SDK loading from a subfolder of a theme as well as from a parent theme
41 + * If the SDK is found in the active theme, it sets the relative path accordingly.
42 + * If not, it checks the parent theme and sets the relative path if found there.
43 + * This allows the SDK to be loaded from composer dependencies or from a custom `vendor/freemius` folder.
44 + *
45 + * @author Daniele Alessandra (@DanieleAlessandra)
46 + * @since 2.9.0.5
47 + *
48 + *
40 49 * This complex logic fixes symlink issues (e.g. with Vargant). The logic assumes
41 50 * that if it's a file from an SDK running in a theme, the location of the SDK
42 51 * is in the main theme's folder.
43 52 *
@@ -80,21 +89,59 @@
80 89 *
81 90 * @author Leo Fajardo (@leorw)
82 91 * @since 2.2.3
83 92 */
84 - $themes_directory = get_theme_root( get_stylesheet() );
85 - $themes_directory_name = basename( $themes_directory );
86 - $theme_candidate_basename = basename( dirname( $fs_root_path ) ) . '/' . basename( $fs_root_path );
93 + $themes_directory = fs_normalize_path( get_theme_root( get_stylesheet() ) );
94 + $themes_directory_name = basename( $themes_directory );
87 95
88 - if ( $file_path == fs_normalize_path( realpath( trailingslashit( $themes_directory ) . $theme_candidate_basename . '/' . basename( $file_path ) ) )
89 - ) {
90 - $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_candidate_basename;
91 - $is_theme = true;
92 - } else {
93 - $this_sdk_relative_path = plugin_basename( $fs_root_path );
94 - $is_theme = false;
95 - }
96 + // This change ensures that the condition works even if the SDK is located in a subdirectory (e.g., vendor)
97 + $theme_candidate_sdk_basename = str_replace( $themes_directory . '/' . get_stylesheet() . '/', '', $fs_root_path );
96 98
99 + // Check if the current file is part of the active theme.
100 + $is_current_sdk_from_active_theme = $file_path == $themes_directory . '/' . get_stylesheet() . '/' . $theme_candidate_sdk_basename . '/' . basename( $file_path );
101 + $is_current_sdk_from_parent_theme = false;
102 +
103 + // Check if the current file is part of the parent theme.
104 + if ( ! $is_current_sdk_from_active_theme ) {
105 + $theme_candidate_sdk_basename = str_replace( $themes_directory . '/' . get_template() . '/',
106 + '',
107 + $fs_root_path );
108 + $is_current_sdk_from_parent_theme = $file_path == $themes_directory . '/' . get_template() . '/' . $theme_candidate_sdk_basename . '/' . basename( $file_path );
109 + }
110 +
111 + $theme_name = null;
112 + if ( $is_current_sdk_from_active_theme ) {
113 + $theme_name = get_stylesheet();
114 + $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_name . '/' . $theme_candidate_sdk_basename;
115 + $is_theme = true;
116 + } else if ( $is_current_sdk_from_parent_theme ) {
117 + $theme_name = get_template();
118 + $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_name . '/' . $theme_candidate_sdk_basename;
119 + $is_theme = true;
120 + } else {
121 + $this_sdk_relative_path = plugin_basename( $fs_root_path );
122 + $is_theme = false;
123 +
124 + /**
125 + * If this file was included from another plugin with lower SDK version, and if this plugin is symlinked, then we need to get the actual plugin path,
126 + * as the value right now will be wrong, it will only remove the directory separator from the file_path.
127 + *
128 + * The check of `fs_find_direct_caller_plugin_file` determines that this file was indeed included by a different plugin than the main plugin.
129 + */
130 + if ( DIRECTORY_SEPARATOR . $this_sdk_relative_path === $fs_root_path && function_exists( 'fs_find_direct_caller_plugin_file' ) ) {
131 + $direct_caller_plugin_file = fs_find_direct_caller_plugin_file( $file_path );
132 +
133 + if ( ! empty( $direct_caller_plugin_file ) ) {
134 + $original_plugin_dir_name = dirname( $direct_caller_plugin_file );
135 +
136 + // Remove everything before the original plugin directory name.
137 + $this_sdk_relative_path = substr( $this_sdk_relative_path, strpos( $this_sdk_relative_path, $original_plugin_dir_name ) );
138 +
139 + unset( $original_plugin_dir_name );
140 + }
141 + }
142 + }
143 +
97 144 if ( ! isset( $fs_active_plugins ) ) {
98 145 // Load all Freemius powered active plugins.
99 146 $fs_active_plugins = get_option( 'fs_active_plugins' );
100 147
@@ -175,9 +222,10 @@
175 222 if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ||
176 223 $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version
177 224 ) {
178 225 if ( $is_theme ) {
179 - $plugin_path = basename( dirname( $this_sdk_relative_path ) );
226 + // Saving relative path and not only directory name as it could be a subfolder
227 + $plugin_path = $theme_name;
180 228 } else {
181 229 $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
182 230 }
183 231
@@ -224,13 +272,25 @@
224 272 $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ];
225 273
226 274 $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type );
227 275
228 - if ( ! $is_newest_sdk_type_theme ) {
229 - $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path );
230 - } else {
231 - $current_theme = wp_get_theme();
232 - $is_newest_sdk_plugin_active = ( $current_theme->stylesheet === $fs_newest_sdk->plugin_path );
276 + /**
277 + * @var bool $is_newest_sdk_module_active
278 + * True if the plugin with the newest SDK is active.
279 + * True if the newest SDK is part of the current theme or current theme's parent.
280 + * False otherwise.
281 + */
282 + if ( ! $is_newest_sdk_type_theme ) {
283 + $is_newest_sdk_module_active = is_plugin_active( $fs_newest_sdk->plugin_path );
284 + } else {
285 + $current_theme = wp_get_theme();
286 + // Detect if current theme is the one registered as newer SDK
287 + $is_newest_sdk_module_active = (
288 + strpos(
289 + $fs_newest_sdk->plugin_path,
290 + '../' . $themes_directory_name . '/' . $current_theme->get_stylesheet() . '/'
291 + ) === 0
292 + );
233 293
234 294 $current_theme_parent = $current_theme->parent();
235 295
236 296 /**
@@ -236,15 +296,21 @@
236 296 /**
237 297 * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop
238 298 * from happening by keeping the SDK info stored in the `fs_active_plugins` option.
239 299 */
240 - if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) {
241 - $is_newest_sdk_plugin_active = ( $fs_newest_sdk->plugin_path === $current_theme_parent->stylesheet );
300 + if ( ! $is_newest_sdk_module_active && $current_theme_parent instanceof WP_Theme ) {
301 + // Detect if current theme parent is the one registered as newer SDK
302 + $is_newest_sdk_module_active = (
303 + strpos(
304 + $fs_newest_sdk->plugin_path,
305 + '../' . $themes_directory_name . '/' . $current_theme_parent->get_stylesheet() . '/'
306 + ) === 0
307 + );
242 308 }
243 309 }
244 310
245 311 if ( $is_current_sdk_newest &&
246 - ! $is_newest_sdk_plugin_active &&
312 + ! $is_newest_sdk_module_active &&
247 313 ! $fs_active_plugins->newest->in_activation
248 314 ) {
249 315 // If current SDK is the newest and the plugin is NOT active, it means
250 316 // that the current plugin in activation mode.
@@ -261,9 +327,9 @@
261 327 . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path )
262 328 . '/start.php' );
263 329 }
264 330
265 - $is_newest_sdk_path_valid = ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) && file_exists( $sdk_starter_path );
331 + $is_newest_sdk_path_valid = ( $is_newest_sdk_module_active || $fs_active_plugins->newest->in_activation ) && file_exists( $sdk_starter_path );
266 332
267 333 if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) {
268 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
269 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
@@ -268,9 +334,9 @@
268 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
269 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
270 336 }
271 337
272 - if ( ! ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) ||
338 + if ( ! ( $is_newest_sdk_module_active || $fs_active_plugins->newest->in_activation ) ||
273 339 ! $is_newest_sdk_path_valid ||
274 340 // Is newest SDK downgraded.
275 341 ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
276 342 version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) )
@@ -283,9 +349,9 @@
283 349 */
284 350 // Find the active plugin with the newest SDK version and update the newest reference.
285 351 fs_fallback_to_newest_active_sdk();
286 352 } else {
287 - if ( $is_newest_sdk_plugin_active &&
353 + if ( $is_newest_sdk_module_active &&
288 354 $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
289 355 ( $fs_active_plugins->newest->in_activation ||
290 356 ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) )
291 357 )
@@ -312,9 +378,9 @@
312 378 // SDK was already loaded.
313 379 return;
314 380 }
315 381
316 - if ( version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) {
382 + if ( isset( $fs_active_plugins->newest ) && version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) {
317 383 $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
318 384
319 385 $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
320 386 WP_PLUGIN_DIR :
@@ -378,8 +444,10 @@
378 444 * fs_pending_activation_message_{plugin_slug}
379 445 * fs_is_submenu_visible_{plugin_slug}
380 446 * fs_plugin_icon_{plugin_slug}
381 447 * fs_show_trial_{plugin_slug}
448 + * fs_is_pricing_page_visible_{plugin_slug}
449 + * fs_checkout/parameters_{plugin_slug}
382 450 *
383 451 * --------------------------------------------------------
384 452 *
385 453 * Freemius actions collection:
@@ -385,8 +453,10 @@
385 453 * Freemius actions collection:
386 454 *
387 455 * fs_after_license_loaded_{plugin_slug}
388 456 * fs_after_license_change_{plugin_slug}
457 + * fs_after_license_activation_{plugin_slug}
458 + * fs_after_license_deactivation_{plugin_slug}
389 459 * fs_after_plans_sync_{plugin_slug}
390 460 *
391 461 * fs_after_account_details_{plugin_slug}
392 462 * fs_after_account_user_sync_{plugin_slug}