woocommerce_wpml = $woocommerce_wpml; add_action( 'wp_ajax_wcml_currencies_order', [ $this, 'wcml_currencies_order' ] ); add_action( 'wp_ajax_wcml_currencies_switcher_preview', [ $this, 'wcml_currencies_switcher_preview' ] ); add_action( 'wp_ajax_wcml_currencies_switcher_save_settings', [ $this, 'wcml_currencies_switcher_save_settings' ] ); add_action( 'wp_ajax_wcml_delete_currency_switcher', [ $this, 'wcml_delete_currency_switcher' ] ); } public function wcml_currencies_order() { $nonce = array_key_exists( 'wcml_nonce', $_POST ) ? sanitize_text_field( $_POST['wcml_nonce'] ) : false; if ( ! $nonce || ! wp_verify_nonce( $nonce, 'set_currencies_order_nonce' ) ) { wp_send_json_error( 'Invalid nonce' ); } $this->woocommerce_wpml->settings['currencies_order'] = explode( ';', $_POST['order'] ); $this->woocommerce_wpml->update_settings( $this->woocommerce_wpml->settings ); wp_send_json_success( [ 'message' => esc_html__( 'Currencies order updated', 'woocommerce-multilingual' ) ] ); } public function wcml_currencies_switcher_save_settings() { $nonce = array_key_exists( 'wcml_nonce', $_POST ) ? sanitize_text_field( $_POST['wcml_nonce'] ) : false; if ( ! $nonce || ! wp_verify_nonce( $nonce, 'wcml_currencies_switcher_save_settings' ) ) { wp_send_json_error( 'Invalid nonce' ); } $wcml_settings = $this->woocommerce_wpml->settings; $switcher_settings = []; // Allow some HTML in the currency switcher $currency_switcher_format = strip_tags( stripslashes_deep( $_POST['template'] ), '' ); $currency_switcher_format = htmlentities( $currency_switcher_format ); $currency_switcher_format = sanitize_text_field( $currency_switcher_format ); $currency_switcher_format = html_entity_decode( $currency_switcher_format ); $switcher_id = sanitize_text_field( $_POST['switcher_id'] ); if ( $switcher_id == 'new_widget' ) { $switcher_id = sanitize_text_field( $_POST['widget_id'] ); } $switcher_settings['widget_title'] = isset( $_POST['widget_title'] ) ? sanitize_text_field( $_POST['widget_title'] ) : ''; $switcher_settings['switcher_style'] = sanitize_text_field( $_POST['switcher_style'] ); $switcher_settings['template'] = $currency_switcher_format; do_action( 'wpml_register_single_string', 'woocommerce-multilingual', $switcher_id . '_switcher_format', $currency_switcher_format ); foreach ( $_POST['color_scheme'] as $color_id => $color ) { $switcher_settings['color_scheme'][ sanitize_text_field( $color_id ) ] = sanitize_hex_color( $color ); } $wcml_settings['currency_switchers'][ $switcher_id ] = $switcher_settings; // update widget settings if ( $switcher_id !== 'product' ) { $widget_settings = get_option( 'widget_currency_sel_widget' ); $setting_match = false; foreach ( $widget_settings as $key => $widget_setting ) { if ( isset( $widget_setting['id'] ) && $switcher_id == $widget_setting['id'] ) { $setting_match = true; $widget_settings[ $key ]['settings'] = $switcher_settings; } } if ( ! $setting_match ) { $widget_settings[] = [ 'id' => $switcher_id, 'settings' => $switcher_settings, ]; } update_option( 'widget_currency_sel_widget', $widget_settings ); $this->synchronize_widget_instances( $widget_settings ); } $this->woocommerce_wpml->update_settings( $wcml_settings ); wp_send_json_success(); } private function synchronize_widget_instances( $widget_settings ) { $sidebars_widgets = $this->get_sidebars_widgets(); foreach ( $sidebars_widgets as $sidebar => $widgets ) { if ( 'wp_inactive_widgets' === $sidebar ) { continue; } $found = false; if ( is_array( $widgets ) ) { foreach ( $widgets as $key => $widget_id ) { if ( strpos( $widget_id, WCML_Currency_Switcher_Widget::SLUG ) === 0 ) { if ( $found ) { // Only synchronize the first CS widget instance per sidebar unset( $sidebars_widgets[ $sidebar ][ $key ] ); continue; } $found = true; } } } if ( ! $found ) { foreach ( $widget_settings as $key => $widget_setting ) { if ( is_array( $widget_setting ) && Obj::prop( 'id', $widget_setting ) == $sidebar ) { array_unshift( $sidebars_widgets[ $sidebar ], WCML_Currency_Switcher_Widget::SLUG . '-' . $key ); } } } } $this->update_sidebars_widgets( $sidebars_widgets ); } public function wcml_delete_currency_switcher() { $nonce = array_key_exists( 'wcml_nonce', $_POST ) ? sanitize_text_field( $_POST['wcml_nonce'] ) : false; if ( ! $nonce || ! wp_verify_nonce( $nonce, 'delete_currency_switcher' ) ) { wp_send_json_error(); } $switcher_id = sanitize_text_field( $_POST['switcher_id'] ); $wcml_settings = $this->woocommerce_wpml->get_settings(); unset( $wcml_settings['currency_switchers'][ $switcher_id ] ); $this->woocommerce_wpml->update_settings( $wcml_settings ); $sidebars_widgets = $this->get_sidebars_widgets(); foreach ( $sidebars_widgets as $sidebar => $widgets ) { if ( $sidebar != $switcher_id ) { continue; } if ( is_array( $widgets ) ) { foreach ( $widgets as $key => $widget_id ) { if ( strpos( $widget_id, WCML_Currency_Switcher_Widget::SLUG ) === 0 ) { unset( $sidebars_widgets[ $sidebar ][ $key ] ); } } } } $this->update_sidebars_widgets( $sidebars_widgets ); wp_send_json_success(); } public function wcml_currencies_switcher_preview() { $nonce = array_key_exists( 'wcml_nonce', $_POST ) ? sanitize_text_field( $_POST['wcml_nonce'] ) : false; if ( ! $nonce || ! wp_verify_nonce( $nonce, 'wcml_currencies_switcher_preview' ) ) { wp_send_json_error( 'Invalid nonce' ); } $return = []; $inline_css = $this->woocommerce_wpml->cs_templates->get_color_picket_css( $_POST['switcher_id'], [ 'switcher_style' => $_POST['switcher_style'], 'color_scheme' => $_POST['color_scheme'], ] ); $template = $this->woocommerce_wpml->cs_templates->get_template( $_POST['switcher_style'] ); if ( $template->has_styles() ) { $return['inline_styles_id'] = $template->get_inline_style_handler() . '-inline-css'; } else { $return['inline_styles_id'] = 'wcml-cs-inline-styles-' . $_POST['switcher_id'] . '-' . $_POST['switcher_style']; } $return['inline_css'] = $inline_css; ob_start(); $this->woocommerce_wpml->multi_currency->currency_switcher->wcml_currency_switcher( [ 'switcher_id' => $_POST['switcher_id'], 'format' => isset( $_POST['template'] ) ? stripslashes_deep( $_POST['template'] ) : '%name% (%symbol%) - %code%', 'switcher_style' => $_POST['switcher_style'], 'color_scheme' => $_POST['color_scheme'], 'preview' => true, ] ); $switcher_preview = ob_get_contents(); ob_end_clean(); $return['preview'] = $switcher_preview; wp_send_json_success( $return ); } public function get_sidebars_widgets() { if ( ! function_exists( 'wp_get_sidebars_widgets' ) ) { require_once ABSPATH . '/wp-admin/includes/widgets.php'; } $sidebars_widgets = wp_get_sidebars_widgets(); return is_array( $sidebars_widgets ) ? $sidebars_widgets : []; } public function update_sidebars_widgets( $sidebars_widgets ) { remove_action( 'pre_update_option_sidebars_widgets', [ $this->woocommerce_wpml->multi_currency->currency_switcher, 'update_option_sidebars_widgets' ], 10 ); wp_set_sidebars_widgets( $sidebars_widgets ); add_action( 'pre_update_option_sidebars_widgets', [ $this->woocommerce_wpml->multi_currency->currency_switcher, 'update_option_sidebars_widgets' ], 10, 2 ); } }