PluginProbe
BlockSpare – Gutenberg Blocks for News, Magazine, Blog & Business Websites / trunk
BlockSpare – Gutenberg Blocks for News, Magazine, Blog & Business Websites vtrunk
4.1.0 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.1.2 2.5.0 2.5.3 2.6.1 All 38 releases
← All changes | freemius/start.php +125 -27 2.6.1trunk 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.5.7';
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 *
@@ -45,8 +54,36 @@
45 54 * @since 1.2.2.6
46 55 */
47 56 $file_path = fs_normalize_path( __FILE__ );
48 57 $fs_root_path = dirname( $file_path );
58 +
59 + // @todo: Remove this code after a few months when WP 6.3 usage is low enough.
60 + global $wp_version;
61 +
62 + if (
63 + ! function_exists( 'wp_get_current_user' ) &&
64 + /**
65 + * `get_stylesheet()` will rely on `wp_get_current_user()` when it is being filtered by `theme-previews.php`. That happens only when the site editor is loaded or when the site editor is sending REST requests.
66 + * @see theme-previews.php:wp_get_theme_preview_path()
67 + *
68 + * @todo This behavior is already fixed in the core (WP 6.3.2+), and this code can be removed after a few months when WP 6.3 usage is low enough.
69 + * @since WP 6.3.0
70 + */
71 + version_compare( $wp_version, '6.3', '>=' ) &&
72 + version_compare( $wp_version, '6.3.1', '<=' ) &&
73 + (
74 + 'site-editor.php' === basename( $_SERVER['SCRIPT_FILENAME'] ) ||
75 + (
76 + function_exists( 'wp_is_json_request' ) &&
77 + wp_is_json_request() &&
78 + ! empty( $_GET['wp_theme_preview'] )
79 + )
80 + )
81 + ) {
82 + // Requiring this file since the call to get_stylesheet() below can trigger a call to wp_get_current_user() when previewing a theme.
83 + require_once ABSPATH . 'wp-includes/pluggable.php';
84 + }
85 +
49 86 /**
50 87 * Get the themes directory where the active theme is located (not passing the stylesheet will make WordPress
51 88 * assume that the themes directory is inside `wp-content`.
52 89 *
@@ -52,21 +89,59 @@
52 89 *
53 90 * @author Leo Fajardo (@leorw)
54 91 * @since 2.2.3
55 92 */
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 );
93 + $themes_directory = fs_normalize_path( get_theme_root( get_stylesheet() ) );
94 + $themes_directory_name = basename( $themes_directory );
59 95
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 - }
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 );
68 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 +
69 144 if ( ! isset( $fs_active_plugins ) ) {
70 145 // Load all Freemius powered active plugins.
71 146 $fs_active_plugins = get_option( 'fs_active_plugins' );
72 147
@@ -147,9 +222,10 @@
147 222 if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ||
148 223 $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version
149 224 ) {
150 225 if ( $is_theme ) {
151 - $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;
152 228 } else {
153 229 $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
154 230 }
155 231
@@ -196,13 +272,25 @@
196 272 $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ];
197 273
198 274 $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type );
199 275
200 - if ( ! $is_newest_sdk_type_theme ) {
201 - $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path );
202 - } else {
203 - $current_theme = wp_get_theme();
204 - $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 + );
205 293
206 294 $current_theme_parent = $current_theme->parent();
207 295
208 296 /**
@@ -208,15 +296,21 @@
208 296 /**
209 297 * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop
210 298 * from happening by keeping the SDK info stored in the `fs_active_plugins` option.
211 299 */
212 - if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) {
213 - $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 + );
214 308 }
215 309 }
216 310
217 311 if ( $is_current_sdk_newest &&
218 - ! $is_newest_sdk_plugin_active &&
312 + ! $is_newest_sdk_module_active &&
219 313 ! $fs_active_plugins->newest->in_activation
220 314 ) {
221 315 // If current SDK is the newest and the plugin is NOT active, it means
222 316 // that the current plugin in activation mode.
@@ -233,9 +327,9 @@
233 327 . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path )
234 328 . '/start.php' );
235 329 }
236 330
237 - $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 );
238 332
239 333 if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) {
240 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
241 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
@@ -240,9 +334,9 @@
240 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
241 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
242 336 }
243 337
244 - 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 ) ||
245 339 ! $is_newest_sdk_path_valid ||
246 340 // Is newest SDK downgraded.
247 341 ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
248 342 version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) )
@@ -255,9 +349,9 @@
255 349 */
256 350 // Find the active plugin with the newest SDK version and update the newest reference.
257 351 fs_fallback_to_newest_active_sdk();
258 352 } else {
259 - if ( $is_newest_sdk_plugin_active &&
353 + if ( $is_newest_sdk_module_active &&
260 354 $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
261 355 ( $fs_active_plugins->newest->in_activation ||
262 356 ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) )
263 357 )
@@ -284,9 +378,9 @@
284 378 // SDK was already loaded.
285 379 return;
286 380 }
287 381
288 - 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, '<' ) ) {
289 383 $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
290 384
291 385 $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
292 386 WP_PLUGIN_DIR :
@@ -350,8 +444,10 @@
350 444 * fs_pending_activation_message_{plugin_slug}
351 445 * fs_is_submenu_visible_{plugin_slug}
352 446 * fs_plugin_icon_{plugin_slug}
353 447 * fs_show_trial_{plugin_slug}
448 + * fs_is_pricing_page_visible_{plugin_slug}
449 + * fs_checkout/parameters_{plugin_slug}
354 450 *
355 451 * --------------------------------------------------------
356 452 *
357 453 * Freemius actions collection:
@@ -357,8 +453,10 @@
357 453 * Freemius actions collection:
358 454 *
359 455 * fs_after_license_loaded_{plugin_slug}
360 456 * fs_after_license_change_{plugin_slug}
457 + * fs_after_license_activation_{plugin_slug}
458 + * fs_after_license_deactivation_{plugin_slug}
361 459 * fs_after_plans_sync_{plugin_slug}
362 460 *
363 461 * fs_after_account_details_{plugin_slug}
364 462 * fs_after_account_user_sync_{plugin_slug}