PluginProbe ʕ •ᴥ•ʔ
Royal Addons for Elementor – Addons and Templates Kit for Elementor / 1.7.1064
Royal Addons for Elementor – Addons and Templates Kit for Elementor v1.7.1064
1.7.1064 1.7.1063 1.7.1062 1.7.1061 1.7.1060 1.7.1059 1.7.1058 trunk 1.0.0 1.1.0 1.2 1.3 1.3.1 1.3.2 1.3.21 1.3.22 1.3.23 1.3.24 1.3.25 1.3.26 1.3.27 1.3.28 1.3.29 1.3.30 1.3.31 1.3.32 1.3.33 1.3.34 1.3.35 1.3.36 1.3.37 1.3.38 1.3.39 1.3.40 1.3.41 1.3.42 1.3.43 1.3.44 1.3.45 1.3.46 1.3.47 1.3.48 1.3.49 1.3.50 1.3.51 1.3.52 1.3.53 1.3.54 1.3.55 1.3.56 1.3.57 1.3.58 1.3.59 1.3.60 1.3.61 1.3.62 1.3.63 1.3.64 1.3.65 1.3.66 1.3.67 1.3.68 1.3.69 1.3.70 1.3.71 1.3.72 1.3.73 1.3.74 1.3.75 1.3.76 1.3.77 1.3.78 1.3.79 1.3.80 1.3.81 1.3.82 1.3.83 1.3.84 1.3.85 1.3.86 1.3.87 1.3.88 1.3.89 1.3.90 1.3.91 1.3.92 1.3.93 1.3.94 1.3.95 1.3.96 1.3.97 1.3.971 1.3.972 1.3.973 1.3.974 1.3.975 1.3.976 1.3.977 1.3.978 1.3.979 1.3.980 1.3.981 1.3.982 1.3.983 1.3.984 1.3.985 1.3.986 1.3.987 1.7.1 1.7.1001 1.7.1002 1.7.1003 1.7.1004 1.7.1005 1.7.1006 1.7.1007 1.7.1008 1.7.1009 1.7.1010 1.7.1011 1.7.1012 1.7.1013 1.7.1014 1.7.1015 1.7.1016 1.7.1017 1.7.1018 1.7.1019 1.7.1020 1.7.1021 1.7.1022 1.7.1023 1.7.1024 1.7.1025 1.7.1026 1.7.1027 1.7.1028 1.7.1029 1.7.1030 1.7.1031 1.7.1032 1.7.1033 1.7.1034 1.7.1035 1.7.1036 1.7.1037 1.7.1038 1.7.1039 1.7.1040 1.7.1041 1.7.1042 1.7.1043 1.7.1044 1.7.1045 1.7.1046 1.7.1047 1.7.1048 1.7.1049 1.7.1050 1.7.1051 1.7.1052 1.7.1053 1.7.1054 1.7.1055 1.7.1056 1.7.1057
royal-elementor-addons / freemius / start.php
royal-elementor-addons / freemius Last commit date
assets 5 days ago includes 5 days ago languages 5 days ago templates 5 days ago LICENSE.txt 5 days ago README.md 5 days ago composer.json 5 days ago config.php 5 days ago index.php 5 days ago require.php 5 days ago start.php 5 days ago
start.php
630 lines
1 <?php
2 /**
3 * @package Freemius
4 * @copyright Copyright (c) 2015, Freemius, Inc.
5 * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6 * @since 1.0.3
7 */
8
9 if ( ! defined( 'ABSPATH' ) ) {
10 return;
11 }
12
13 /**
14 * Freemius SDK Version.
15 *
16 * @var string
17 */
18 $this_sdk_version = '2.12.0';
19
20 #region SDK Selection Logic --------------------------------------------------------------------
21
22 /**
23 * Special logic added on 1.1.6 to make sure that every Freemius powered plugin
24 * will ALWAYS be loaded with the newest SDK from the active Freemius powered plugins.
25 *
26 * Since Freemius SDK is backward compatible, this will make sure that all Freemius powered
27 * plugins will run correctly.
28 *
29 * @since 1.1.6
30 */
31
32 global $fs_active_plugins;
33
34 if ( ! function_exists( 'fs_find_caller_plugin_file' ) ) {
35 // Require SDK essentials.
36 require_once dirname( __FILE__ ) . '/includes/fs-essential-functions.php';
37 }
38
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 *
49 * This complex logic fixes symlink issues (e.g. with Vargant). The logic assumes
50 * that if it's a file from an SDK running in a theme, the location of the SDK
51 * is in the main theme's folder.
52 *
53 * @author Vova Feldman (@svovaf)
54 * @since 1.2.2.6
55 */
56 $file_path = fs_normalize_path( __FILE__ );
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
86 /**
87 * Get the themes directory where the active theme is located (not passing the stylesheet will make WordPress
88 * assume that the themes directory is inside `wp-content`.
89 *
90 * @author Leo Fajardo (@leorw)
91 * @since 2.2.3
92 */
93 $themes_directory = fs_normalize_path( get_theme_root( get_stylesheet() ) );
94 $themes_directory_name = basename( $themes_directory );
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 );
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
144 if ( ! isset( $fs_active_plugins ) ) {
145 // Load all Freemius powered active plugins.
146 $fs_active_plugins = get_option( 'fs_active_plugins' );
147
148 if ( ! is_object( $fs_active_plugins ) ) {
149 $fs_active_plugins = new stdClass();
150 }
151
152 if ( ! isset( $fs_active_plugins->plugins ) ) {
153 $fs_active_plugins->plugins = array();
154 }
155 }
156
157 if ( empty( $fs_active_plugins->abspath ) ) {
158 /**
159 * Store the WP install absolute path reference to identify environment change
160 * while replicating the storage.
161 *
162 * @author Vova Feldman (@svovaf)
163 * @since 1.2.1.7
164 */
165 $fs_active_plugins->abspath = ABSPATH;
166 } else {
167 if ( ABSPATH !== $fs_active_plugins->abspath ) {
168 /**
169 * WordPress path has changed, cleanup the SDK references cache.
170 * This resolves issues triggered when spinning a staging environments
171 * while replicating the database.
172 *
173 * @author Vova Feldman (@svovaf)
174 * @since 1.2.1.7
175 */
176 $fs_active_plugins->abspath = ABSPATH;
177 $fs_active_plugins->plugins = array();
178 unset( $fs_active_plugins->newest );
179 } else {
180 /**
181 * Make sure SDK references are still valid. This resolves
182 * issues when users hard delete modules via FTP.
183 *
184 * @author Vova Feldman (@svovaf)
185 * @since 1.2.1.7
186 */
187 $has_changes = false;
188 foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) {
189 if ( ! file_exists( ( isset( $data->type ) && 'theme' === $data->type ? $themes_directory : WP_PLUGIN_DIR ) . '/' . $sdk_path ) ) {
190 unset( $fs_active_plugins->plugins[ $sdk_path ] );
191
192 if (
193 ! empty( $fs_active_plugins->newest ) &&
194 $sdk_path === $fs_active_plugins->newest->sdk_path
195 ) {
196 unset( $fs_active_plugins->newest );
197 }
198
199 $has_changes = true;
200 }
201 }
202
203 if ( $has_changes ) {
204 if ( empty( $fs_active_plugins->plugins ) ) {
205 unset( $fs_active_plugins->newest );
206 }
207
208 update_option( 'fs_active_plugins', $fs_active_plugins );
209 }
210 }
211 }
212
213 if ( ! function_exists( 'fs_find_direct_caller_plugin_file' ) ) {
214 require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-1.1.7.1.php';
215 }
216
217 if ( ! function_exists( 'fs_get_plugins' ) ) {
218 require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-2.2.1.php';
219 }
220
221 // Update current SDK info based on the SDK path.
222 if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ||
223 $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version
224 ) {
225 if ( $is_theme ) {
226 // Saving relative path and not only directory name as it could be a subfolder
227 $plugin_path = $theme_name;
228 } else {
229 $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) );
230 }
231
232 $fs_active_plugins->plugins[ $this_sdk_relative_path ] = (object) array(
233 'version' => $this_sdk_version,
234 'type' => ( $is_theme ? 'theme' : 'plugin' ),
235 'timestamp' => time(),
236 'plugin_path' => $plugin_path,
237 );
238 }
239
240 $is_current_sdk_newest = isset( $fs_active_plugins->newest ) && ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path );
241
242 if ( ! isset( $fs_active_plugins->newest ) ) {
243 /**
244 * This will be executed only once, for the first time a Freemius powered plugin is activated.
245 */
246 fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path );
247
248 $is_current_sdk_newest = true;
249 } else if ( version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '<' ) ) {
250 /**
251 * Current SDK is newer than the newest stored SDK.
252 */
253 fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path );
254
255 if ( class_exists( 'Freemius' ) ) {
256 // Older SDK version was already loaded.
257
258 if ( ! $fs_active_plugins->newest->in_activation ) {
259 // Re-order plugins to load this plugin first.
260 fs_newest_sdk_plugin_first();
261 }
262
263 // Refresh page.
264 fs_redirect( $_SERVER['REQUEST_URI'] );
265 }
266 } else {
267 if ( ! function_exists( 'get_plugins' ) ) {
268 require_once ABSPATH . 'wp-admin/includes/plugin.php';
269 }
270
271 $fs_newest_sdk = $fs_active_plugins->newest;
272 $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ];
273
274 $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type );
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 */
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 );
293
294 $current_theme_parent = $current_theme->parent();
295
296 /**
297 * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop
298 * from happening by keeping the SDK info stored in the `fs_active_plugins` option.
299 */
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 );
308 }
309 }
310
311 if ( $is_current_sdk_newest &&
312 ! $is_newest_sdk_module_active &&
313 ! $fs_active_plugins->newest->in_activation
314 ) {
315 // If current SDK is the newest and the plugin is NOT active, it means
316 // that the current plugin in activation mode.
317 $fs_active_plugins->newest->in_activation = true;
318 update_option( 'fs_active_plugins', $fs_active_plugins );
319 }
320
321 if ( ! $is_theme ) {
322 $sdk_starter_path = fs_normalize_path( WP_PLUGIN_DIR . '/' . $this_sdk_relative_path . '/start.php' );
323 } else {
324 $sdk_starter_path = fs_normalize_path(
325 $themes_directory
326 . '/'
327 . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path )
328 . '/start.php' );
329 }
330
331 $is_newest_sdk_path_valid = ( $is_newest_sdk_module_active || $fs_active_plugins->newest->in_activation ) && file_exists( $sdk_starter_path );
332
333 if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) {
334 // Plugin with newest SDK is no longer active, or SDK was moved to a different location.
335 unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] );
336 }
337
338 if ( ! ( $is_newest_sdk_module_active || $fs_active_plugins->newest->in_activation ) ||
339 ! $is_newest_sdk_path_valid ||
340 // Is newest SDK downgraded.
341 ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
342 version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) )
343 ) {
344 /**
345 * Plugin with newest SDK is no longer active.
346 * OR
347 * The newest SDK was in the current plugin. BUT, seems like the version of
348 * the SDK was downgraded to a lower SDK.
349 */
350 // Find the active plugin with the newest SDK version and update the newest reference.
351 fs_fallback_to_newest_active_sdk();
352 } else {
353 if ( $is_newest_sdk_module_active &&
354 $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path &&
355 ( $fs_active_plugins->newest->in_activation ||
356 ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) )
357 )
358
359 ) {
360 if ( $fs_active_plugins->newest->in_activation && ! $is_newest_sdk_type_theme ) {
361 // Plugin no more in activation.
362 $fs_active_plugins->newest->in_activation = false;
363 update_option( 'fs_active_plugins', $fs_active_plugins );
364 }
365
366 // Reorder plugins to load plugin with newest SDK first.
367 if ( fs_newest_sdk_plugin_first() ) {
368 // Refresh page after re-order to make sure activated plugin loads newest SDK.
369 if ( class_exists( 'Freemius' ) ) {
370 fs_redirect( $_SERVER['REQUEST_URI'] );
371 }
372 }
373 }
374 }
375 }
376
377 if ( class_exists( 'Freemius' ) ) {
378 // SDK was already loaded.
379 return;
380 }
381
382 if ( isset( $fs_active_plugins->newest ) && version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) {
383 $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ];
384
385 $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ?
386 WP_PLUGIN_DIR :
387 $themes_directory;
388
389 $newest_sdk_starter = fs_normalize_path(
390 $plugins_or_theme_dir_path
391 . '/'
392 . str_replace( "../{$themes_directory_name}/", '', $fs_active_plugins->newest->sdk_path )
393 . '/start.php' );
394
395 if ( file_exists( $newest_sdk_starter ) ) {
396 // Reorder plugins to load plugin with newest SDK first.
397 fs_newest_sdk_plugin_first();
398
399 // There's a newer SDK version, load it instead of the current one!
400 require_once $newest_sdk_starter;
401
402 return;
403 }
404 }
405
406 #endregion SDK Selection Logic --------------------------------------------------------------------
407
408 #region Hooks & Filters Collection --------------------------------------------------------------------
409
410 /**
411 * Freemius hooks (actions & filters) tags structure:
412 *
413 * fs_{filter/action_name}_{plugin_slug}
414 *
415 * --------------------------------------------------------
416 *
417 * Usage with WordPress' add_action() / add_filter():
418 *
419 * add_action('fs_{filter/action_name}_{plugin_slug}', $callable);
420 *
421 * --------------------------------------------------------
422 *
423 * Usage with Freemius' instance add_action() / add_filter():
424 *
425 * // No need to add 'fs_' prefix nor '_{plugin_slug}' suffix.
426 * my_freemius()->add_action('{action_name}', $callable);
427 *
428 * --------------------------------------------------------
429 *
430 * Freemius filters collection:
431 *
432 * fs_connect_url_{plugin_slug}
433 * fs_trial_promotion_message_{plugin_slug}
434 * fs_is_long_term_user_{plugin_slug}
435 * fs_uninstall_reasons_{plugin_slug}
436 * fs_is_plugin_update_{plugin_slug}
437 * fs_api_domains_{plugin_slug}
438 * fs_email_template_sections_{plugin_slug}
439 * fs_support_forum_submenu_{plugin_slug}
440 * fs_support_forum_url_{plugin_slug}
441 * fs_connect_message_{plugin_slug}
442 * fs_connect_message_on_update_{plugin_slug}
443 * fs_uninstall_confirmation_message_{plugin_slug}
444 * fs_pending_activation_message_{plugin_slug}
445 * fs_is_submenu_visible_{plugin_slug}
446 * fs_plugin_icon_{plugin_slug}
447 * fs_show_trial_{plugin_slug}
448 * fs_is_pricing_page_visible_{plugin_slug}
449 *
450 * --------------------------------------------------------
451 *
452 * Freemius actions collection:
453 *
454 * fs_after_license_loaded_{plugin_slug}
455 * fs_after_license_change_{plugin_slug}
456 * fs_after_plans_sync_{plugin_slug}
457 *
458 * fs_after_account_details_{plugin_slug}
459 * fs_after_account_user_sync_{plugin_slug}
460 * fs_after_account_plan_sync_{plugin_slug}
461 * fs_before_account_load_{plugin_slug}
462 * fs_after_account_connection_{plugin_slug}
463 * fs_account_property_edit_{plugin_slug}
464 * fs_account_email_verified_{plugin_slug}
465 * fs_account_page_load_before_departure_{plugin_slug}
466 * fs_before_account_delete_{plugin_slug}
467 * fs_after_account_delete_{plugin_slug}
468 *
469 * fs_sdk_version_update_{plugin_slug}
470 * fs_plugin_version_update_{plugin_slug}
471 *
472 * fs_initiated_{plugin_slug}
473 * fs_after_init_plugin_registered_{plugin_slug}
474 * fs_after_init_plugin_anonymous_{plugin_slug}
475 * fs_after_init_plugin_pending_activations_{plugin_slug}
476 * fs_after_init_addon_registered_{plugin_slug}
477 * fs_after_init_addon_anonymous_{plugin_slug}
478 * fs_after_init_addon_pending_activations_{plugin_slug}
479 *
480 * fs_after_premium_version_activation_{plugin_slug}
481 * fs_after_free_version_reactivation_{plugin_slug}
482 *
483 * fs_after_uninstall_{plugin_slug}
484 * fs_before_admin_menu_init_{plugin_slug}
485 */
486
487 #endregion Hooks & Filters Collection --------------------------------------------------------------------
488
489 if ( ! class_exists( 'Freemius' ) ) {
490
491 if ( ! defined( 'WP_FS__SDK_VERSION' ) ) {
492 define( 'WP_FS__SDK_VERSION', $this_sdk_version );
493 }
494
495 $plugins_or_theme_dir_path = fs_normalize_path( trailingslashit( $is_theme ?
496 $themes_directory :
497 WP_PLUGIN_DIR ) );
498
499 if ( 0 === strpos( $file_path, $plugins_or_theme_dir_path ) ) {
500 // No symlinks
501 } else {
502 /**
503 * This logic finds the SDK symlink and set WP_FS__DIR to use it.
504 *
505 * @author Vova Feldman (@svovaf)
506 * @since 1.2.2.5
507 */
508 $sdk_symlink = null;
509
510 // Try to load SDK's symlink from cache.
511 if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
512 is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
513 ! empty( $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink )
514 ) {
515 $sdk_symlink = $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink;
516 if ( 0 === strpos( $sdk_symlink, $plugins_or_theme_dir_path ) ) {
517 /**
518 * Make the symlink path relative.
519 *
520 * @author Leo Fajardo (@leorw)
521 */
522 $sdk_symlink = substr( $sdk_symlink, strlen( $plugins_or_theme_dir_path ) );
523
524 $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink;
525 update_option( 'fs_active_plugins', $fs_active_plugins );
526 }
527
528 $realpath = realpath( $plugins_or_theme_dir_path . $sdk_symlink );
529 if ( ! is_string( $realpath ) || ! file_exists( $realpath ) ) {
530 $sdk_symlink = null;
531 }
532 }
533
534 if ( empty( $sdk_symlink ) ) // Has symlinks, therefore, we need to configure WP_FS__DIR based on the symlink.
535 {
536 $partial_path_right = basename( $file_path );
537 $partial_path_left = dirname( $file_path );
538 $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right );
539
540 while ( '/' !== $partial_path_left &&
541 ( false === $realpath || $file_path !== fs_normalize_path( $realpath ) )
542 ) {
543 $partial_path_right = trailingslashit( basename( $partial_path_left ) ) . $partial_path_right;
544 $partial_path_left_prev = $partial_path_left;
545 $partial_path_left = dirname( $partial_path_left_prev );
546
547 /**
548 * Avoid infinite loop if for example `$partial_path_left_prev` is `C:/`, in this case,
549 * `dirname( 'C:/' )` will return `C:/`.
550 *
551 * @author Leo Fajardo (@leorw)
552 */
553 if ( $partial_path_left === $partial_path_left_prev ) {
554 $partial_path_left = '';
555 break;
556 }
557
558 $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right );
559 }
560
561 if ( ! empty( $partial_path_left ) && '/' !== $partial_path_left ) {
562 $sdk_symlink = fs_normalize_path( dirname( $partial_path_right ) );
563
564 // Cache value.
565 if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) &&
566 is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] )
567 ) {
568 $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink;
569 update_option( 'fs_active_plugins', $fs_active_plugins );
570 }
571 }
572 }
573
574 if ( ! empty( $sdk_symlink ) ) {
575 // Set SDK dir to the symlink path.
576 define( 'WP_FS__DIR', $plugins_or_theme_dir_path . $sdk_symlink );
577 }
578 }
579
580 // Load SDK files.
581 require_once dirname( __FILE__ ) . '/require.php';
582
583 /**
584 * Quick shortcut to get Freemius for specified plugin.
585 * Used by various templates.
586 *
587 * @param number $module_id
588 *
589 * @return Freemius
590 */
591 function freemius( $module_id ) {
592 return Freemius::instance( $module_id );
593 }
594
595 /**
596 * @param string $slug
597 * @param number $plugin_id
598 * @param string $public_key
599 * @param bool $is_live Is live or test plugin.
600 * @param bool $is_premium Hints freemius if running the premium plugin or not.
601 *
602 * @return Freemius
603 *
604 * @deprecated Please use fs_dynamic_init().
605 */
606 function fs_init( $slug, $plugin_id, $public_key, $is_live = true, $is_premium = true ) {
607 $fs = Freemius::instance( $plugin_id, $slug, true );
608 $fs->init( $plugin_id, $public_key, $is_live, $is_premium );
609
610 return $fs;
611 }
612
613 /**
614 * @param array <string,string|bool|array> $module Plugin or Theme details.
615 *
616 * @return Freemius
617 * @throws Freemius_Exception
618 */
619 function fs_dynamic_init( $module ) {
620 $fs = Freemius::instance( $module['id'], $module['slug'], true );
621 $fs->dynamic_init( $module );
622
623 return $fs;
624 }
625
626 function fs_dump_log() {
627 FS_Logger::dump();
628 }
629 }
630