38217-vm/wp-content/plugins/mainwp/class/class-mainwp-demo-handle.php
2026-02-05 17:08:59 +03:00

615 lines
20 KiB
PHP

<?php
/**
* MainWP Settings Handle
*
* This Class handles building/Managing the
* Settings MainWP DashboardPage & all SubPages.
*
* @package MainWP/Settings
*/
namespace MainWP\Dashboard;
/**
* Class MainWP_Settings
*
* @package MainWP\Dashboard
*/
class MainWP_Demo_Handle { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
/**
* Protected static variable to hold the single instance of the class.
*
* @var mixed Default null
*/
protected static $instance = null;
/**
* Protected static variable to hold the single instance of the demo website ids.
*
* @var mixed Default array().
*/
protected static $demo_website_ids = array();
/**
* Get Class Name
*
* @return __CLASS__
*/
public static function get_class_name() {
return __CLASS__;
}
/**
* Return the single instance of the class.
*
* @return mixed $instance The single instance of the class.
*/
public static function get_instance() {
if ( is_null( static::$instance ) ) {
static::$instance = new self();
}
if ( empty( static::$demo_website_ids ) ) {
$added_demo = get_option( 'mainwp_demo_mode_added_ids', array() );
if ( is_array( $added_demo ) && ! empty( $added_demo['sites_ids'] ) ) {
static::$demo_website_ids = $added_demo['sites_ids'];
}
if ( empty( static::$demo_website_ids ) || ! is_array( static::$demo_website_ids ) ) {
static::$demo_website_ids = array( -1 ); // for single assign.
}
}
return static::$instance;
}
/**
* Method init_data_demo()
*
* Handle init data mode.
*/
public function init_data_demo() {
if ( isset( $_GET['enable_demo_mode'] ) && 'yes' === $_GET['enable_demo_mode'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized.Recommended
$this->import_data_demo();
MainWP_Utility::update_option( 'mainwp_enable_guided_tours', 1 );
?>
<script type="text/javascript">
jQuery( document ).ready( function( $ ) {
setTimeout(function () {
location.href = 'admin.php?page=mainwp_tab&message=enable-demo-mode';
}, 100);
});
</script>
<?php
}
}
/**
*
* Handle detect if it's instawp site.
*/
public static function is_instawp_site() {
$urlparts = wp_parse_url( home_url() );
$domain = $urlparts['host'];
return false !== stripos( $domain, 'instawp.xyz' );
}
/**
* Method import_data_demo()
*
* Handle import data demo.
*
* @uses \MainWP\Dashboard\MainWP_System_Utility::get_wp_file_system()
* @uses \MainWP\Dashboard\MainWP_Utility::starts_with()
*/
public function import_data_demo() { //phpcs:ignore -- NOSONAR - complex method.
$demo_files = array(
'demo_mainwp_wp',
'demo_mainwp_wp_clients',
'demo_mainwp_wp_clients_contacts',
'demo_mainwp_wp_options',
'demo_mainwp_wp_actions',
);
$wp_data_rows = array();
$clients_data_rows = array();
$contacts_data_rows = array();
$wp_options_data_rows = array();
$wp_action_data_rows = array();
foreach ( $demo_files as $file ) {
$file_path = MAINWP_PLUGIN_DIR . 'assets' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'demo' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . $file . '.json';
$json_content = '';
if ( file_exists( $file_path ) ) {
ob_start();
include_once $file_path; // NOSONAR - WP compatible.
$json_content = ob_get_clean();
}
if ( ! empty( $json_content ) ) {
$json_content = json_decode( $json_content, true );
}
if ( ! is_array( $json_content ) || ! isset( $json_content['data'] ) ) {
continue;
}
if ( 'demo_mainwp_wp_clients' === $file ) {
$clients_data_rows = $json_content['data'];
} elseif ( 'demo_mainwp_wp' === $file ) {
$wp_data_rows = $json_content['data'];
} elseif ( 'demo_mainwp_wp_clients_contacts' === $file ) {
$contacts_data_rows = $json_content['data'];
} elseif ( 'demo_mainwp_wp_options' === $file ) {
$wp_options_data_rows = $json_content['data'];
} elseif ( 'demo_mainwp_wp_actions' === $file ) {
$wp_action_data_rows = $json_content['data'];
}
}
$count_inserted = 0;
$index = 0;
$demo_added_ids = array(
'sites_ids' => array(),
'clients_ids' => array(),
'contacts_ids' => array(),
);
if ( is_array( $wp_data_rows ) && ! empty( $wp_data_rows ) ) {
foreach ( $wp_data_rows as $row ) {
$websiteid = $this->add_demo_website( $row );
if ( $websiteid ) {
++$count_inserted;
$client_id = 0;
if ( isset( $clients_data_rows[ $index ] ) ) {
$client_id = $this->add_demo_client( $clients_data_rows[ $index ], array( $websiteid ) );
if ( $client_id && isset( $contacts_data_rows[ $index ] ) ) {
$this->add_demo_contact( $contacts_data_rows[ $index ], $client_id );
}
}
$this->add_demo_wp_option( $wp_options_data_rows, $index, $websiteid );
$this->add_demo_none_mainwp_action( $wp_action_data_rows, $index, $websiteid );
// saved import ids to clear.
$demo_added_ids['sites_ids'][] = $websiteid;
if ( $client_id ) {
$demo_added_ids['clients_ids'][] = $client_id;
}
}
++$index;
}
$data['count'] = $index;
$data['inserted'] = $count_inserted;
update_option( 'mainwp_demo_mode_added_ids', $demo_added_ids );
MainWP_Utility::update_option( 'mainwp_setting_demo_mode_enabled', 1 );
}
if ( ! $index ) {
$data['error'] = esc_html__( 'Invalid demo data.', 'mainwp' );
}
return $data;
}
/**
* Method add_demo_client()
*
* Handle to add demo Client.
*
* @param array $params Array of data.
* @param array $selected_sites client sites ids.
*/
private function add_demo_client( $params, $selected_sites ) {
if ( isset( $params['client_id'] ) ) {
unset( $params['client_id'] );
}
$params['primary_contact_id'] = 0;
if ( empty( $params['created'] ) ) {
$params['created'] = time();
}
$clientid = 0;
try {
$inserted = MainWP_DB_Client::instance()->update_client( $params );
if ( $inserted ) {
$clientid = $inserted->client_id;
}
} catch ( \Exception $e ) {
$clientid = 0;
}
if ( $clientid && $selected_sites ) {
MainWP_DB_Client::instance()->update_selected_sites_for_client( $clientid, $selected_sites );
}
return $clientid;
}
/**
* Method add_demo_contact()
*
* Handle to add demo contact.
*
* @param array $params Array of data.
* @param int $client_id client id.
*/
private function add_demo_contact( $params, $client_id ) {
if ( isset( $params['contact_id'] ) ) {
unset( $params['contact_id'] );
}
$params['contact_client_id'] = $client_id;
$contact_int = MainWP_DB_Client::instance()->update_client_contact( $params );
if ( $contact_int ) {
$update = array(
'client_id' => $client_id,
'primary_contact_id' => $contact_int->contact_id,
);
MainWP_DB_Client::instance()->update_client( $update );
return $contact_int->contact_id;
}
return false;
}
/**
* Method add_demo_website()
*
* Handle add demo website data.
*
* @param array $params Array of demo Site to add.
*/
private function add_demo_website( $params ) {
global $wpdb;
$userid = get_current_user_id();
if ( MainWP_Utility::ctype_digit( $userid ) && is_array( $params ) && isset( $params['url'] ) && ! empty( $params['url'] ) && isset( $params['adminname'] ) && ! empty( $params['adminname'] ) ) {
$existed = MainWP_DB::instance()->get_websites_by_url( $params['url'] );
if ( ! empty( $existed ) ) {
return false;
}
if ( isset( $params['id'] ) ) {
unset( $params['id'] );
}
$url = $params['url'];
if ( '/' !== substr( $url, - 1 ) ) {
$url .= '/';
}
$params['url'] = $url;
$params['userid'] = $userid;
$params['client_id'] = 0; // set: 0.
$syncValues = array(
'dtsSync' => 0,
'dtsSyncStart' => 0,
'dtsAutomaticSync' => 0,
'dtsAutomaticSyncStart' => 0,
'totalsize' => 0,
'extauth' => '',
'sync_errors' => '',
);
if ( $wpdb->insert( MainWP_DB::instance()->get_table_name( 'wp' ), $params ) ) {
$websiteid = $wpdb->insert_id;
$syncValues['wpid'] = $websiteid;
$wpdb->insert( MainWP_DB::instance()->get_table_name( 'wp_sync' ), $syncValues );
$wpdb->insert(
MainWP_DB::instance()->get_table_name( 'wp_settings_backup' ),
array(
'wpid' => $websiteid,
'archiveFormat' => 'global',
)
);
$website = new \stdClass();
$website->id = $websiteid;
$added = time();
MainWP_DB::instance()->update_website_option( $website, 'added_timestamp', $added );
return $websiteid;
}
}
return false;
}
/**
* Method add_demo_wp_option()
*
* Handle add demo website options data.
*
* @param array $data_rows Array of Site options.
* @param index $index index of data.
* @param index $websiteid website id.
*/
private function add_demo_wp_option( $data_rows, $index, $websiteid ) {
global $wpdb;
if ( ! is_array( $data_rows ) || empty( $websiteid ) ) {
return;
}
$opt_names = array(
'recent_posts',
'recent_pages',
);
foreach ( $opt_names as $opt_name ) {
if ( isset( $data_rows[ $opt_name ] ) && ! empty( $data_rows[ $opt_name ][ $index ] ) ) {
$row = $data_rows[ $opt_name ][ $index ];
if ( isset( $row['opt_id'] ) ) {
unset( $row['opt_id'] );
$row['wpid'] = $websiteid;
$wpdb->insert( MainWP_DB::instance()->get_table_name( 'wp_options' ), $row );
}
}
}
}
/**
* Method add_demo_none_mainwp_action()
*
* Handle add demo none mainwp actions.
*
* @param array $data_rows Array of actions.
* @param index $index index of data.
* @param index $websiteid website id.
*/
private function add_demo_none_mainwp_action( $data_rows, $index, $websiteid ) {
global $wpdb;
if ( ! is_array( $data_rows ) || empty( $websiteid ) ) {
return;
}
foreach ( $data_rows as $row ) {
if ( isset( $row['action_id'] ) && isset( $row['wpid'] ) && (int) $index === (int) $row['wpid'] ) {
unset( $row['action_id'] );
$row['wpid'] = $websiteid;
$wpdb->insert( MainWP_DB::instance()->get_table_name( 'wp_actions' ), $row );
}
}
}
/**
* Method delete_data_demo()
*
* Handle delete demo data .
*/
public function delete_data_demo() {
global $wpdb;
$demo_data_ids = get_option( 'mainwp_demo_mode_added_ids' );
if ( is_array( $demo_data_ids ) ) {
if ( ! empty( $demo_data_ids['sites_ids'] ) ) {
foreach ( $demo_data_ids['sites_ids'] as $itemid ) {
MainWP_Manage_Sites_Handler::remove_website( $itemid );
}
}
// to fix issue: change clients of demo site.
if ( ! empty( $demo_data_ids['clients_ids'] ) ) {
foreach ( $demo_data_ids['clients_ids'] as $itemid ) {
MainWP_DB_Client::instance()->delete_client( $itemid );
}
}
}
MainWP_Utility::update_option( 'mainwp_setting_demo_mode_enabled', 0 );
$this->clear_session_cached_demo_data();
return array(
'success' => 1,
);
}
/**
* Method delete_data_demo()
*
* Handle delete demo data .
*/
public function is_new_instance() {
global $wpdb;
$cache_key = 'mainwp_is_new_instance';
$cached = wp_cache_get( $cache_key );
if ( false !== $cached ) {
return $cached;
}
$table_wp = esc_sql( MainWP_DB::instance()->get_table_name( 'wp' ) );
$count = $wpdb->get_var( "SELECT count(id) FROM {$table_wp}" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Table name cannot be parameterized.
if ( $count ) {
wp_cache_set( $cache_key, false );
return false;
}
$table_clients = esc_sql( MainWP_DB::instance()->get_table_name( 'wp_clients' ) );
$count = $wpdb->get_var( "SELECT count(client_id) FROM {$table_clients}" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Table name cannot be parameterized.
if ( $count ) {
wp_cache_set( $cache_key, false );
return false;
}
$extensions_disabled = MainWP_Extensions_Handler::get_extensions_disabled();
$extensions = MainWP_Extensions_Handler::get_extensions();
if ( ! empty( $extensions ) && $extensions !== $extensions_disabled ) {
wp_cache_set( $cache_key, false );
return false;
}
wp_cache_set( $cache_key, true );
return true;
}
/**
* Method is_demo_website()
*
* Check if website is demo data.
*
* @param array $website Site to check.
*/
public function is_demo_website( $website ) {
if ( is_numeric( $website ) ) {
if ( in_array( $website, static::$demo_website_ids ) ) {
return true;
}
} elseif ( is_object( $website ) && property_exists( $website, 'id' ) && in_array( $website->id, static::$demo_website_ids ) ) {
return true;
}
return false;
}
/**
* Method get_open_site_demo_url()
*
* Render open site demo url.
*
* @param mixed $website Site.
*/
public function get_open_site_demo_url( $website ) {
$open_url = '';
if ( is_numeric( $website ) ) {
$website = MainWP_DB::instance()->get_website_by_id( $website );
}
if ( is_object( $website ) && property_exists( $website, 'url' ) ) {
$open_url = $website->url . 'wp-admin.html';
}
return $open_url;
}
/**
* Method is_demo_mode()
*
* Check if mainwp is demo mode.
*
* @return bool True if demo mode, else False.
*/
public static function is_demo_mode() {
return defined( 'MAINWP_DEMO_MODE' ) && MAINWP_DEMO_MODE;
}
/**
* Method render_demo_disable_button()
*
* Handle render disable demo buttons.
*
* @param string $content html content.
* @param bool $echo_out to echo or return.
*
* @return mixed Button or echo.
*/
public function render_demo_disable_button( $content, $echo_out = true ) {
$button = '<div style="display:inline-block;" data-tooltip="' . $this->get_demo_tooltip() . '" data-inverted="" data-variation="mini" data-position="top right">' . $content . '</div>';
if ( $echo_out ) {
echo $button; //phpcs:ignore WordPress.Security.EscapeOutput
}
return $button;
}
/**
* Method get_markup_str()
*
* Get demo markup string.
*
* @return string markup string.
*/
public function get_markup_str() {
return '::[adminwebsitedemo]';
}
/**
* Method get_demo_notice()
*
* Get demo message to notice.
*/
public function get_demo_tooltip() {
return esc_html__( 'This function does not work in the demo mode!', 'mainwp' );
}
/**
* Method get_demo_notice()
*
* Get demo message to notice.
*/
public function get_demo_notice() {
return '[Demo Website]';
}
/**
* Method handle_action_demo()
*
* Handle action for demo website.
*
* @param object $pWebsite The demo site.
* @param string $what action.
*/
public function handle_action_demo( $pWebsite, $what ) {
$output = array(
'error' => $this->get_demo_notice(),
);
if ( 'stats' === $what || 'sync_site' === $what ) {
$update_dm = array(
'dtsSync' => time(),
'sync_errors' => '',
);
MainWP_DB::instance()->update_website_sync_values( $pWebsite->id, $update_dm );
return true;
} elseif ( 'perform_install' === $what || 'perform_upload' === $what ) {
wp_die( wp_send_json( $output ) ); //phpcs:ignore WordPress.Security.EscapeOutput
}
return $output;
}
/**
* Method handle_fetch_urls_demo()
*
* Handle action for demo website.
*
* @param mixed $data action.
* @param object $website The demo site.
* @param mixed $output output.
*/
public function handle_fetch_urls_demo( $data, $website, &$output ) {
unset( $data );
if ( $this->is_demo_website( $website ) ) {
$output->errors[ $website->id ] = $this->get_demo_notice();
}
}
/**
* Method clear_session_cached_demo_data()
*
* Handle clear session cached demo data.
*/
public function clear_session_cached_demo_data() {
MainWP_Cache::init_session();
$clear = array(
'SNThemesAll',
'SNThemesAllStatus',
'MainWP_PluginsActiveStatus',
'MainWP_PluginsActive',
'MainWPPluginsSearchResult',
'MainWPPluginsSearchContext',
'MainWPPluginsSearch',
'MainWPThemesSearchResult',
'MainWPThemesSearchContext',
'MainWPThemesSearch',
'MainWPUsersSearchResult',
'MainWPUsersSearchContext',
'MainWPUsersSearch',
);
foreach ( $clear as $cl ) {
if ( isset( $_SESSION[ $cl ] ) ) {
unset( $_SESSION[ $cl ] );
}
}
}
}