PluginProbe
TablePress – Tables in WordPress made easy / 3.4
TablePress – Tables in WordPress made easy v3.4
3.4 3.3.4 3.3.3 3.3.2 3.3.1 trunk 1.12 1.14 1.9.2 2.0.4 2.1.7 2.1.8 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3 2.3.1 2.3.2 2.4 2.4.1 2.4.2 2.4.3 All 45 releases
← All changes | libraries/freemius/start.php +95 -20 2.2 → 3.4 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.6.0';
18 + $this_sdk_version = '2.13.4';
19 19
20 20 #region SDK Selection Logic --------------------------------------------------------------------
21 21
22 22 /**
@@ -36,8 +36,17 @@
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 *
@@ -46,8 +55,11 @@
46 55 */
47 56 $file_path = fs_normalize_path( __FILE__ );
48 57 $fs_root_path = dirname( $file_path );
49 58
59 + // @todo: Remove this code after a few months when WP 6.3 usage is low enough.
60 + global $wp_version;
61 +
50 62 if (
51 63 ! function_exists( 'wp_get_current_user' ) &&
52 64 /**
53 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.
@@ -52,11 +64,13 @@
52 64 /**
53 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.
54 66 * @see theme-previews.php:wp_get_theme_preview_path()
55 67 *
56 - * @todo If this behavior is fixed in the core, we will remove this workaround.
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.
57 69 * @since WP 6.3.0
58 70 */
71 + version_compare( $wp_version, '6.3', '>=' ) &&
72 + version_compare( $wp_version, '6.3.1', '<=' ) &&
59 73 (
60 74 'site-editor.php' === basename( $_SERVER['SCRIPT_FILENAME'] ) ||
61 75 (
62 76 function_exists( 'wp_is_json_request' ) &&
@@ -75,19 +89,57 @@
75 89 *
76 90 * @author Leo Fajardo (@leorw)
77 91 * @since 2.2.3
78 92 */
79 - $themes_directory = get_theme_root( get_stylesheet() );
80 - $themes_directory_name = basename( $themes_directory );
81 - $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 );
82 95
83 - if ( $file_path == fs_normalize_path( realpath( trailingslashit( $themes_directory ) . $theme_candidate_basename . '/' . basename( $file_path ) ) )
84 - ) {
85 - $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_candidate_basename;
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 );
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;
86 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;
87 120 } else {
88 121 $this_sdk_relative_path = plugin_basename( $fs_root_path );
89 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 + }
90 142 }
91 143
92 144 if ( ! isset( $fs_active_plugins ) ) {
93 145 // Load all Freemius powered active plugins.
@@ -170,9 +222,10 @@
170 222 if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ||
171 223 $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version
172 224 ) {
173 225 if ( $is_theme ) {
174 - $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;
175 228 } else {
176 229 $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
177 230 }
178 231
@@ -219,13 +272,25 @@
219 272 $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ];
220 273
221 274 $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type );
222 275
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 + */
223 282 if ( ! $is_newest_sdk_type_theme ) {
224 - $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path );
283 + $is_newest_sdk_module_active = is_plugin_active( $fs_newest_sdk->plugin_path );
225 284 } else {
226 - $current_theme = wp_get_theme();
227 - $is_newest_sdk_plugin_active = ( $current_theme->stylesheet === $fs_newest_sdk->plugin_path );
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 + );
228 293
229 294 $current_theme_parent = $current_theme->parent();
230 295
231 296 /**
@@ -231,15 +296,21 @@
231 296 /**
232 297 * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop
233 298 * from happening by keeping the SDK info stored in the `fs_active_plugins` option.
234 299 */
235 - if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) {
236 - $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 + );
237 308 }
238 309 }
239 310
240 311 if ( $is_current_sdk_newest &&
241 - ! $is_newest_sdk_plugin_active &&
312 + ! $is_newest_sdk_module_active &&
242 313 ! $fs_active_plugins->newest->in_activation
243 314 ) {
244 315 // If current SDK is the newest and the plugin is NOT active, it means
245 316 // that the current plugin in activation mode.
@@ -256,9 +327,9 @@
256 327 . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path )
257 328 . '/start.php' );
258 329 }
259 330
260 - $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 );
261 332
262 333 if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) {
263 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
264 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
@@ -263,9 +334,9 @@
263 334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
264 335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
265 336 }
266 337
267 - 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 ) ||
268 339 ! $is_newest_sdk_path_valid ||
269 340 // Is newest SDK downgraded.
270 341 ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
271 342 version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) )
@@ -278,9 +349,9 @@
278 349 */
279 350 // Find the active plugin with the newest SDK version and update the newest reference.
280 351 fs_fallback_to_newest_active_sdk();
281 352 } else {
282 - if ( $is_newest_sdk_plugin_active &&
353 + if ( $is_newest_sdk_module_active &&
283 354 $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
284 355 ( $fs_active_plugins->newest->in_activation ||
285 356 ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) )
286 357 )
@@ -307,9 +378,9 @@
307 378 // SDK was already loaded.
308 379 return;
309 380 }
310 381
311 - 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, '<' ) ) {
312 383 $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
313 384
314 385 $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
315 386 WP_PLUGIN_DIR :
@@ -373,8 +444,10 @@
373 444 * fs_pending_activation_message_{plugin_slug}
374 445 * fs_is_submenu_visible_{plugin_slug}
375 446 * fs_plugin_icon_{plugin_slug}
376 447 * fs_show_trial_{plugin_slug}
448 + * fs_is_pricing_page_visible_{plugin_slug}
449 + * fs_checkout/parameters_{plugin_slug}
377 450 *
378 451 * --------------------------------------------------------
379 452 *
380 453 * Freemius actions collection:
@@ -380,8 +453,10 @@
380 453 * Freemius actions collection:
381 454 *
382 455 * fs_after_license_loaded_{plugin_slug}
383 456 * fs_after_license_change_{plugin_slug}
457 + * fs_after_license_activation_{plugin_slug}
458 + * fs_after_license_deactivation_{plugin_slug}
384 459 * fs_after_plans_sync_{plugin_slug}
385 460 *
386 461 * fs_after_account_details_{plugin_slug}
387 462 * fs_after_account_user_sync_{plugin_slug}