This repository has been archived on 2022-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
divi/includes/builder/module/settings/migration/OptionsHarmony.php

512 lines
18 KiB
PHP

<?php
class ET_Builder_Module_Settings_Migration_OptionsHarmony extends ET_Builder_Module_Settings_Migration {
public $version = '3.0.74';
public function __construct() {
parent::__construct();
self::$_bb_excluded_name_changes[] = 'text_orientation';
}
public function get_fields() {
return array(
'parallax' => array(
'affected_fields' => array(
'parallax_effect' => $this->get_modules( 'post_title' ),
),
),
'parallax_method' => array(
'affected_fields' => array(
'parallax_effect' => $this->get_modules( 'post_title' ),
'parallax_method' => $this->get_modules( 'slide' ),
),
'values' => array(
'off' => 'on',
'on' => 'off',
),
),
'background_color' => array(
'affected_fields' => array(
'module_bg_color' => $this->get_modules( 'post_title' ),
'field_bg' => $this->get_modules( 'search' ),
'bg_color' => $this->get_modules( 'social_media_follow_network' ),
'transparent_background' => $this->get_modules( 'section' ),
'transparent_background_fb' => $this->get_modules( 'section' ),
),
),
'custom_padding' => array(
'affected_fields' => array(
'bar_top_padding' => $this->get_modules( 'bar_counters' ),
'bar_bottom_padding' => $this->get_modules( 'bar_counters' ),
'top_padding' => $this->get_modules( 'slider' ),
'bottom_padding' => $this->get_modules( 'slider' ),
'custom_padding' => $this->get_modules( 'section' ),
),
),
'custom_padding_tablet' => array(
'affected_fields' => array(
'bar_top_padding_tablet' => $this->get_modules( 'bar_counters' ),
'bar_bottom_padding_tablet' => $this->get_modules( 'bar_counters' ),
'top_padding_tablet' => $this->get_modules( 'slider' ),
'bottom_padding_tablet' => $this->get_modules( 'slider' ),
'padding_mobile' => $this->get_modules( 'section' ),
),
),
'custom_padding_phone' => array(
'affected_fields' => array(
'bar_top_padding_phone' => $this->get_modules( 'bar_counters' ),
'bar_bottom_padding_phone' => $this->get_modules( 'bar_counters' ),
'top_padding_phone' => $this->get_modules( 'slider' ),
'bottom_padding_phone' => $this->get_modules( 'slider' ),
),
),
'custom_padding_last_edited' => array(
'affected_fields' => array(
'bar_top_padding_last_edited' => $this->get_modules( 'bar_counters' ),
'bar_bottom_padding_last_edited' => $this->get_modules( 'bar_counters' ),
'top_padding_last_edited' => $this->get_modules( 'slider' ),
'bottom_padding_last_edited' => $this->get_modules( 'slider' ),
'padding_mobile' => $this->get_modules( 'section' ),
),
),
'background_video_mp4' => array(
'affected_fields' => array(
'video_bg_mp4' => $this->get_modules( 'slide' ),
),
),
'background_video_webm' => array(
'affected_fields' => array(
'video_bg_webm' => $this->get_modules( 'slide' ),
),
),
'background_video_width' => array(
'affected_fields' => array(
'video_bg_width' => $this->get_modules( 'slide' ),
),
),
'background_video_height' => array(
'affected_fields' => array(
'video_bg_height' => $this->get_modules( 'slide' ),
),
),
'disabled_on' => array(
'affected_fields' => array(
'hide_on_mobile' => $this->get_modules( 'divider' ),
),
),
'show_prev' => array(
'affected_fields' => array(
'hide_prev' => $this->get_modules( 'post_nav' ),
),
),
'show_next' => array(
'affected_fields' => array(
'hide_next' => $this->get_modules( 'post_nav' ),
),
),
'show_inner_shadow' => array(
'affected_fields' => array(
'remove_inner_shadow' => $this->get_modules( 'slider' ),
),
),
'show_featured_drop_shadow' => array(
'affected_fields' => array(
'remove_featured_drop_shadow' => $this->get_modules( 'pricing_table' ),
),
),
'show_button' => array(
'affected_fields' => array(
'hide_button' => $this->get_modules( 'search' ),
),
),
'show_border' => array(
'affected_fields' => array(
'remove_border' => $this->get_modules( 'sidebar' ),
),
),
'show_image_overlay' => array(
'affected_fields' => array(
'show_image_overlay' => $this->get_modules( 'video_slider' ),
),
),
'show_content_on_mobile' => array(
'affected_fields' => array(
'hide_content_on_mobile' => $this->get_modules( 'slider' ),
),
),
'show_cta_on_mobile' => array(
'affected_fields' => array(
'hide_cta_on_mobile' => $this->get_modules( 'slider' ),
),
),
'show_bottom_space' => array(
'affected_fields' => array(
'sticky' => $this->get_modules( 'image' ),
),
),
'image_max_width' => array(
'affected_fields' => array(
'max_width' => $this->get_modules( 'blurb' ),
),
),
'content_max_width' => array(
'affected_fields' => array(
'max_width' => $this->get_modules( 'fullwidth_header' ),
),
),
'max_width' => array(
'affected_fields' => array(
'max_width' => $this->get_modules( 'reset_max_width' ),
),
),
'title_text_color' => array(
'affected_fields' => array(
'label_color' => $this->get_modules( 'bar_counter' ),
),
),
'percent_text_color' => array(
'affected_fields' => array(
'percentage_color' => $this->get_modules( 'bar_counter' ),
),
),
'module_alignment' => array(
'affected_fields' => array(
'text_orientation' => $this->get_modules( 'text_orientation' ),
),
),
);
}
public function get_modules( $attr = '' ) {
$modules = array();
// Section
if ( in_array( $attr, array( '', 'section' ) ) ) {
$modules[] = 'et_pb_section';
}
// Post title & Fullwidth post title migration settings
if ( in_array( $attr, array( '', 'post_title' ) ) ) {
$modules[] = 'et_pb_post_title';
$modules[] = 'et_pb_fullwidth_post_title';
}
// Blurb migration setting
if ( in_array( $attr, array( '', 'blurb' ) ) ) {
$modules[] = 'et_pb_blurb';
}
// Fullwidth Header
if ( in_array( $attr, array( '', 'fullwidth_header' ) ) ) {
$modules[] = 'et_pb_fullwidth_header';
}
if ( 'reset_max_width' === $attr ) {
$modules[] = 'et_pb_blurb';
$modules[] = 'et_pb_fullwidth_header';
}
if ( in_array( $attr, array( '', 'text_orientation' ) ) ) {
$modules[] = 'et_pb_text';
$modules[] = 'et_pb_search';
}
// Social media follow item migration settings
if ( in_array( $attr, array( '', 'social_media_follow_network' ) ) ) {
$modules[] = 'et_pb_social_media_follow_network';
}
// Bar Counters
if ( in_array( $attr, array( '', 'bar_counters' ) ) ) {
$modules[] = 'et_pb_counters';
}
// Bar Counter Item
if ( in_array( $attr, array( '', 'bar_counter' ) ) ) {
$modules[] = 'et_pb_counter';
}
// Slider
if ( in_array( $attr, array( '', 'slider' ) ) ) {
$modules[] = 'et_pb_post_slider';
$modules[] = 'et_pb_fullwidth_post_slider';
$modules[] = 'et_pb_slider';
$modules[] = 'et_pb_fullwidth_slider';
}
// Slide Item
if ( in_array( $attr, array( '', 'slide' ) ) ) {
$modules[] = 'et_pb_slide';
}
// Divider
if ( in_array( $attr, array( '', 'divider' ) ) ) {
$modules[] = 'et_pb_divider';
}
// Post Nav
if ( in_array( $attr, array( '', 'post_nav' ) ) ) {
$modules[] = 'et_pb_post_nav';
}
// Pricing Tables
if ( in_array( $attr, array( '', 'pricing_table' ) ) ) {
$modules[] = 'et_pb_pricing_tables';
}
// Search
if ( in_array( $attr, array( '', 'search' ) ) ) {
$modules[] = 'et_pb_search';
}
// Sidebar
if ( in_array( $attr, array( '', 'sidebar' ) ) ) {
$modules[] = 'et_pb_sidebar';
}
// Video Slider
if ( in_array( $attr, array( '', 'video_slider' ) ) ) {
$modules[] = 'et_pb_video_slider';
}
// Image
if ( in_array( $attr, array( '', 'image' ) ) ) {
$modules[] = 'et_pb_image';
}
return $modules;
}
public function migrate_spacing( $current_value, $saved_value, $location, $saved_field_name = '', $module_slug = '' ) {
$locations = array( 'top', 'right', 'bottom', 'left' );
$location_index = array_search( $location, $locations );
$spacings = array( '', '', '', '' );
if ( -1 === $location_index ) {
return $current_value;
}
if ( '' !== $saved_value ) {
$spacings = explode( '|', $saved_value );
$spacings[ $location_index ] = $saved_value;
}
$spacings[ $location_index ] = $current_value;
// Automatically add zero pixel to padding-right & padding-left of slider & post slider if custom top/bottom padding exist
if ( '' !== $current_value && in_array( $saved_field_name, array( 'top_padding', 'bottom_padding' ) ) && in_array( $module_slug, array( 'et_pb_slider', 'et_pb_post_slider' ) ) ) {
$spacings[1] = '0px';
$spacings[3] = '0px';
}
return implode( '|', $spacings );
}
/**
* Re-map value to new value. Originally add to reverse yes/no button value due to option migration
*
* @param string saved value
* @param array map of value, expected mapped value in key-value relationship
* @param string default value
* @return string mapped value
*/
public function migrate_remap_value( $value, $map = array(), $default = 'on' ) {
$map = wp_parse_args(
$map,
array(
'' => 'on',
'off' => 'on',
'on' => 'off',
)
);
return isset( $map[ $value ] ) ? $map[ $value ] : $default;
}
public function migrate( $field_name, $current_value, $module_slug, $saved_value, $saved_field_name, $attrs, $content, $module_address ) {
// Padding top & bottom migration to full paddings
if ( in_array( $module_slug, array( 'et_pb_counters', 'et_pb_post_slider', 'et_pb_fullwidth_post_slider', 'et_pb_slider', 'et_pb_fullwidth_slider' ) ) ) {
$top_padding_selectors = array(
'bar_top_padding',
'bar_top_padding_tablet',
'bar_top_padding_phone',
'top_padding',
'top_padding_tablet',
'top_padding_phone',
);
if ( in_array( $saved_field_name, $top_padding_selectors ) ) {
return $this->migrate_spacing( $current_value, $saved_value, 'top', $saved_field_name, $module_slug );
}
$bottom_padding_selectors = array(
'bar_bottom_padding',
'bar_bottom_padding_tablet',
'bar_bottom_padding_phone',
'bottom_padding',
'bottom_padding_tablet',
'bottom_padding_phone',
);
if ( in_array( $saved_field_name, $bottom_padding_selectors ) ) {
return $this->migrate_spacing( $current_value, $saved_value, 'bottom', $saved_field_name, $module_slug );
}
if ( in_array( $saved_field_name, array( 'bar_top_padding_last_edited', 'bar_bottom_padding_last_edited' ) ) ) {
$last_edited_current_value = '' === $current_value ? array( '', '' ) : explode( '|', $current_value );
$last_edited_saved_value = '' === $saved_value ? array( '', '' ) : explode( '|', $saved_value );
$last_edited_responsive = in_array( 'on', array( $last_edited_current_value[0], $last_edited_saved_value[0] ) ) ? 'on' : 'off';
$last_edited_tabs = array_filter( array( $last_edited_current_value[1], $last_edited_saved_value[1] ) );
$last_edited_tab = empty( $last_edited_tabs ) ? 'desktop' : end( $last_edited_tabs );
return "{$last_edited_responsive}|{$last_edited_tab}";
}
}
// Section's padding related migration
if ( 'et_pb_section' === $module_slug ) {
// Migrating two side paddings (prior to Divi v2.4) into full paddings
if ( 'custom_padding' === $field_name && 'custom_padding' === $saved_field_name ) {
$padding_sides = explode( '|', $current_value );
if ( 2 === count( $padding_sides ) ) {
$full_padding_sides = array(
$padding_sides[0],
'',
$padding_sides[1],
'',
);
return implode( '|', $full_padding_sides );
}
}
// Translating "Keep padding on mobile" options into *_last_edited value
if ( 'custom_padding_last_edited' === $field_name && 'padding_mobile' === $saved_field_name ) {
if ( 'off' === $current_value && '' === $saved_value ) {
return 'on|desktop';
}
return $saved_value;
}
// Translating "Keep padding on mobile" options into custom_padding_tablet value
if ( 'custom_padding_tablet' === $field_name && 'padding_mobile' === $saved_field_name ) {
// Keep padding on mobile is disabled
if ( '' === $saved_value && 'off' === $current_value ) {
return '50px|0|50px|0';
}
// Keep padding on mobile is enabled and custom padding is defined. If no custom_padding value is defined,
// the value is expected to be empty string, which makes letting $saved_value to be returned is ok
if ( '' === $saved_value && 'on' === $current_value && isset( $attrs['custom_padding'] ) ) {
return $attrs['custom_padding'];
}
return $saved_value;
}
// Translating transparent_background into background_color
if ( 'background_color' === $field_name && in_array( $saved_field_name, array( 'transparent_background', 'transparent_background_fb' ) ) ) {
// Transparent is default for Builder Plugin, but not for theme
if ( 'on' === $current_value || ( et_is_builder_plugin_active() && 'default' === $current_value ) ) {
return 'rgba(255,255,255,0)';
} else {
return $saved_value;
}
}
}
// Divider's hide_on_mobile migration
if ( 'et_pb_divider' === $module_slug && 'disabled_on' === $field_name ) {
// Set disabled_on if it is previously empty and hide_on_mobile is empty / on (its default value is on)
if ( in_array( $current_value, array( '', 'on' ) ) && '' === $saved_value ) {
return 'on|on|off';
}
// Translate hide_on_mobile into disabled_on if hide_on_mobile is empty / on and saved_value isn't empty
if ( in_array( $current_value, array( '', 'on' ) ) && '' !== $saved_value ) {
$disabled_on_array = explode( '|', $saved_value );
$disabled_on_array[0] = 'on';
$disabled_on_array[1] = 'on';
return implode( '|', $disabled_on_array );
}
// Otherwise, return saved value
return $saved_value;
}
if ( 'parallax_method' === $field_name ) {
// Reverse post title and fullwidth post title's parallax_method value because its previous select option values (on = CSS, off = True)
// were reversed compared to background UI's parallax_method select options values (on = True, off = CSS)
if ( in_array( $module_slug, $this->get_modules( 'post_title' ) ) && isset( $this->fields[ $field_name ] ) && isset( $this->fields[ $field_name ]['values'][ $saved_value ] ) ) {
return $this->fields[ $field_name ]['values'][ $saved_value ];
}
// Previous version of slide item has parallax_method options order reversed which causing CSS Parallax can't be rendered.
// If the attribute has been saved, it will be rendered just fine
// $saved_value reflects the correct value, now it inherits value from Slider / Fullwidth Slider module
if ( in_array( $module_slug, $this->get_modules( 'slide' ) ) && '' === $current_value ) {
return $saved_value;
}
}
// Normalizing video slider's display image overlay's hide/show & select-based field into yes_no_button + on/off-based option
if ( 'et_pb_video_slider' === $module_slug && 'show_image_overlay' === $field_name ) {
return $this->migrate_remap_value(
$current_value,
array(
'hide' => 'off',
'show' => 'on',
'' => 'off',
),
'off'
);
}
// Search's input background migration
if ( 'et_pb_search' === $module_slug && 'background_color' === $field_name ) {
if ( '' !== $saved_value && '' === $current_value ) {
return $saved_value;
}
}
// Only Text & Search module's text_orientation = center that is being migrated to each module's module_alignment attribute
// If module's text_orientation has different value, let it be. This is needed because on previous version, .et_pb_text_align_center class
// set text-align: center; AND margin: 0 auto; margin: 0 auto; belongs to module alignment now, hence the migration
if ( in_array( $module_slug, $this->get_modules( 'text_orientation' ) ) && 'text_orientation' === $saved_field_name && 'module_alignment' === $field_name ) {
if ( 'center' === $current_value && '' === $saved_value ) {
return $current_value;
}
return $saved_value;
}
// Normalizing "remove_*" & "hide_*" option, to ensure that "Yes" === "Show".
// saved value needs to be reversed / remapped, off == on, vice versa
$is_slider_remove = in_array( $module_slug, $this->get_modules( 'slider' ) ) && in_array( $saved_field_name, array( 'remove_inner_shadow', 'hide_content_on_mobile', 'hide_cta_on_mobile' ) );
$is_post_nav_hides = 'et_pb_post_nav' === $module_slug && in_array( $saved_field_name, array( 'hide_prev', 'hide_next' ) );
$is_pricing_tables_remove = 'et_pb_pricing_tables' === $module_slug && in_array( $saved_field_name, array( 'remove_featured_drop_shadow' ) );
$is_search_hide = 'et_pb_search' === $module_slug && in_array( $saved_field_name, array( 'hide_button' ) );
$is_sidebar_remove = 'et_pb_sidebar' === $module_slug && in_array( $saved_field_name, array( 'remove_border' ) );
$is_image_sticky = 'et_pb_image' === $module_slug && in_array( $saved_field_name, array( 'sticky' ) );
if ( $is_slider_remove || $is_post_nav_hides || $is_pricing_tables_remove || $is_search_hide || $is_sidebar_remove || $is_image_sticky ) {
return $this->migrate_remap_value( $current_value );
}
// Blurb's max_width needs to be removed, since older max_width is new image_max_width
if ( in_array( $module_slug, $this->get_modules( 'reset_max_width' ) ) && 'max_width' === $field_name && 'max_width' === $saved_field_name ) {
return '';
}
return $current_value;
}
}
return new ET_Builder_Module_Settings_Migration_OptionsHarmony();