: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$site_url = Freemius::get_unfiltered_site_url( $blog_id, true, true );
if ( ! $this->_site->is_clone( $site_url ) ) {
! $only_if_manual_resolution_is_not_hidden ||
! FS_Clone_Manager::instance()->should_hide_manual_resolution()
* @author Leo Fajardo (@leorw)
* @param int|null $blog_id
* @param bool $strip_protocol
* @param bool $add_trailing_slash
static function get_unfiltered_site_url( $blog_id = null, $strip_protocol = false, $add_trailing_slash = false ) {
$url = ( ! is_multisite() && defined( 'WP_SITEURL' ) ) ? WP_SITEURL : self::get_site_url_from_wp_option( $blog_id );
$url = fs_strip_url_protocol( $url );
if ( $add_trailing_slash ) {
$url = trailingslashit( $url );
* @author Leo Fajardo (@leorw)
* @param int|null $blog_id
private static function get_site_url_from_wp_option( $blog_id = null ) {
$site_url_filters = array(
'pre_option_siteurl' => null,
'default_option_siteurl' => null,
'option_siteurl' => null,
// Detach all URL-related filters to get the actual site's URL (stripped of potential manipulations by multilingual plugins).
foreach ( $site_url_filters as $hook_name => $site_url_filter ) {
if ( ! empty( $wp_filter[ $hook_name ] ) ) {
$site_url_filters[ $hook_name ] = $wp_filter[ $hook_name ];
unset( $wp_filter[ $hook_name ] );
$url = get_site_url( $blog_id );
// Re-attach the filters back.
foreach ( $site_url_filters as $hook_name => $site_url_filter ) {
if ( ! empty( $site_url_filter ) ) {
$wp_filter[ $hook_name ] = $site_url_filter;
* @author Leo Fajardo (@leorw)
function fetch_install_by_id( $site_id ) {
return $this->get_current_or_network_user_api_scope()->get( "/installs/{$site_id}.json" );
* @author Leo Fajardo (@leorw)
* @return string|object|bool
function _handle_long_term_duplicate() {
$this->_logger->entrance();
$this->delete_current_install( false );
is_object( $this->_license ) &&
! $this->_license->is_utilized(
( WP_FS__IS_LOCALHOST_FOR_SERVER || FS_Site::is_localhost_by_address( self::get_unfiltered_site_url() ) )
$license_key = $this->_license->secret_key;
* @author Leo Fajardo (@leorw)
private static function migrate_options_to_network() {
self::migrate_accounts_to_network();
// Migrate API options from site level to network level.
$api_network_options = FS_Option_Manager::get_manager( WP_FS__OPTIONS_OPTION_NAME, true, true );
$api_network_options->migrate_to_network();
// Migrate API cache to network level storage.
FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME )->migrate_to_network();
self::$_accounts->set_option( 'ms_migration_complete', true, true );
#----------------------------------------------------------------------------------
#----------------------------------------------------------------------------------
* Load framework's text domain.
* @author Vova Feldman (@svovaf)
static function _load_textdomain() {
global $fs_active_plugins;
// Works both for plugins and themes.
$fs_active_plugins->newest->sdk_path . '/languages/'
#----------------------------------------------------------------------------------
#----------------------------------------------------------------------------------
* @author Vova Feldman (@svovaf)
static function _add_debug_section() {
if ( ! is_super_admin() ) {
// Add debug page only for super-admins.
self::$_static_logger->entrance();
$title = sprintf( '%s [v.%s]', fs_text_inline( 'Freemius Debug' ), WP_FS__SDK_VERSION );
// Add top-level debug menu item.
$hook = FS_Admin_Menu_Manager::add_page(
array( 'Freemius', '_debug_page_render' )
// Add hidden debug page.
$hook = FS_Admin_Menu_Manager::add_subpage(
array( 'Freemius', '_debug_page_render' )
if ( ! empty( $hook ) ) {
add_action( "load-$hook", array( 'Freemius', '_debug_page_actions' ) );
* @author Vova Feldman (@svovaf)
static function _toggle_debug_mode() {
check_admin_referer( 'fs_toggle_debug_mode' );
if ( ! is_super_admin() ) {
$is_on = fs_request_get( 'is_on', false, 'post' );
if ( fs_request_is_post() && in_array( $is_on, array( 0, 1 ) ) ) {
update_option( 'fs_debug_mode', $is_on );
// Turn on/off storage logging.
FS_Logger::_set_storage_logging( ( 1 == $is_on ) );
* @author Vova Feldman (@svovaf)
static function _get_debug_log() {
check_admin_referer( 'fs_get_debug_log' );
if ( ! is_super_admin() ) {
$limit = min( ! empty( $_POST['limit'] ) ? absint( $_POST['limit'] ) : 200, 200 );
$offset = min( ! empty( $_POST['offset'] ) ? absint( $_POST['offset'] ) : 200, 200 );
$logs = FS_Logger::load_db_logs(
fs_request_get( 'filters', false, 'post' ),
self::shoot_ajax_success( $logs );
* @author Vova Feldman (@svovaf)
static function _get_db_option() {
check_admin_referer( 'fs_get_db_option' );
$option_name = fs_request_get( 'option_name' );
if ( ! is_super_admin() ||
! fs_starts_with( $option_name, 'fs_' )
self::shoot_ajax_failure();
$value = get_option( $option_name );
if ( false !== $value ) {
if ( ! is_string( $value ) ) {
$value = json_encode( $value );
$result['value'] = $value;
self::shoot_ajax_success( $result );
* @author Vova Feldman (@svovaf)
static function _set_db_option() {
check_admin_referer( 'fs_set_db_option' );
$option_name = fs_request_get( 'option_name' );
if ( ! is_super_admin() ||
! fs_starts_with( $option_name, 'fs_' )
self::shoot_ajax_failure();
$option_value = fs_request_get_raw( 'option_value' );
if ( ! empty( $option_value ) ) {
update_option( $option_name, $option_value );
self::shoot_ajax_success();
* @author Vova Feldman (@svovaf)
static function _debug_page_actions() {
self::_clean_admin_content_section();
if ( fs_request_is_action( 'restart_freemius' ) ) {
check_admin_referer( 'restart_freemius' );
if ( ! is_multisite() ) {
self::$_accounts->clear( null, true );
$sites = self::get_sites();
foreach ( $sites as $site ) {
$blog_id = self::get_site_blog_id( $site );
self::$_accounts->clear( $blog_id, true );
// Clear network level storage.
self::$_accounts->clear( true, true );
// Clear SDK reference cache.
delete_option( 'fs_active_plugins' );
} else if ( fs_request_is_action( 'clear_updates_data' ) ) {
check_admin_referer( 'clear_updates_data' );
if ( ! is_multisite() ) {
set_site_transient( 'update_plugins', null );
set_site_transient( 'update_themes', null );
$current_blog_id = get_current_blog_id();
$sites = self::get_sites();
foreach ( $sites as $site ) {
switch_to_blog( self::get_site_blog_id( $site ) );
set_site_transient( 'update_plugins', null );
set_site_transient( 'update_themes', null );
switch_to_blog( $current_blog_id );
} else if ( fs_request_is_action( 'reset_deactivation_snoozing' ) ) {
check_admin_referer( 'reset_deactivation_snoozing' );
self::reset_deactivation_snoozing();
} else if ( fs_request_is_action( 'simulate_trial' ) ) {
check_admin_referer( 'simulate_trial' );
$fs = freemius( fs_request_get( 'module_id' ) );
// Update SDK install to at least 24 hours before.
$fs->_storage->install_timestamp = ( time() - WP_FS__TIME_24_HOURS_IN_SEC );
// Unset the trial shown timestamp.
unset( $fs->_storage->trial_promotion_shown );
} else if ( fs_request_is_action( 'simulate_network_upgrade' ) ) {
check_admin_referer( 'simulate_network_upgrade' );
$fs = freemius( fs_request_get( 'module_id' ) );
self::set_network_upgrade_mode( $fs->_storage );
} else if ( fs_request_is_action( 'delete_install' ) ) {
check_admin_referer( 'delete_install' );
self::_delete_site_by_slug(
fs_request_get( 'slug' ),
fs_request_get( 'module_type' ),
fs_request_get( 'blog_id', null )
} else if ( fs_request_is_action( 'delete_user' ) ) {
check_admin_referer( 'delete_user' );
self::delete_user( fs_request_get( 'user_id' ) );
} else if ( fs_request_is_action( 'download_logs' ) ) {
check_admin_referer( 'download_logs' );
$download_url = FS_Logger::download_db_logs(
fs_request_get( 'filters', false, 'post' )
if ( false === $download_url ) {
wp_die( 'Oops... there was an error while generating the logs download file. Please try again and if it doesn\'t work contact support@freemius.com.' );
fs_redirect( $download_url );
} else if ( fs_request_is_action( 'migrate_options_to_network' ) ) {
check_admin_referer( 'migrate_options_to_network' );
self::migrate_options_to_network();
* @author Leo Fajardo (@leorw)
static function get_all_modules_sites() {
self::$_static_logger->entrance();
WP_FS__MODULE_TYPE_PLUGIN => array(),
WP_FS__MODULE_TYPE_THEME => array(),
$module_types = array_keys( $sites_by_type );
if ( ! is_multisite() ) {
foreach ( $module_types as $type ) {
$sites_by_type[ $type ] = self::get_all_sites( $type );
foreach ( $sites_by_type[ $type ] as $slug => $install ) {
$sites_by_type[ $type ][ $slug ] = array( $install );
$sites = self::get_sites();
foreach ( $sites as $site ) {
$blog_id = self::get_site_blog_id( $site );
foreach ( $module_types as $type ) {
$installs = self::get_all_sites( $type, $blog_id );
foreach ( $installs as $slug => $install ) {
if ( ! isset( $sites_by_type[ $type ][ $slug ] ) ) {
$sites_by_type[ $type ][ $slug ] = array();
$install->blog_id = $blog_id;
$sites_by_type[ $type ][ $slug ][] = $install;
* @author Vova Feldman (@svovaf)
static function _debug_page_render() {
self::$_static_logger->entrance();
$all_modules_sites = self::get_all_modules_sites();
$licenses_by_module_type = self::get_all_licenses_by_module_type();
'plugin_sites' => $all_modules_sites[ WP_FS__MODULE_TYPE_PLUGIN ],
'theme_sites' => $all_modules_sites[ WP_FS__MODULE_TYPE_THEME ],
'users' => self::get_all_users(),
'addons' => self::get_all_addons(),
'account_addons' => self::get_all_account_addons(),
'plugin_licenses' => $licenses_by_module_type[ WP_FS__MODULE_TYPE_PLUGIN ],
'theme_licenses' => $licenses_by_module_type[ WP_FS__MODULE_TYPE_THEME ]
fs_enqueue_local_style( 'fs_debug', '/admin/debug.css' );
fs_require_once_template( 'debug.php', $vars );
#----------------------------------------------------------------------------------
#region Connectivity Issues
#----------------------------------------------------------------------------------
* Check if Freemius should be turned on for the current plugin install.
* $this->_is_on is updated in has_api_connectivity()
* @author Vova Feldman (@svovaf)