Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/classes/language-switcher/class-wpml-ls-migration.php
2023-09-12 21:41:04 +02:00

340 lines
11 KiB
PHP

<?php
class WPML_LS_Migration {
const ICL_OPTIONS_SLUG = 'icl_sitepress_settings';
/* @var WPML_LS_Settings $settings */
private $settings;
/* @var SitePress $sitepress */
private $sitepress;
/* @var WPML_LS_Slot_Factory $slot_factory */
private $slot_factory;
/* @var array $old_settings */
private $old_settings;
/**
* WPML_LS_Migration constructor.
*
* @param WPML_LS_Settings $settings
* @param SitePress $sitepress
* @param WPML_LS_Slot_Factory $slot_factory
*/
public function __construct( $settings, $sitepress, $slot_factory ) {
$this->settings = $settings;
$this->sitepress = $sitepress;
$this->slot_factory = $slot_factory;
}
/**
* @param array $old_settings
*
* @return mixed
*/
public function get_converted_settings( $old_settings ) {
$this->old_settings = is_array( $old_settings ) ? $old_settings : array();
$new_settings = array( 'migrated' => 0 );
if ( $this->has_old_keys() ) {
$new_settings = $this->get_converted_global_settings();
$new_settings['menus'] = $this->get_converted_menus_settings();
$new_settings['sidebars'] = $this->get_converted_sidebars_settings();
$new_settings['statics']['footer'] = $this->get_converted_footer_settings();
$new_settings['statics']['post_translations'] = $this->get_converted_post_translations_settings();
$new_settings['statics']['shortcode_actions'] = $this->get_converted_shortcode_actions_settings();
$new_settings['migrated'] = 1;
}
return $new_settings;
}
/**
* @return array
*/
private function get_converted_global_settings() {
$new_settings['additional_css'] = isset( $this->old_settings['icl_additional_css'] )
? $this->old_settings['icl_additional_css'] : '';
$new_settings['copy_parameters'] = isset( $this->old_settings['icl_lang_sel_copy_parameters'] )
? $this->old_settings['icl_lang_sel_copy_parameters'] : '';
return $new_settings;
}
/**
* @return array
*/
private function get_converted_menus_settings() {
$menus_settings = array();
if ( $this->get_old_setting( 'display_ls_in_menu' ) ) {
$menu_id = $this->get_old_setting( 'menu_for_ls' );
$menu_id = $this->sitepress->get_object_id( $menu_id, 'nav_menu', true, $this->sitepress->get_default_language() );
if ( $menu_id ) {
$s = array(
'slot_group' => 'menus',
'slot_slug' => $menu_id,
'show' => 1,
'template' => $this->get_template_for( 'menus' ),
'display_flags' => $this->get_old_setting( 'icl_lso_flags' ),
'display_names_in_native_lang' => $this->get_old_setting( 'icl_lso_native_lang' ),
'display_names_in_current_lang' => $this->get_old_setting( 'icl_lso_display_lang' ),
'display_link_for_current_lang' => 1,
'position_in_menu' => 'after',
'is_hierarchical' => $this->get_old_setting( 'icl_lang_sel_type' ) === 'dropdown' ? 1 : 0,
);
$menus_settings[ $menu_id ] = $this->slot_factory->get_slot( $s );
}
}
return $menus_settings;
}
/**
* @return array
*/
private function get_converted_sidebars_settings() {
$sidebars_settings = array();
$sidebars_widgets = wp_get_sidebars_widgets();
foreach ( $sidebars_widgets as $sidebar_slug => $widgets ) {
$sidebar_has_selector = false;
if ( is_array( $widgets ) ) {
foreach ( $widgets as $widget ) {
if ( strpos( $widget, WPML_LS_Widget::SLUG ) === 0 ) {
$sidebar_has_selector = true;
break;
}
}
}
if ( $sidebar_has_selector ) {
$s = array(
'slot_group' => 'sidebars',
'slot_slug' => $sidebar_slug,
'show' => 1,
'template' => $this->get_template_for( 'sidebars' ),
'display_flags' => $this->get_old_setting( 'icl_lso_flags' ),
'display_names_in_native_lang' => $this->get_old_setting( 'icl_lso_native_lang' ),
'display_names_in_current_lang' => $this->get_old_setting( 'icl_lso_display_lang' ),
'display_link_for_current_lang' => 1,
'widget_title' => $this->get_old_setting( 'icl_widget_title_show' )
? esc_html__( 'Languages', 'sitepress' ) : '',
);
$s = array_merge( $s, $this->get_color_picker_settings_for( 'sidebars' ) );
$sidebars_settings[ $sidebar_slug ] = $this->slot_factory->get_slot( $s );
}
}
return $sidebars_settings;
}
/**
* @return array
*/
private function get_converted_footer_settings() {
$s = array(
'slot_group' => 'statics',
'slot_slug' => 'footer',
'show' => $this->get_old_setting( 'icl_lang_sel_footer' ),
'template' => $this->get_template_for( 'footer' ),
'display_flags' => $this->get_old_setting( 'icl_lso_flags' ),
'display_names_in_native_lang' => $this->get_old_setting( 'icl_lso_native_lang' ),
'display_names_in_current_lang' => $this->get_old_setting( 'icl_lso_display_lang' ),
'display_link_for_current_lang' => 1,
);
$s = array_merge( $s, $this->get_color_picker_settings_for( 'footer' ) );
return $this->slot_factory->get_slot( $s );
}
/**
* @return array
*/
private function get_converted_post_translations_settings() {
$s = array(
'slot_group' => 'statics',
'slot_slug' => 'post_translations',
'show' => $this->get_old_setting( 'icl_post_availability' ),
'template' => $this->get_template_for( 'post_translations' ),
'display_before_content' => $this->get_old_setting( 'icl_post_availability_position' ) === 'above' ? 1 : 0,
'display_after_content' => $this->get_old_setting( 'icl_post_availability_position' ) === 'below' ? 1 : 0,
'availability_text' => $this->get_old_setting( 'icl_post_availability_text' ),
'display_flags' => 0,
'display_names_in_native_lang' => 0,
'display_names_in_current_lang' => 1,
'display_link_for_current_lang' => 0,
);
return $this->slot_factory->get_slot( $s );
}
/**
* @return array
*/
private function get_converted_shortcode_actions_settings() {
$s = array(
'slot_group' => 'statics',
'slot_slug' => 'shortcode_actions',
'show' => 1,
'template' => $this->get_template_for( 'shortcode_actions' ),
'display_flags' => $this->get_old_setting( 'icl_lso_flags' ),
'display_names_in_native_lang' => $this->get_old_setting( 'icl_lso_native_lang' ),
'display_names_in_current_lang' => $this->get_old_setting( 'icl_lso_display_lang' ),
'display_link_for_current_lang' => 1,
);
$s = array_merge( $s, $this->get_color_picker_settings_for( 'shortcode_actions' ) );
return $this->slot_factory->get_slot( $s );
}
/**
* @param string $context
*
* @return array
*/
private function get_color_picker_settings_for( $context ) {
$ret = array();
$map = array(
'font-current-normal' => 'font_current_normal',
'font-current-hover' => 'font_current_hover',
'background-current-normal' => 'background_current_normal',
'background-current-hover' => 'background_current_hover',
'font-other-normal' => 'font_other_normal',
'font-other-hover' => 'font_other_hover',
'background-other-normal' => 'background_other_normal',
'background-other-hover' => 'background_other_hover',
'border' => 'border_normal',
'background' => 'background_normal',
);
$key = $context !== 'footer' ? 'icl_lang_sel_config' : 'icl_lang_sel_footer_config';
$settings = isset( $this->old_settings[ $key ] ) ? $this->old_settings[ $key ] : array();
foreach ( $settings as $k => $v ) {
$ret[ $map[ $k ] ] = $v;
}
return array_filter( $ret );
}
/**
* @param string $key
*
* @return mixed|string|int|null
*/
private function get_old_setting( $key ) {
return isset( $this->old_settings[ $key ] ) ? $this->old_settings[ $key ] : null;
}
/**
* @param string $slot_type
*
* @return mixed
*/
private function get_template_for( $slot_type ) {
$templates = $this->settings->get_core_templates();
$type = 'dropdown';
$old_type = $this->get_old_setting( 'icl_lang_sel_type' ); // dropdown | list
$old_stype = $this->get_old_setting( 'icl_lang_sel_stype' ); // classic | mobile-auto | mobile
$old_orientation = $this->get_old_setting( 'icl_lang_sel_orientation' ); // vertical | horizontal
if ( $slot_type === 'menus' ) {
$type = 'menu-item';
} elseif ( $slot_type === 'sidebars' ) {
$type = $old_type === 'dropdown' ? 'dropdown' : ( $old_orientation === 'vertical' ? 'list-vertical' : 'list-horizontal' );
} elseif ( $slot_type === 'shortcode_actions' ) {
$type = $old_type === 'dropdown' ? 'dropdown' : ( $old_orientation === 'vertical' ? 'list-vertical' : 'list-horizontal' );
} elseif ( $slot_type === 'footer' ) {
$type = 'list-horizontal';
} elseif ( $slot_type === 'post_translations' ) {
$type = 'post-translations';
}
if ( $type === 'dropdown' ) {
$type = $old_stype === 'mobile' ? 'dropdown-click' : 'dropdown';
}
return $templates[ $type ];
}
/**
* @return bool
*/
private function has_old_keys() {
$result = false;
$old_keys = array(
'icl_lang_sel_config',
'icl_lang_sel_footer_config',
'icl_language_switcher_sidebar',
'icl_widget_title_show',
'icl_lang_sel_type',
'icl_lso_flags',
'icl_lso_native_lang',
'icl_lso_display_lang',
'icl_lang_sel_footer',
'icl_post_availability',
'icl_post_availability_position',
'icl_post_availability_text',
);
foreach ( $old_keys as $old_key ) {
if ( array_key_exists( $old_key, $this->old_settings ) ) {
$result = true;
break;
}
}
return $result;
}
/**
* @since 3.7.0 Convert menu LS handled now by ID instead of slugs previously
*
* @param array $settings
*
* @return array
*/
public function convert_menu_ids( $settings ) {
if ( $settings['menus'] ) {
foreach ( $settings['menus'] as $slug => $menu_slot ) {
/** @var WPML_LS_Menu_Slot $menu_slot */
if ( is_string( $slug ) ) {
$current_lang = $this->sitepress->get_current_language();
$this->sitepress->switch_lang( $this->sitepress->get_default_language() );
$menu = wp_get_nav_menu_object( $slug );
$new_id = $menu->term_id;
$slot_args = $menu_slot->get_model();
$slot_args['slot_slug'] = $new_id;
$new_slot = $this->slot_factory->get_slot( $slot_args );
unset( $settings['menus'][ $slug ] );
$settings['menus'][ $new_id ] = $new_slot;
$this->sitepress->switch_lang( $current_lang );
}
}
}
$settings['converted_menu_ids'] = 1;
return $settings;
}
}