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 +132 -30 1.3.2trunk 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 + }