: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* @param bool $is_dark_mode Whether the color scheme is for dark mode.
private function get_color_scheme_controls( $is_dark_mode = false ) {
// Append '_dark' to keys if it's for dark mode.
$is_dark_mode_suffix = $is_dark_mode ? '_dark' : '';
// Data attributes to disable extensions from appearing in the input field.
'1p-ignore' => 'true', // 1Password ignore.
'lp-ignore' => 'true', // LastPass ignore.
"email_background_color{$is_dark_mode_suffix}" => esc_html__( 'Background', 'wpforms-lite' ),
"email_body_color{$is_dark_mode_suffix}" => esc_html__( 'Body', 'wpforms-lite' ),
"email_text_color{$is_dark_mode_suffix}" => esc_html__( 'Text', 'wpforms-lite' ),
"email_links_color{$is_dark_mode_suffix}" => esc_html__( 'Links', 'wpforms-lite' ),
foreach ( $controls as $key => $label ) {
// Construct the color controls array.
'fallback-color' => $this->style_overrides[ $key ],
* Get current email template hyperlink.
private function get_current_template_preview_link() {
// Leave if the user has the legacy template is set or the user doesn't have the capability.
if ( ! wpforms_current_user_can() || Helpers::is_legacy_html_template() ) {
$template_name = Helpers::get_current_template_name();
$current_template = Notifications::get_available_templates( $template_name );
// Return empty string if the current template is not found.
// Leave early if the preview link is empty.
if ( ! isset( $current_template['path'] ) || ! class_exists( $current_template['path'] ) || empty( $current_template['preview'] ) ) {
wp_kses( /* translators: %1$s - Email template preview URL. */
__( '<a href="%1$s" class="wpforms-btn-preview" target="_blank" rel="noopener">Preview Email Template</a>', 'wpforms-lite' ),
esc_url( $current_template['preview'] )
* Maybe add the background color control to the email settings.
* This is only available in the free version.
* @param array $settings Email settings.
private function maybe_add_background_color_control( $settings ) {
// Leave as is if the Pro version is active and no legacy template available.
if ( ! Helpers::is_legacy_html_template() && wpforms()->is_pro() ) {
// Add the background color control after the header image.
return wpforms_array_insert(
'email-background-color' => [
'id' => 'email-background-color',
'name' => esc_html__( 'Background Color', 'wpforms-lite' ),
'desc' => esc_html__( 'Customize the background color of the email template.', 'wpforms-lite' ),
'class' => [ 'email-background-color', 'has-preview-changes', 'email-light-mode' ],
'is_hidden' => $this->plain_text,
'fallback-color' => $this->style_overrides['email_background_color'],
'1p-ignore' => 'true', // 1Password ignore.
'lp-ignore' => 'true', // LastPass ignore.
* Gets the class for the header image control.
* This is used to determine if the header image is external.
* Legacy header image control was allowing external URLs.
* Note that this evaluation is only available for the "Light" mode,
* as the "Dark" mode is a new feature and doesn't have the legacy header image control.
private function get_external_header_image_class() {
$header_image_url = wpforms_setting( 'email-header-image', '' );
// If the header image URL is empty, return an empty string.
if ( empty( $header_image_url ) ) {
$site_url = home_url(); // Get the current site's URL.
// Get the hosts of the site URL and the header image URL.
$site_url_host = wp_parse_url( $site_url, PHP_URL_HOST );
$header_image_url_host = wp_parse_url( $header_image_url, PHP_URL_HOST );
// Check if the header image URL host is different from the site URL host.
if ( $header_image_url_host && $site_url_host && $header_image_url_host !== $site_url_host ) {
return 'has-external-image-url';
return ''; // If none of the conditions match, return an empty string.
* Determine if the current page is the "Email" settings page.
private function is_settings_page() {
return wpforms_is_admin_page( 'settings', 'email' );