: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
// Prevent file from being loaded directly
if ( ! defined( 'ABSPATH' ) ) {
/********* ePanel v.3.2 ************/
/* Admin scripts + ajax jquery code */
if ( ! function_exists( 'et_epanel_admin_js' ) ) {
function et_epanel_admin_js(){
$epanel_jsfolder = get_template_directory_uri() . '/epanel/js';
et_core_load_main_fonts();
wp_register_script( 'epanel_colorpicker', $epanel_jsfolder . '/colorpicker.js', array(), et_get_theme_version() );
wp_register_script( 'epanel_eye', $epanel_jsfolder . '/eye.js', array(), et_get_theme_version() );
wp_register_script( 'epanel_checkbox', $epanel_jsfolder . '/checkbox.js', array(), et_get_theme_version() );
wp_enqueue_script( 'wp-color-picker' );
wp_enqueue_style( 'wp-color-picker' );
$wp_color_picker_alpha_uri = defined( 'ET_BUILDER_URI' ) ? ET_BUILDER_URI . '/scripts/ext/wp-color-picker-alpha.min.js' : $epanel_jsfolder . '/wp-color-picker-alpha.min.js';
wp_enqueue_script( 'wp-color-picker-alpha', $wp_color_picker_alpha_uri, array( 'jquery', 'wp-color-picker' ), et_get_theme_version(), true );
wp_enqueue_script( 'epanel_functions_init', $epanel_jsfolder . '/functions-init.js', array( 'jquery', 'jquery-ui-tabs', 'jquery-form', 'epanel_colorpicker', 'epanel_eye', 'epanel_checkbox', 'wp-color-picker-alpha' ), et_get_theme_version() );
wp_localize_script( 'epanel_functions_init', 'ePanelSettings', array(
'clearpath' => get_template_directory_uri() . '/epanel/images/empty.png',
'epanel_nonce' => wp_create_nonce( 'epanel_nonce' ),
'help_label' => esc_html__( 'Help', $themename ),
'et_core_nonces' => et_core_get_nonces(),
// Use WP 4.9 CodeMirror Editor for some fields
if ( function_exists( 'wp_enqueue_code_editor' ) ) {
// Required for Javascript mode
wp_enqueue_script( 'jshint' );
wp_enqueue_script( 'htmlhint' );
/* --------------------------------------------- */
/* Enabling CSSlint for codemirror */
if ( ! function_exists( 'et_epanel_enable_css_lint' ) ) {
function et_epanel_enable_css_lint( $settings ){
$modes = array( 'text/css', 'css', 'text/x-scss', 'text/x-less', 'text/x-sass' );
if ( in_array( $settings['codemirror']['mode'], $modes, true ) ) {
$settings['codemirror']['lint'] = true;
$settings['codemirror']['gutters'] = array( 'CodeMirror-lint-markers' );
add_filter( 'wp_code_editor_settings', 'et_epanel_enable_css_lint' );
/* Adds additional ePanel css */
if ( ! function_exists( 'et_epanel_css_admin' ) ) {
function et_epanel_css_admin() {
<?php do_action( 'et_epanel_css_admin_enqueue' ); ?>
#epanel-save, #epanel-reset { font-size: 0px; display:block; line-height: 0px; bottom: 18px;}
.et-box-desc { width: 414px; }
.et-box-desc-content { width: 340px; }
.et-box-desc-bottom { height: 26px; }
#epanel-content .et-epanel-box input, #epanel-content .et-epanel-box select, .et-epanel-box textarea { width: 395px; }
#epanel-content .et-epanel-box select { width:434px !important;}
#epanel-content .et-epanel-box .et-box-content { padding: 8px 17px 15px 16px; }
#epanel-save, #epanel-reset { font-size: 0px; display:block; line-height: 0px; bottom: 18px;}
if ( ! function_exists( 'et_epanel_css_admin_style' ) ) {
function et_epanel_css_admin_style() {
wp_add_inline_style( 'epanel-style', '.et-lightbox-close { background: url("' . esc_url( get_template_directory_uri() ) . '/epanel/images/description-close.png") no-repeat; width: 19px; height: 20px; }' );
add_action( 'et_epanel_css_admin_enqueue', 'et_epanel_css_admin_style' );
if ( ! function_exists( 'et_epanel_admin_scripts' ) ) {
function et_epanel_admin_scripts( $hook ) {
$current_screen = get_current_screen();
$is_divi = ( 'toplevel_page_et_divi_options' === $current_screen->id );
if ( ! wp_style_is( 'et-core-admin', 'enqueued' ) ) {
wp_enqueue_style( 'et-core-admin-epanel', get_template_directory_uri() . '/core/admin/css/core.css', array(), et_get_theme_version() );
wp_enqueue_style( 'epanel-style', get_template_directory_uri() . '/epanel/css/panel.css', array(), et_get_theme_version() );
if ( wp_style_is( 'activecampaign-subscription-forms', 'enqueued' ) ) {
// activecampaign-subscription-forms style breaks the panel.
wp_dequeue_style( 'activecampaign-subscription-forms' );
// ePanel on theme others than Divi might want to add specific styling
if ( ! apply_filters( 'et_epanel_is_divi', $is_divi ) ) {
wp_enqueue_style( 'epanel-theme-style', apply_filters( 'et_epanel_style_url', get_template_directory_uri() . '/style-epanel.css'), array( 'epanel-style' ), et_get_theme_version() );
if ( ! function_exists( 'et_epanel_hook_scripts' ) ) {
function et_epanel_hook_scripts() {
add_action( 'admin_enqueue_scripts', 'et_epanel_admin_scripts' );
/* --------------------------------------------- */
/* Save/Reset actions | Adds theme options to WP-Admin menu */
add_action( 'admin_menu', 'et_add_epanel' );
function et_add_epanel() {
global $themename, $shortname, $options;
$epanel = basename( __FILE__ );
if ( isset( $_GET['page'] ) && $_GET['page'] === $epanel && isset( $_POST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification -- logic for nonce checks are following
( isset( $_POST['_wpnonce'] ) && wp_verify_nonce( $_POST['_wpnonce'], 'epanel_nonce' ) )
( 'reset' === $_POST['action'] && isset( $_POST['_wpnonce_reset'] ) && wp_verify_nonce( $_POST['_wpnonce_reset'], 'et-nojs-reset_epanel' ) )
if ( ! isset( $GLOBALS['et_core_updates'] ) ) {
et_register_updates_component();
epanel_save_data( 'js_disabled' ); //saves data when javascript is disabled
$core_page = add_theme_page( $themename . ' ' . esc_html__( 'Options', $themename ), $themename . ' ' . esc_html__( 'Theme Options', $themename ), 'edit_theme_options', basename( __FILE__ ), 'et_build_epanel' );
add_action( "admin_print_scripts-{$core_page}", 'et_epanel_admin_js' );
add_action( "admin_head-{$core_page}", 'et_epanel_css_admin' );
add_action( "load-{$core_page}", 'et_epanel_hook_scripts' );
/* --------------------------------------------- */
if ( ! function_exists( 'et_build_epanel' ) ) {
function et_build_epanel() {
global $themename, $shortname, $options, $et_disabled_jquery, $epanelMainTabs;
// load theme settings array
$default_tab_names = array(
'ad' => _x( 'Ads', 'site ads placement areas', $themename ),
'colorization' => _x( 'Colorization', 'site color scheme', $themename ),
'general' => _x( 'General', 'general options', $themename ),
'integration' => _x( 'Integration', 'integrate third-party code', $themename ),
'layout' => _x( 'Layout', 'page/post', $themename ),
'navigation' => _x( 'Navigation', 'navigation menu', $themename ),
'seo' => _x( 'SEO', 'search engine optimization', $themename ),
'support' => _x( 'Support', 'documentation links', $themename ),
'updates' => _x( 'Updates', 'theme updates', $themename ),
* Filters the data used to construct ePanel's layout.
$options = apply_filters( 'et_epanel_layout_data', $options );
* Filters the slugs/ids for ePanel's tabs.
* @since 3.2.1 Deprecated
* @param string[] $tab_slugs
$epanelMainTabs = apply_filters( 'epanel_page_maintabs', $epanelMainTabs );
foreach( $epanelMainTabs as $tab_slug ) {
if ( isset( $default_tab_names[ $tab_slug ] ) ) {
$tabs[ $tab_slug ] = $default_tab_names[ $tab_slug ];
* Filters ePanel's localized tab names.
* @param string[] $tabs {
* @type string $tab_slug Localized tab name.
$tabs = apply_filters( 'et_epanel_tab_names', $tabs );
et_core_nonce_verified_previously();
if ( isset($_GET['saved']) ) {
if ( $_GET['saved'] ) echo '<div id="message" class="updated fade"><p><strong>' . esc_html( $themename ) . ' ' . esc_html__( 'settings saved.', $themename ) . '</strong></p></div>';
if ( isset($_GET['reset']) ) {
if ( $_GET['reset'] ) echo '<div id="message" class="updated fade"><p><strong>' . esc_html( $themename ) . ' ' . esc_html__( 'settings reset.', $themename ) . '</strong></p></div>';
<button class="et-save-button" id="epanel-save-top"><?php esc_html_e( 'Save Changes', $themename ); ?></button>
<form method="post" id="main_options_form" enctype="multipart/form-data">
<div id="epanel-wrapper">
<div id="epanel" class="et-onload">
<div id="epanel-content-wrap">
<div id="epanel-content">
<h1 id="epanel-title"><?php printf( esc_html__( '%s Theme Options', $themename ), esc_html( $themename ) ); ?></h1>
<a href="#" class="et-defaults-button epanel-reset" title="<?php esc_attr_e( 'Reset to Defaults', $themename ); ?>"><span class="label"><?php esc_html_e( 'Reset to Defaults', $themename ); ?></span></a>
$portability_link = function_exists( 'et_builder_portability_link' )
? 'et_builder_portability_link'
: 'et_core_portability_link';
echo et_core_esc_previously(
// @phpcs:ignore Generic.PHP.ForbiddenFunctions.Found
array( 'class' => 'et-defaults-button epanel-portability' )
<ul id="epanel-mainmenu">
foreach ( $tabs as $tab_slug => $tab_name ) {
if ( 'ad' === $tab_slug ) {
$tab_slug = 'advertisements';
printf( '<li><a href="#wrap-%1$s">%2$s</a></li>', esc_attr( $tab_slug ), esc_html( $tab_name ) );
do_action( 'epanel_render_maintabs', $epanelMainTabs );
</ul><!-- end epanel mainmenu -->
foreach ($options as $value) {
if ( ! isset( $value['type'] ) ) {
if ( ! empty( $value[ 'depends_on' ] ) ) {
// function defined in 'depends on' key returns false, if a setting shouldn't be displayed
// @phpcs:ignore Generic.PHP.ForbiddenFunctions.Found
if ( ! call_user_func( $value[ 'depends_on' ] ) ) {
$is_new_global_setting = false;
$global_setting_main_name = $global_setting_sub_name = '';
if ( isset( $value['is_global'] ) && $value['is_global'] && ! empty( $value['id'] ) ) {
$is_new_global_setting = true;
$global_setting_main_name = isset( $value['main_setting_name'] ) ? sanitize_text_field( $value['main_setting_name'] ) : '';
$global_setting_sub_name = isset( $value['sub_setting_name'] ) ? sanitize_text_field( $value['sub_setting_name'] ) : '';
$is_hidden_option = isset( $value['hide_option'] ) && $value['hide_option'];
$hidden_option_classname = $is_hidden_option ? ' et-hidden-option' : '';
$disabled = $is_hidden_option ? 'disabled="disabled"' : '';
if ( in_array( $value['type'], array( 'text', 'textlimit', 'textarea', 'select', 'checkboxes', 'different_checkboxes', 'colorpicker', 'textcolorpopup', 'upload', 'callback_function', 'et_color_palette', 'password' ) ) ) { ?>
<div class="et-epanel-box">
<div class="et-box-title">
<h3><?php echo esc_html( $value['name'] ); ?></h3>
<div class="et-box-descr">
echo wp_kses( $value['desc'],
</div> <!-- end et-box-desc-content div -->
</div> <!-- end div et-box-title -->
<div class="et-box-content">
<?php if ( in_array( $value['type'], array( 'text', 'password' ) ) ) { ?>
if ( 'et_automatic_updates_options' === $global_setting_main_name ) {
if ( ! $setting = get_site_option( $global_setting_main_name ) ) {
$setting = get_option( $global_setting_main_name, array() );
$et_input_value = isset( $setting[ $global_setting_sub_name ] ) ? $setting[ $global_setting_sub_name ] : '';
$et_input_value = et_get_option( $value['id'], '', '', false, $is_new_global_setting, $global_setting_main_name, $global_setting_sub_name );
$et_input_value = ! empty( $et_input_value ) ? $et_input_value : $value['std'];
$et_input_value = stripslashes( $et_input_value );
if( 'password' === $value['type'] && !empty( $et_input_value ) ) {
$et_input_value = _et_epanel_password_mask();
<input name="<?php echo esc_attr( $value['id'] ); ?>" id="<?php echo esc_attr( $value['id'] ); ?>" type="<?php echo esc_attr( $value['type'] ); ?>" value="<?php echo esc_attr( $et_input_value ); ?>" />
<?php } elseif ( 'textlimit' === $value['type'] ) { ?>
$et_input_value = et_get_option( $value['id'], '', '', false, $is_new_global_setting, $global_setting_main_name, $global_setting_sub_name );
$et_input_value = ! empty( $et_input_value ) ? $et_input_value : $value['std'];
$et_input_value = stripslashes( $et_input_value );
<input name="<?php echo esc_attr( $value['id'] ); ?>" id="<?php echo esc_attr( $value['id'] ); ?>" type="text" maxlength="<?php echo esc_attr( $value['max'] ); ?>" size="<?php echo esc_attr( $value['max'] ); ?>" value="<?php echo esc_attr( $et_input_value ); ?>" />
<?php } elseif ( 'colorpicker' === $value['type'] ) { ?>
<div id="colorpickerHolder"></div>
<?php } elseif ( 'textcolorpopup' === $value['type'] ) { ?>
$et_input_value = et_get_option( $value['id'], '', '', false, $is_new_global_setting, $global_setting_main_name, $global_setting_sub_name );
$et_input_value = ! empty( $et_input_value ) ? $et_input_value : $value['std'];
<input name="<?php echo esc_attr( $value['id'] ); ?>" id="<?php echo esc_attr( $value['id'] ); ?>" class="colorpopup" type="text" value="<?php echo esc_attr( $et_input_value ); ?>" />
<?php } elseif ( 'textarea' === $value['type'] ) { ?>
// get the custom css value from WP custom CSS option if supported
if ( ( $shortname . '_custom_css' ) === $value['id'] && function_exists( 'wp_get_custom_css') ) {
$et_textarea_value = wp_get_custom_css();
$et_textarea_value = strip_tags( $et_textarea_value );
$et_textarea_value = et_get_option( $value['id'], '', '', false, $is_new_global_setting, $global_setting_main_name, $global_setting_sub_name );
$et_textarea_value = ! empty( $et_textarea_value ) ? $et_textarea_value : $value['std'];
<textarea name="<?php echo esc_attr( $value['id'] ); ?>" id="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_textarea( $et_textarea_value ); ?></textarea>
<?php } elseif ( 'upload' === $value['type'] ) { ?>
$et_upload_button_data = isset( $value['button_text'] ) ? sprintf( ' data-button_text="%1$s"', esc_attr( $value['button_text'] ) ) : '';
<input id="<?php echo esc_attr( $value['id'] ); ?>" class="et-upload-field" type="text" size="90" name="<?php echo esc_attr( $value['id'] ); ?>" value="<?php echo esc_url( et_get_option( $value['id'], '', '', false, $is_new_global_setting, $global_setting_main_name, $global_setting_sub_name ) ); ?>" />
<div class="et-upload-buttons">
<span class="et-upload-image-reset"><?php esc_html_e( 'Reset', $themename ); ?></span>
<input class="et-upload-image-button" type="button"<?php echo et_core_esc_previously( $et_upload_button_data ); ?> value="<?php esc_attr_e( 'Upload', $themename ); ?>" />
<div class="clear"></div>
<?php } elseif ( 'select' === $value['type'] ) { ?>
<select name="<?php echo esc_attr( $value['id'] ); ?>" id="<?php echo esc_attr( $value['id'] ); ?>">
<?php foreach ( $value['options'] as $option_key => $option ) { ?>
$et_use_option_values = ( isset( $value['et_array_for'] ) && in_array( $value['et_array_for'], array( 'pages', 'categories' ) ) ) ||
( isset( $value['et_save_values'] ) && $value['et_save_values'] ) ? true : false;
$et_option_db_value = et_get_option( $value['id'] );
if ( ( $et_use_option_values && ( $et_option_db_value === $option_key ) ) || ( stripslashes( $et_option_db_value ) === trim( stripslashes( $option ) ) ) || ( ! $et_option_db_value && isset( $value['std'] ) && stripslashes( $option ) === stripslashes( $value['std'] ) ) )
$et_select_active = ' selected="selected"';
<option<?php if ( $et_use_option_values ) echo ' value="' . esc_attr( $option_key ) . '"'; ?> <?php echo et_core_esc_previously( $et_select_active ); ?>><?php echo esc_html( trim( $option ) ); ?></option>
<?php } elseif ( 'checkboxes' === $value['type'] ) { ?>
if ( empty( $value['options'] ) ) {
esc_html_e( "You don't have pages", $themename );
if ( isset( $value['excludeDefault'] ) && $value['excludeDefault'] === 'true' ) $className .= ' different';
foreach ( $value['options'] as $option ) {
$class_name_last = 0 === $i % 3 ? ' last' : '';
if ( et_get_option( $value['id'] ) ) {
if ( in_array( $option, et_get_option( $value['id'] ) ) ) {
$checked = "checked=\"checked\"";
$et_checkboxes_label = $value['id'] . '-' . $option;
if ( 'custom' === $value['usefor'] ) {
$et_helper = (array) $value['helper'];
$et_checkboxes_value = $et_helper[$option];
if ( 'taxonomy_terms' === $value['usefor'] && isset( $value['taxonomy_name'] ) ) {
$et_checkboxes_term = get_term_by( 'id', $option, $value['taxonomy_name'] );
$et_checkboxes_value = sanitize_text_field( $et_checkboxes_term->name );
$et_checkboxes_value = ( 'pages' === $value['usefor'] ) ? get_pagename( $option ) : get_categname( $option );
<p class="<?php echo esc_attr( $className . $class_name_last ); ?>">
<input type="checkbox" class="et-usual-checkbox" name="<?php echo esc_attr( $value['id'] ); ?>[]" id="<?php echo esc_attr( $et_checkboxes_label ); ?>" value="<?php echo esc_attr( $option ); ?>" <?php echo esc_html( $checked ); ?> />
<label for="<?php echo esc_attr( $et_checkboxes_label ); ?>"><?php echo esc_html( $et_checkboxes_value ); ?></label>
<br class="et-clearfix"/>
<?php } elseif ( 'different_checkboxes' === $value['type'] ) { ?>
foreach ( $value['options'] as $option ) {
if ( et_get_option( $value['id'] ) !== false ) {
if ( in_array( $option, et_get_option( $value['id'] ) ) ) $checked = "checked=\"checked\"";
} elseif ( isset( $value['std'] ) ) {
if ( in_array( $option, $value['std'] ) ) {
$checked = "checked=\"checked\"";
<p class="postinfo <?php echo esc_attr( 'postinfo-' . $option ); ?>">
<input type="checkbox" class="et-usual-checkbox" name="<?php echo esc_attr( $value['id'] ); ?>[]" id="<?php echo esc_attr( $value['id'] . '-' . $option ); ?>" value="<?php echo esc_attr( $option ); ?>" <?php echo esc_html( $checked ); ?> />
<br class="et-clearfix"/>
<?php } elseif ( 'callback_function' === $value['type'] ) {
// @phpcs:ignore Generic.PHP.ForbiddenFunctions.Found
call_user_func( $value['function_name'] ); ?>
<?php } elseif ( 'et_color_palette' === $value['type'] ) {
$items_amount = isset( $value['items_amount'] ) ? $value['items_amount'] : 1;
$et_input_value = et_get_option( $value['id'], '', '', false, $is_new_global_setting, $global_setting_main_name, $global_setting_sub_name );
$et_input_value_processed = str_replace( '|', '', $et_input_value );
$et_input_value = ! empty( $et_input_value_processed ) ? $et_input_value : $value['std'];