: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
'background_video_width',
'background_video_height',
'computed_minimum' => array(
'padding_top' => array( 'tab_slug' => 'advanced' ),
'padding_right' => array( 'tab_slug' => 'advanced' ),
'padding_bottom' => array( 'tab_slug' => 'advanced' ),
'padding_left' => array( 'tab_slug' => 'advanced' ),
'padding_top_bottom_link' => array( 'tab_slug' => 'advanced' ),
'padding_left_right_link' => array( 'tab_slug' => 'advanced' ),
'padding_%column_index%_tablet' => array(
'has_custom_index_location' => true,
'tab_slug' => 'advanced',
'padding_%column_index%_phone' => array(
'has_custom_index_location' => true,
'tab_slug' => 'advanced',
'padding_%column_index%_last_edited' => array(
'has_custom_index_location' => true,
'tab_slug' => 'advanced',
'module_id' => array( 'tab_slug' => 'custom_css' ),
'module_class' => array( 'tab_slug' => 'custom_css' ),
'custom_css_before' => array( 'tab_slug' => 'custom_css' ),
'custom_css_main' => array( 'tab_slug' => 'custom_css' ),
'custom_css_after' => array( 'tab_slug' => 'custom_css' ),
return array_merge( $fields, $column_fields );
public function get_transition_fields_css_props() {
$fields = parent::get_transition_fields_css_props();
for ( $i = 1; $i <= 6; $i ++ ) {
$selector = "%%order_class%% > .et_pb_column:nth-child({$i})";
$fields["background_color_{$i}"] = array( 'background-color' => $selector );
$fields["padding_{$i}"] = array( 'padding' => $selector );
function render( $atts, $content = null, $function_name ) {
$custom_padding = $this->props['custom_padding'];
$custom_padding_tablet = $this->props['custom_padding_tablet'];
$custom_padding_phone = $this->props['custom_padding_phone'];
$custom_padding_last_edited = $this->props['custom_padding_last_edited'];
$column_padding_mobile = $this->props['column_padding_mobile'];
$make_equal = $this->props['make_equal'];
$padding_mobile = $this->props['padding_mobile'];
$gutter_width = $this->props['gutter_width'];
$gutter_width_hover = $this->get_hover_value( 'gutter_width' );
$global_module = $this->props['global_module'];
$use_custom_gutter = $this->props['use_custom_gutter'];
$hover = et_pb_hover_options();
global $et_pb_all_column_settings, $et_pb_rendering_column_content, $et_pb_rendering_column_content_row;
$et_pb_all_column_settings = ! isset( $et_pb_all_column_settings ) ? array() : $et_pb_all_column_settings;
$et_pb_all_column_settings_backup = $et_pb_all_column_settings;
$keep_column_padding_mobile = $column_padding_mobile;
if ( '' !== $global_module ) {
$global_content = et_pb_load_global_module( $global_module, $function_name );
if ( '' !== $global_content ) {
return do_shortcode( et_pb_fix_shortcodes( wpautop( $global_content ) ) );
$custom_padding_responsive_active = et_pb_get_responsive_status( $custom_padding_last_edited );
$padding_mobile_values = $custom_padding_responsive_active ? array(
'tablet' => explode( '|', $custom_padding_tablet ),
'phone' => explode( '|', $custom_padding_phone ),
$internal_columns_settings_array = array(
'keep_column_padding_mobile' => $keep_column_padding_mobile,
'et_pb_columns_counter' => 0,
$current_row_position = $et_pb_rendering_column_content ? 'internal_row' : 'regular_row';
$et_pb_all_column_settings[ $current_row_position ] = $internal_columns_settings_array;
if ( $et_pb_rendering_column_content ) {
$et_pb_rendering_column_content_row = true;
if ( 'on' === $make_equal ) {
$this->add_classname( 'et_pb_equal_columns' );
if ( 'on' === $use_custom_gutter && '' !== $gutter_width ) {
$gutter_width = '0' === $gutter_width ? '1' : $gutter_width; // set the gutter width to 1 if 0 entered by user
$this->add_classname( 'et_pb_gutters' . $gutter_width );
if ( et_builder_is_hover_enabled( 'gutter_width', $this->props ) && ! empty( $gutter_width_hover ) && $gutter_width !== $gutter_width_hover ) {
$this->add_classname( 'et_pb_gutter_hover' );
$gutter_hover_data = sprintf(
' data-original_gutter="%1$s" data-hover_gutter="%2$s"',
esc_attr($gutter_width_hover)
$padding_values = explode( '|', $custom_padding );
if ( ! empty( $padding_values ) ) {
// old version of Rows support only top and bottom padding, so we need to handle it along with the full padding in the recent version
if ( 2 === count( $padding_values ) ) {
$padding_settings = array(
'top' => isset( $padding_values[0] ) ? $padding_values[0] : '',
'bottom' => isset( $padding_values[1] ) ? $padding_values[1] : '',
$padding_settings = array(
'top' => isset( $padding_values[0] ) ? $padding_values[0] : '',
'right' => isset( $padding_values[1] ) ? $padding_values[1] : '',
'bottom' => isset( $padding_values[2] ) ? $padding_values[2] : '',
'left' => isset( $padding_values[3] ) ? $padding_values[3] : '',
foreach( $padding_settings as $padding_side => $value ) {
'selector' => '%%order_class%%.et_pb_row',
'declaration' => sprintf(
esc_html( $padding_side ),
// Backward compatibility. Keep Padding on Mobile is deprecated in favour of responsive inputs mechanism for custom padding
// To ensure that it is compatibility with previous version of Divi, this option is now only used as last resort if no
// responsive padding value is found, and padding_mobile value is saved (which is set to off by default)
if ( in_array( $padding_mobile, array( 'on', 'off' ) ) && 'on' !== $padding_mobile && ! $custom_padding_responsive_active ) {
$element_style['media_query'] = ET_Builder_Element::get_media_query( 'min_width_981' );
ET_Builder_Element::set_style( $function_name, $element_style );
if ( ! empty( $padding_mobile_values['tablet'] ) || ! empty( $padding_values['phone'] ) ) {
$padding_mobile_values_processed = array();
foreach( array( 'tablet', 'phone' ) as $device ) {
if ( empty( $padding_mobile_values[$device] ) ) {
$padding_mobile_values_processed[ $device ] = array(
'padding-top' => isset( $padding_mobile_values[$device][0] ) ? $padding_mobile_values[$device][0] : '',
'padding-right' => isset( $padding_mobile_values[$device][1] ) ? $padding_mobile_values[$device][1] : '',
'padding-bottom' => isset( $padding_mobile_values[$device][2] ) ? $padding_mobile_values[$device][2] : '',
'padding-left' => isset( $padding_mobile_values[$device][3] ) ? $padding_mobile_values[$device][3] : '',
if ( ! empty( $padding_mobile_values_processed ) ) {
et_pb_generate_responsive_css( $padding_mobile_values_processed, '%%order_class%%.et_pb_row', '', $function_name, ' !important; ' );
$parallax_image = $this->get_parallax_image_background();
$background_video = $this->video_background();
$this->add_classname( $this->generate_css_filters( $function_name ) );
// Remove automatically added classnames
$this->remove_classname( 'et_pb_module' );
if ( self::contains( $content, array( 'et_pb_menu', 'et_pb_fullwidth_menu' ) ) ) {
$this->add_classname( 'et_pb_row--with-menu' );
// Save module classes into variable BEFORE processing the content with `do_shortcode()`
// Otherwise order classes messed up with internal rows if exist
$module_classes = $this->module_classname( $function_name );
// Inner content shortcode parsing has to be done after all classname addition/removal
$inner_content = do_shortcode( et_pb_fix_shortcodes( $content ) );
$content_dependent_classname = '' === trim( $inner_content ) ? ' et_pb_row_empty' : '';
// reset the global column settings to make sure they are not affected by internal content
// This has to be done after inner content's shortcode being parsed
$et_pb_all_column_settings = $et_pb_all_column_settings_backup;
// Reset row's column content flag
if ( $et_pb_rendering_column_content_row ) {
$et_pb_rendering_column_content_row = false;
'<div%4$s class="%2$s%7$s"%8$s>
esc_html( $function_name ),
$content_dependent_classname,
et_core_esc_previously( $gutter_hover_data )
class ET_Builder_Row_Inner extends ET_Builder_Structure_Element {
$this->name = esc_html__( 'Row', 'et_builder' );
$this->plural = esc_html__( 'Rows', 'et_builder' );
$this->slug = 'et_pb_row_inner';
$this->vb_support = 'on';
$this->child_slug = 'et_pb_column_inner';
$this->child_item_text = esc_html__( 'Column', 'et_builder' );
$this->advanced_fields = array(
'use_background_color' => true,
'use_background_image' => true,
'use_background_color_gradient' => true,
'use_background_video' => true,
'margin_padding' => array(
'main' => '%%order_class%%.et_pb_row_inner',
'main' => '%%order_class%%.et_pb_row_inner',
'module_alignment' => array(
'label' => esc_html__( 'Row Alignment', 'et_builder' ),
'description' => esc_html__( 'Rows can be aligned to the left, right or center. By default, rows are centered within their parent section.', 'et_builder' ),
'position_fields' => array(
$this->settings_modal_toggles = array(
'column_structure' => array(
'title' => esc_html__( 'Column Structure', 'et_builder' ),
'title' => et_builder_i18n( 'Sizing' ),
$this->help_videos = array(
'name' => esc_html__( 'An introduction to Rows', 'et_builder' ),
'column_structure' => array(
'label' => esc_html__( 'Column Structure', 'et_builder' ),
'description' => esc_html__( 'Here you can choose the Column Structure for this Row.', 'et_builder' ),
'type' => 'column-structure',
'4_4' => et_pb_get_column_svg( '4_4' ),
'1_2,1_2' => et_pb_get_column_svg( '1_2,1_2' ),
'1_3,1_3,1_3' => et_pb_get_column_svg( '1_3,1_3,1_3' ),
'1_4,1_4,1_4,1_4' => et_pb_get_column_svg( '1_4,1_4,1_4,1_4' ),
'toggle_slug' => 'column_structure',
'padding_mobile' => array(
'label' => esc_html__( 'Keep Custom Padding on Mobile', 'et_builder' ),
'type' => 'skip', // Remaining attribute for backward compatibility
'tab_slug' => 'advanced',
'toggle_slug' => 'margin_padding',
'use_custom_gutter' => array(
'label' => esc_html__( 'Use Custom Gutter Width', 'et_builder' ),
'type' => 'yes_no_button',
'option_category' => 'layout',
'off' => et_builder_i18n( 'No' ),
'on' => et_builder_i18n( 'Yes' ),
'description' => esc_html__( 'Enable this option to define custom gutter width for this row.', 'et_builder' ),
'tab_slug' => 'advanced',
'toggle_slug' => 'width',
'label' => esc_html__( 'Gutter Width', 'et_builder' ),
'option_category' => 'layout',
'range_settings' => array(
'depends_show_if' => 'on',
'description' => esc_html__( 'Adjust the spacing between each column in this row.', 'et_builder' ),
'validate_unit' => false,
'tab_slug' => 'advanced',
'toggle_slug' => 'width',
'default_on_front' => (string) et_get_option( 'gutter_width', '3' ),
'label' => esc_html__( 'Equalize Column Heights', 'et_builder' ),
'description' => esc_html__( 'Equalizing column heights will force all columns to assume the height of the tallest column in the row. All columns will have the same height, keeping their appearance uniform.', 'et_builder' ),
'type' => 'yes_no_button',
'option_category' => 'layout',
'off' => et_builder_i18n( 'No' ),
'on' => et_builder_i18n( 'Yes' ),
'tab_slug' => 'advanced',
'toggle_slug' => 'width',
'column_padding_mobile' => array(
'label' => esc_html__( 'Keep Column Padding on Mobile', 'et_builder' ),
'tab_slug' => 'advanced',
'type' => 'skip', // Remaining attribute for backward compatibility
'custom_padding_last_edited' => array(
'tab_slug' => 'advanced',
$column_fields = $this->get_column_fields( 4, array(
'background_color' => array(),
'padding_top_bottom_link' => array(),
'padding_left_right_link' => array(),
'default_on_front' => 'off',
'parallax_method' => array(
'default_on_front' => 'on',
'background_size' => array(),
'background_position' => array(),
'background_repeat' => array(),
'background_blend' => array(),
'use_background_color_gradient' => array(),
'background_color_gradient_start' => array(),
'background_color_gradient_end' => array(),
'background_color_gradient_type' => array(),
'background_color_gradient_direction' => array(),
'background_color_gradient_direction_radial' => array(),
'background_color_gradient_start_position' => array(),
'background_color_gradient_end_position' => array(),
'background_color_gradient_overlays_image' => array(),
'background_video_mp4' => array(
'computed_affects' => array(
'background_video_webm' => array(
'computed_affects' => array(
'background_video_width' => array(
'computed_affects' => array(
'background_video_height' => array(
'computed_affects' => array(
'allow_player_pause' => array(
'computed_affects' => array(
'background_video_pause_outside_viewport' => array(
'computed_affects' => array(
'__video_background' => array(
'computed_callback' => array(
'get_column_video_background'
'computed_depends_on' => array(
'background_video_width',
'background_video_height',
'computed_minimum' => array(
'padding_top' => array( 'tab_slug' => 'advanced' ),
'padding_right' => array( 'tab_slug' => 'advanced' ),
'padding_bottom' => array( 'tab_slug' => 'advanced' ),
'padding_left' => array( 'tab_slug' => 'advanced' ),
'padding_top_bottom_link' => array( 'tab_slug' => 'advanced' ),
'padding_left_right_link' => array( 'tab_slug' => 'advanced' ),
'padding_%column_index%_tablet' => array(
'has_custom_index_location' => true,
'tab_slug' => 'advanced',
'padding_%column_index%_phone' => array(
'has_custom_index_location' => true,
'tab_slug' => 'advanced',
'padding_%column_index%_last_edited' => array(
'has_custom_index_location' => true,
'tab_slug' => 'advanced',
'module_id' => array( 'tab_slug' => 'custom_css' ),
'module_class' => array( 'tab_slug' => 'custom_css' ),
'custom_css_before' => array( 'tab_slug' => 'custom_css' ),
'custom_css_main' => array( 'tab_slug' => 'custom_css' ),
'custom_css_after' => array( 'tab_slug' => 'custom_css' ),
return array_merge( $fields, $column_fields );
public function get_transition_fields_css_props() {
$fields = parent::get_transition_fields_css_props();
for ( $i = 1; $i <= 6; $i ++ ) {
$selector = "%%order_class%% > .et_pb_column:nth-child({$i})";
$fields["background_color_{$i}"] = array( 'background-color' => $selector );
$fields["padding_{$i}"] = array( 'padding' => $selector );
function render( $atts, $content = null, $function_name ) {