PluginProbe
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs / 5.0.1
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs v5.0.1
5.0.1 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 All 39 releases
← All changes | freemius/start.php +132 -30 1.3.0 → 5.0.1 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.4.1';
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,25 +89,67 @@
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 - $fs_active_plugins = get_option( 'fs_active_plugins', new stdClass() );
146 + $fs_active_plugins = get_option( 'fs_active_plugins' );
72 147
148 + if ( ! is_object( $fs_active_plugins ) ) {
149 + $fs_active_plugins = new stdClass();
150 + }
151 +
73 152 if ( ! isset( $fs_active_plugins->plugins ) ) {
74 153 $fs_active_plugins->plugins = array();
75 154 }
76 155 }
@@ -143,9 +222,10 @@
143 222 if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ||
144 223 $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version
145 224 ) {
146 225 if ( $is_theme ) {
147 - $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;
148 228 } else {
149 229 $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
150 230 }
151 231
@@ -192,13 +272,25 @@
192 272 $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ];
193 273
194 274 $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type );
195 275
196 - if ( ! $is_newest_sdk_type_theme ) {
197 - $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path );
198 - } else {
199 - $current_theme = wp_get_theme();
200 - $is_newest_sdk_plugin_active = ( $current_theme->stylesheet === $fs_newest_sdk->plugin_path );
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 + );
201 293
202 294 $current_theme_parent = $current_theme->parent();
203 295
204 296 /**
@@ -204,15 +296,21 @@
204 296 /**
205 297 * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop
206 298 * from happening by keeping the SDK info stored in the `fs_active_plugins` option.
207 299 */
208 - if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) {
209 - $is_newest_sdk_plugin_active = ( $fs_newest_sdk->plugin_path === $current_theme_parent->stylesheet );
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 + );
210 308 }
211 309 }
212 310
213 311 if ( $is_current_sdk_newest &&
214 - ! $is_newest_sdk_plugin_active &&
312 + ! $is_newest_sdk_module_active &&
215 313 ! $fs_active_plugins->newest->in_activation
216 314 ) {
217 315 // If current SDK is the newest and the plugin is NOT active, it means
218 316 // that the current plugin in activation mode.
@@ -229,9 +327,9 @@
229 327 . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path )
230 328 . '/start.php' );
231 329 }
232 330
233 - $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 );
234 332
235 333 if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) {
236 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
237 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
@@ -236,9 +334,9 @@
236 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
237 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
238 336 }
239 337
240 - 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 ) ||
241 339 ! $is_newest_sdk_path_valid ||
242 340 // Is newest SDK downgraded.
243 341 ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
244 342 version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) )
@@ -251,9 +349,9 @@
251 349 */
252 350 // Find the active plugin with the newest SDK version and update the newest reference.
253 351 fs_fallback_to_newest_active_sdk();
254 352 } else {
255 - if ( $is_newest_sdk_plugin_active &&
353 + if ( $is_newest_sdk_module_active &&
256 354 $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
257 355 ( $fs_active_plugins->newest->in_activation ||
258 356 ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) )
259 357 )
@@ -280,9 +378,9 @@
280 378 // SDK was already loaded.
281 379 return;
282 380 }
283 381
284 - 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, '<' ) ) {
285 383 $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
286 384
287 385 $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
288 386 WP_PLUGIN_DIR :
@@ -346,8 +444,10 @@
346 444 * fs_pending_activation_message_{plugin_slug}
347 445 * fs_is_submenu_visible_{plugin_slug}
348 446 * fs_plugin_icon_{plugin_slug}
349 447 * fs_show_trial_{plugin_slug}
448 + * fs_is_pricing_page_visible_{plugin_slug}
449 + * fs_checkout/parameters_{plugin_slug}
350 450 *
351 451 * --------------------------------------------------------
352 452 *
353 453 * Freemius actions collection:
@@ -353,8 +453,10 @@
353 453 * Freemius actions collection:
354 454 *
355 455 * fs_after_license_loaded_{plugin_slug}
356 456 * fs_after_license_change_{plugin_slug}
457 + * fs_after_license_activation_{plugin_slug}
458 + * fs_after_license_deactivation_{plugin_slug}
357 459 * fs_after_plans_sync_{plugin_slug}
358 460 *
359 461 * fs_after_account_details_{plugin_slug}
360 462 * fs_after_account_user_sync_{plugin_slug}
@@ -511,9 +613,9 @@
511 613 return $fs;
512 614 }
513 615
514 616 /**
515 - * @param array <string,string> $module Plugin or Theme details.
617 + * @param array <string,string|bool|array> $module Plugin or Theme details.
516 618 *
517 619 * @return Freemius
518 620 * @throws Freemius_Exception
519 621 */
@@ -526,5 +628,5 @@
526 628
527 629 function fs_dump_log() {
528 630 FS_Logger::dump();
529 631 }
530 - }
632 + }