: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* @author Vova Feldman (@svovaf)
function get_plugin_title() {
$this->_logger->entrance();
$title = $this->_plugin->title;
return $this->apply_filters( 'plugin_title', $title );
* @author Vova Feldman (@svovaf)
function get_module_label( $lowercase = false ) {
$label = $this->is_addon() ?
$this->get_text_inline( 'Add-On', 'addon' ) :
$this->get_text_inline( 'Plugin', 'plugin' ) :
$this->get_text_inline( 'Theme', 'theme' ) );
$label = strtolower( $label );
* @author Vova Feldman (@svovaf)
function get_plugin_basename() {
if ( ! isset( $this->_plugin_basename ) ) {
if ( $this->is_plugin() ) {
$this->_plugin_basename = plugin_basename( $this->_plugin_main_file_path );
$this->_plugin_basename = basename( dirname( $this->_plugin_main_file_path ) );
return $this->_plugin_basename;
function get_plugin_folder_name() {
$this->_logger->entrance();
$plugin_folder = $this->_plugin_basename;
while ( '.' !== dirname( $plugin_folder ) ) {
$plugin_folder = dirname( $plugin_folder );
$this->_logger->departure( 'Folder Name = ' . $plugin_folder );
#endregion ------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------*/
* Find plugin's slug by plugin's basename.
* @author Vova Feldman (@svovaf)
* @param string $plugin_base_name
private static function find_slug_by_basename( $plugin_base_name ) {
$file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() );
if ( ! array( $file_slug_map ) || ! isset( $file_slug_map[ $plugin_base_name ] ) ) {
return $file_slug_map[ $plugin_base_name ];
* Store the map between the plugin's basename to the slug.
* @author Vova Feldman (@svovaf)
private function store_file_slug_map() {
$file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() );
if ( ! array( $file_slug_map ) ) {
$file_slug_map = array();
if ( ! isset( $file_slug_map[ $this->_plugin_basename ] ) ||
$file_slug_map[ $this->_plugin_basename ] !== $this->_slug
$file_slug_map[ $this->_plugin_basename ] = $this->_slug;
self::$_accounts->set_option( 'file_slug_map', $file_slug_map, true );
* @return array[number]FS_User
static function get_all_users() {
$users = self::maybe_get_entities_account_option( 'users', array() );
if ( ! is_array( $users ) ) {
* @param string $module_type
* @param null|int $blog_id Since 2.0.0
* @return array[string]FS_Site
private static function get_all_sites(
$module_type = WP_FS__MODULE_TYPE_PLUGIN,
$sites = self::get_account_option(
( $is_backup ? 'prev_' : '' ) . 'sites',
if ( ! is_array( $sites ) ) {
* @author Leo Fajardo (@leorw)
* @param string $option_name
* @param string $module_type
* @param null|int $network_level_or_blog_id Since 2.0.0
private static function get_account_option( $option_name, $module_type = null, $network_level_or_blog_id = null ) {
if ( ! is_null( $module_type ) && WP_FS__MODULE_TYPE_PLUGIN !== $module_type ) {
$option_name = $module_type . '_' . $option_name;
return self::maybe_get_entities_account_option( $option_name, array(), $network_level_or_blog_id );
* @author Leo Fajardo (@leorw)
* @param string $option_name
* @param mixed $option_value
* @param null|int $network_level_or_blog_id Since 2.0.0
private function set_account_option( $option_name, $option_value, $store, $network_level_or_blog_id = null ) {
self::set_account_option_by_module(
$network_level_or_blog_id
* @author Vova Feldman (@svovaf)
* @param string $module_type
* @param string $option_name
* @param mixed $option_value
* @param null|int $network_level_or_blog_id Since 2.0.0
private static function set_account_option_by_module(
$network_level_or_blog_id = null
if ( WP_FS__MODULE_TYPE_PLUGIN != $module_type ) {
$option_name = $module_type . '_' . $option_name;
self::$_accounts->set_option( $option_name, $option_value, $store, $network_level_or_blog_id );
* This method can also return non-entity or non-entities collection option like the `user_id_license_ids_map` option.
* @author Leo Fajardo (@leorw)
* @param string $option_name
* @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS).
* @return mixed|FS_Plugin[]|FS_User[]|FS_Site[]|FS_Plugin_License[]|FS_Plugin_Plan[]|FS_Plugin_Tag[]
private static function maybe_get_entities_account_option( $option_name, $default = null, $network_level_or_blog_id = null ) {
$option = self::$_accounts->get_option( $option_name, $default, $network_level_or_blog_id );
if ( fs_starts_with( $option_name, WP_FS__MODULE_TYPE_THEME . '_' ) ) {
$option_name = str_replace( WP_FS__MODULE_TYPE_THEME . '_', '', $option_name );
switch ( $option_name ) {
$class_name = FS_Plugin::get_class_name();
$class_name = FS_User::get_class_name();
$class_name = FS_Site::get_class_name();
$class_name = FS_Plugin_License::get_class_name();
$class_name = FS_Plugin_Plan::get_class_name();
$class_name = FS_Plugin_Tag::get_class_name();
if ( empty( $class_name ) ) {
return fs_get_entities( $option, $class_name );
* @author Vova Feldman (@svovaf)
* @param number|null $module_id
* @return FS_Plugin_License[]
private static function get_all_licenses( $module_id = null ) {
$licenses = self::get_account_option( 'all_licenses' );
if ( ! is_array( $licenses ) ) {
if ( is_null( $module_id ) ) {
$licenses = isset( $licenses[ $module_id ] ) ?
$licenses[ $module_id ] :
* @author Leo Fajardo (@leorw)
private static function get_all_licenses_by_module_type() {
$licenses = self::get_account_option( 'all_licenses' );
$licenses_by_module_type = array(
WP_FS__MODULE_TYPE_PLUGIN => array(),
WP_FS__MODULE_TYPE_THEME => array()
if ( ! is_array( $licenses ) ) {
return $licenses_by_module_type;
foreach ( $licenses as $module_id => $module_licenses ) {
$fs = self::get_instance_by_id( $module_id );
$licenses_by_module_type[ $fs->_module_type ] = array_merge( $licenses_by_module_type[ $fs->_module_type ], $module_licenses );
return $licenses_by_module_type;
* @author Leo Fajardo (@leorw)
* @param number $module_id
* @param number|null $user_id
private static function get_user_id_license_ids_map( $module_id, $user_id = null ) {
$all_modules_user_id_license_ids_map = self::get_account_option( 'user_id_license_ids_map' );
if ( ! is_array( $all_modules_user_id_license_ids_map ) ) {
$all_modules_user_id_license_ids_map = array();
$user_id_license_ids_map = isset( $all_modules_user_id_license_ids_map[ $module_id ] ) ?
$all_modules_user_id_license_ids_map[ $module_id ] :
if ( FS_User::is_valid_id( $user_id ) ) {
$user_id_license_ids_map = isset( $user_id_license_ids_map[ $user_id ] ) ?
$user_id_license_ids_map[ $user_id ] :
return $user_id_license_ids_map;
* @author Leo Fajardo (@leorw)
* @param array $new_user_id_license_ids_map
* @param number $module_id
* @param number|null $user_id
private static function store_user_id_license_ids_map( $new_user_id_license_ids_map, $module_id, $user_id = null ) {
$all_modules_user_id_license_ids_map = self::get_account_option( 'user_id_license_ids_map' );
if ( ! is_array( $all_modules_user_id_license_ids_map ) ) {
$all_modules_user_id_license_ids_map = array();
if ( ! isset( $all_modules_user_id_license_ids_map[ $module_id ] ) ) {
$all_modules_user_id_license_ids_map[ $module_id ] = array();
if ( FS_User::is_valid_id( $user_id ) ) {
$all_modules_user_id_license_ids_map[ $module_id ][ $user_id ] = $new_user_id_license_ids_map;
$all_modules_user_id_license_ids_map[ $module_id ] = $new_user_id_license_ids_map;
self::$_accounts->set_option( 'user_id_license_ids_map', $all_modules_user_id_license_ids_map, true );
* Get a collection of the user's linked license IDs.
* @author Vova Feldman (@svovaf)
private function get_user_linked_license_ids( $user_id ) {
return self::get_user_id_license_ids_map( $this->_module_id, $user_id );
* Override the user's linked license IDs with a new IDs collection.
* @author Vova Feldman (@svovaf)
* @param number[] $license_ids
private function set_user_linked_license_ids( $user_id, array $license_ids ) {
self::store_user_id_license_ids_map( $license_ids, $this->_module_id, $user_id );
* Link a specified license ID to a given user.
* @author Vova Feldman (@svovaf)
* @param number $license_id
private function link_license_2_user( $license_id, $user_id ) {
$license_ids = $this->get_user_linked_license_ids( $user_id );
if ( in_array( $license_id, $license_ids ) ) {
// License already linked.
$license_ids[] = $license_id;
$this->set_user_linked_license_ids( $user_id, $license_ids );
* @param string|bool $module_type
* @return FS_Plugin_Plan[]
private static function get_all_plans( $module_type = false ) {
$plans = self::get_account_option( 'plans', $module_type );
if ( ! is_array( $plans ) ) {
* @author Vova Feldman (@svovaf)
* @return FS_Plugin_Tag[]
private static function get_all_updates() {
$updates = self::maybe_get_entities_account_option( 'updates', array() );
if ( ! is_array( $updates ) ) {
* @author Vova Feldman (@svovaf)
* @return array<number,FS_Plugin[]>|false
private static function get_all_addons() {
$addons = self::maybe_get_entities_account_option( 'addons', array() );
if ( ! is_array( $addons ) ) {
* @author Vova Feldman (@svovaf)
private static function get_all_account_addons() {
$addons = self::$_accounts->get_option( 'account_addons', array() );
if ( ! is_array( $addons ) ) {
* Check if user has connected his account (opted-in).
* If the user opted-in and opted-out on a later stage,
* this will still return true. If you want to check if the
* user is currently opted-in, use: