: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
et_error( $maybe_create_user->get_error_message() );
$response['error'] = $maybe_create_user->get_error_message();
if ( 'elevate' === $support_update ) {
$this->support_user_set_role( 'et_support_elevated' );
$response['message'] = esc_html__(
'ET Support User role has been elevated.',
if ( 'deactivate' === $support_update ) {
$this->support_user_set_role( '' );
$this->support_user_delete_account();
$this->support_user_clear_delete_cron();
$response['message'] = esc_html__(
'ET Support User role has been deactivated.',
if ( isset( $response ) ) {
echo json_encode( $response );
* SUPPORT CENTER :: SAFE MODE
* @param string $product Potential ET product name that we want to confirm is on the list.
* @return string|false If the product is on our list, we return the "nice name" we have for it. Otherwise, we return FALSE.
protected function is_allowlisted_product( $product = '' ) {
case 'divi_builder_plugin':
return $this->get_parent_nicename( $product );
* Safe Mode: Set session cookie to temporarily disable Plugins
function safe_mode_update_via_ajax() {
et_core_security_check( 'manage_options', 'support_center', 'nonce' );
$support_update = sanitize_text_field( $_POST['support_update'] );
if ( 'activate' === $support_update ) {
// Check the ET product that is activating Safe Mode
$safe_mode_activator = sanitize_key( $_POST['product'] );
// Confirm that this is a allowlisted product
$allowlisted_product = $this->is_allowlisted_product( $safe_mode_activator );
if ( ! $allowlisted_product ) {
// Send a failure code and exit the function
header( "HTTP/1.0 403 Forbidden" );
print 'Bad or malformed ET product name.';
$this->toggle_safe_mode( true, $safe_mode_activator );
$response['message'] = esc_html__( 'ET Safe Mode has been activated.', 'et-core' );
if ( 'deactivate' === $support_update ) {
$this->toggle_safe_mode( false );
$response['message'] = esc_html__( 'ET Safe Mode has been deactivated.', 'et-core' );
$this->set_safe_mode_cookie();
if ( isset( $response ) ) {
echo json_encode( $response );
* @param bool $activate TRUE if enabling Safe Mode, FALSE if disabling Safe mode.
* @param string $product Name of ET product that is activating Safe Mode (@see ET_Core_SupportCenter::get_parent_nicename()).
public function toggle_safe_mode( $activate = true, $product = '' ) {
$activate = (bool) $activate;
$user_id = get_current_user_id();
$allowlisted_product = $this->is_allowlisted_product( $product );
// Only proceed with an activation request if it comes from a allowlisted product
if ( $activate && ! $allowlisted_product ) {
update_user_meta( $user_id, '_et_support_center_safe_mode', $activate ? 'on' : 'off' );
update_user_meta( $user_id, '_et_support_center_safe_mode_product', $activate ? sanitize_text_field( $allowlisted_product ) : '' );
$activate ? $this->maybe_add_mu_autoloader() : $this->maybe_remove_mu_autoloader();
* Fires when safe mode is toggled on or off.
* @param bool $state True if toggled on, false if toggled off.
do_action( 'et_support_center_toggle_safe_mode', $activate );
function set_safe_mode_cookie() {
if ( et_core_is_safe_mode_active() ) {
// This random string ensures old cookies aren't used to view the site in Safe Mode
$passport = md5( rand() );
update_option( 'et-support-center-safe-mode-verify', $passport );
setcookie( 'et-support-center-safe-mode', $passport, time() + DAY_IN_SECONDS, SITECOOKIEPATH, false, is_ssl() );
// Force-expire the cookie
setcookie( 'et-support-center-safe-mode', '', 1, SITECOOKIEPATH, false, is_ssl() );
* Render modal that intercepts plugin activation/deactivation
public function render_safe_mode_block_restricted() {
if ( ! et_core_is_safe_mode_active() ) {
// Get the name of the ET product that activated Safe Mode
$safe_mode_activator = get_user_meta( get_current_user_id(), '_et_support_center_safe_mode_product', true );
$verified_activator = $this->is_allowlisted_product( $safe_mode_activator );
<script type="text/template" id="et-ajax-safe-mode-template">
<div class="et-core-modal-overlay et-core-form et-core-safe-mode-block-modal">
<div class="et-core-modal">
<div class="et-core-modal-header">
<h3 class="et-core-modal-title">
<?php print esc_html__( 'Safe Mode', 'et-core' ); ?>
<a href="#" class="et-core-modal-close" data-et-core-modal="close"></a>
<div id="et-core-safe-mode-block-modal-content">
<div class="et-core-modal-content">
<p><?php print esc_html__(
'Safe Mode is enabled and the current action cannot be performed.',
<a class="et-core-modal-action"
href="<?php echo admin_url( null, 'admin.php?page=et_support_center#et_card_safe_mode' ); ?>">
<?php print esc_html__( sprintf( 'Turn Off %1$s Safe Mode', $verified_activator ), 'et-core' ); ?>
* Disable Custom CSS (if Safe Mode is active)
function maybe_disable_custom_css() {
// Don't do anything if the user isn't logged in
if ( ! is_user_logged_in() ) {
if ( et_core_is_safe_mode_active() ) {
// Remove "Additional CSS" from WP Head action hook
remove_action( 'wp_head', 'wp_custom_css_cb', 101 );
* Add Safe Mode Indicator (if Safe Mode is active)
function maybe_add_safe_mode_indicator() {
// Don't do anything if the user isn't logged in
if ( ! is_user_logged_in() ) {
// Don't display when Visual Builder is active
if ( et_core_is_fb_enabled() ) {
if ( et_core_is_safe_mode_active() ) {
// Get the name of the ET product that activated Safe Mode
$safe_mode_activator = get_user_meta( get_current_user_id(), '_et_support_center_safe_mode_product', true );
$verified_activator = $this->is_allowlisted_product( $safe_mode_activator );
print sprintf( '<a class="%1$s" href="%2$s">%3$s</a>',
'et-safe-mode-indicator',
esc_url( get_admin_url( null, 'admin.php?page=et_support_center#et_card_safe_mode' ) ),
esc_html__( sprintf( 'Turn Off %1$s Safe Mode', $verified_activator ), 'et-core' )
print sprintf( '<div id="%1$s"><img src="%2$s" alt="%3$s" id="%3$s"/></div>',
esc_url( $this->local_path . 'admin/images/ajax-loader.gif' ),
* Prints the admin page for Support Center
public function add_support_center() {
$is_current_user_et_support = 0;
if ( in_array( 'et_support', wp_get_current_user()->roles ) ) {
$is_current_user_et_support = 1;
if ( in_array( 'et_support_elevated', wp_get_current_user()->roles ) ) {
$is_current_user_et_support = 2;
// Conditionally Display Divi Hosting Card
$this->maybe_display_divi_hosting_card();
<div id="et_support_center" class="wrap et-divi-admin-page--wrapper" data-et-zone="wp-admin" data-et-page="wp-admin-support-center">
<h1><?php esc_html_e( sprintf( '%1$s Help & Support Center', $this->parent_nicename ), 'et-core' );
<div id="epanel-content">
* Run code before any of the Support Center cards have been output
do_action( 'et_support_center_above_cards' );
// Build Card :: System Status
if ( $this->current_user_can( 'et_support_center_system' ) ) {
$card_title = esc_html__( 'System Status', 'et-core' );
$card_content = sprintf( '<div class="et-system-status summary">%1$s</div>'
. '<textarea id="et_system_status_plain">%2$s</textarea>'
. '<div class="et_card_cta">%3$s %4$s %5$s</div>',
et_core_intentionally_unescaped( $this->system_diagnostics_generate_report( true, 'div' ), 'html' ),
et_core_intentionally_unescaped( $this->system_diagnostics_generate_report( true, 'plain' ), 'html' ),
sprintf( '<a class="full_report_show">%1$s</a>', esc_html__( 'Show Full Report', 'et-core' ) ),
sprintf( '<a class="full_report_hide">%1$s</a>', esc_html__( 'Hide Full Report', 'et-core' ) ),
sprintf( '<a class="full_report_copy">%1$s</a>', esc_html__( 'Copy Full Report', 'et-core' ) )
print $this->add_support_center_card( array(
'content' => $card_content,
'additional_classes' => array(
* Run code after the 1st Support Center card has been output
do_action( 'et_support_center_below_position_1' );
// Build Card :: Remote Access
if ( $this->current_user_can( 'et_support_center_remote_access' ) && ( 0 === $is_current_user_et_support ) ) {
$card_title = esc_html__( 'Elegant Themes Support', 'et-core' );
$card_content = __( '<p>Enabling <strong>Remote Access</strong> will give the Elegant Themes support team limited access to your WordPress Dashboard. If requested, you can also enable full admin privileges. Remote Access should only be turned on if requested by the Elegant Themes support team. Remote Access is automatically disabled after 4 days.</p>', 'et-core' );
$support_account = $this->get_et_support_user();
$is_et_support_user_active = 0;
$has_et_license = $this->get_et_license();
if ( ! $has_et_license ) {
$card_content .= sprintf(
'<div class="et-support-user"><h4>%1$s</h4><p>%2$s</p></div>',
esc_html__( 'Remote Access', 'et-core' ),
__( 'Remote Access cannot be enabled because you do not have a valid API Key or your Elegant Themes subscription has expired. You can find your API Key by <a href="https://www.elegantthemes.com/members-area/api/" target="_blank">logging in</a> to your Elegant Themes account. It should then be added to your <a href="https://www.elegantthemes.com/documentation/divi/update-divi/" target=_blank">Options Panel</a>.', 'et-core' )
if ( is_object( $support_account ) && property_exists( $support_account, 'roles' ) ) {
if ( in_array( 'et_support', $support_account->roles ) ) {
$is_et_support_user_active = 1;
if ( in_array( 'et_support_elevated', $support_account->roles ) ) {
$is_et_support_user_active = 2;
$support_user_active_state = ( intval( $is_et_support_user_active ) > 0 ) ? ' et_pb_on_state' : ' et_pb_off_state';
if ( ! empty( $this->support_user_options['date_created'] ) ) {
// Calculate the 'Created Date' plus the 'Time To Expire'
$date_created = date( 'Y-m-d H:i:s ', $this->support_user_options['date_created'] );
$expiry = strtotime( $date_created . $this->support_user_expiration_time );
// Toggle Support User activation
$card_content .= sprintf( '<div class="et-support-user"><h4>%1$s</h4>'
. '<div class="et_support_user_toggle">'
. '<div class="%7$s_wrapper"><div class="%7$s %2$s">'
. '<span class="%8$s et_pb_on_value">%3$s</span>'
. '<span class="et_pb_button_slider"></span>'
. '<span class="%8$s et_pb_off_value">%4$s</span>'
. '<span class="et-support-user-expiry" data-expiry="%5$s">%6$s'
. '<span class="support-user-time-to-expiry"></span>'
. '<span class="et-remote-access-error"></span>'
esc_html__( 'Remote Access', 'et-core' ),
esc_attr( $support_user_active_state ),
esc_html__( 'Enabled', 'et-core' ),
esc_html__( 'Disabled', 'et-core' ),
esc_html__( 'Remote Access will be automatically disabled in: ', 'et-core' ),
// Toggle Support User role elevation (only visible if Support User is active)
$extra_css = ( intval( $is_et_support_user_active ) > 0 ) ? 'style="display:block;"' : '';
$support_user_elevated_state = ( intval( $is_et_support_user_active ) > 1 ) ? ' et_pb_on_state' : ' et_pb_off_state';
$card_content .= sprintf( '<div class="et-support-user-elevated" %5$s><h4>%1$s</h4>'
. '<div class="et_support_user_elevated_toggle">'
. '<div class="%6$s_wrapper"><div class="%6$s %2$s">'
. '<span class="%7$s et_pb_on_value">%3$s</span>'
. '<span class="et_pb_button_slider"></span>'
. '<span class="%7$s et_pb_off_value">%4$s</span>'
esc_html__( 'Activate Full Admin Privileges', 'et-core' ),
esc_attr( $support_user_elevated_state ),
esc_html__( 'Enabled', 'et-core' ),
esc_html__( 'Disabled', 'et-core' ),
et_core_intentionally_unescaped( $extra_css, 'html' ),
// Add a "Copy Support Token" CTA if Remote Access is active
$site_id = get_option( 'et_support_site_id' );
if ( intval( $is_et_support_user_active ) > 0 && ! empty( $site_id ) && is_string( $site_id ) ) {
$account_settings = get_option( $this->support_user_options_name );
$support_token_cta = '<a class="copy_support_token" data-token="'
. esc_attr( $account_settings['token'] . '|' . $site_id )
. esc_html__( 'Copy Support Token', 'et-core' )
$card_content .= '<div class="et_card_cta">'
. '<a target="_blank" href="https://www.elegantthemes.com/members-area/help/">'
. esc_html__( 'Chat With Support', 'et-core' )
print $this->add_support_center_card( array(
'content' => $card_content,
'additional_classes' => array(
* Run code after the 2nd Support Center card has been output
do_action( 'et_support_center_below_position_2' );
// Build Card :: Divi Documentation & Help
if ( $this->current_user_can( 'et_support_center_documentation' ) ) {
switch ( $this->parent ) {
$documentation_url = 'https://www.elegantthemes.com/documentation/extra/';
$documentation_url = 'https://www.elegantthemes.com/documentation/divi/';
case 'divi_builder_plugin':
$documentation_url = 'https://www.elegantthemes.com/documentation/divi-builder/';
$documentation_url = 'https://www.elegantthemes.com/documentation/monarch/';
$documentation_url = 'https://www.elegantthemes.com/documentation/bloom/';
$documentation_url = 'https://www.elegantthemes.com/documentation/';
$card_title = esc_html__(
sprintf( '%1$s Documentation & Help', $this->parent_nicename ),
$card_content = $this->get_documentation_video_player();
$card_content .= $this->get_documentation_articles_list();
$card_content .= '<div class="et_card_cta">'
. '<a href="' . $documentation_url . '" class="launch_documentation" target="_blank">'
sprintf( 'View Full %1$s Documentation', $this->parent_nicename ),
print $this->add_support_center_card( array(
'content' => $card_content,
'additional_classes' => array(
* Run code after the 3rd Support Center card has been output
do_action( 'et_support_center_below_position_3' );
// Build Card :: Safe Mode