Можно ли добавить настройку языка в профиль WooCommerce?

Ссылка скопирована
1 ответ

Нужно добавить выбор языка (только из установленных в ВП) в профиль WooCommerce.
Вот сюда

Можно ли добавить настройку языка в профиль WooCommerce?

Буду благодарен за направление куда смотреть, какие хуки нужны и тд.
(но и от готового кода не откажусь, если у кого таковой окажется ;) )

Гуглёж не помог.

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Мария Код Ответ

Да, выбор языка можно добавить в профиль WooCommerce в разделе Мой аккаунт → Детали аккаунта. Технически это обычное поле пользователя, которое сохраняется в user meta. Список языков зависит от мультиязычного плагина: WPML, Polylang, TranslatePress и т.д.

Для WooCommerce нужны два хука: один выводит поле, второй сохраняет его:

add_action( 'woocommerce_edit_account_form', 'site_account_language_field' );
add_action( 'woocommerce_save_account_details', 'site_save_account_language_field' );
 
function site_account_language_field() {
    $user_id = get_current_user_id();
    $value   = get_user_meta( $user_id, 'preferred_language', true );
 
    $languages = [
        'ru' => 'Русский',
        'en' => 'English',
    ];
    ?>
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <label for="preferred_language">Язык</label>
        <select name="preferred_language" id="preferred_language">
            <?php foreach ( $languages as $code => $label ) : ?>
                <option value="<?php echo esc_attr( $code ); ?>" <?php selected( $value, $code ); ?>>
                    <?php echo esc_html( $label ); ?>
                </option>
            <?php endforeach; ?>
        </select>
    </p>
    <?php
}
 
function site_save_account_language_field( $user_id ) {
    if ( isset( $_POST['preferred_language'] ) ) {
        update_user_meta(
            $user_id,
            'preferred_language',
            sanitize_key( wp_unslash( $_POST['preferred_language'] ) )
        );
    }
}

add_action( 'woocommerce_edit_account_form', 'site_account_language_field' ); add_action( 'woocommerce_save_account_details', 'site_save_account_language_field' ); function site_account_language_field() { $user_id = get_current_user_id(); $value = get_user_meta( $user_id, 'preferred_language', true ); $languages = [ 'ru' => 'Русский', 'en' => 'English', ]; ?> <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide"> <label for="preferred_language">Язык</label> <select name="preferred_language" id="preferred_language"> <?php foreach ( $languages as $code => $label ) : ?> <option value="<?php echo esc_attr( $code ); ?>" <?php selected( $value, $code ); ?>> <?php echo esc_html( $label ); ?> </option> <?php endforeach; ?> </select> </p> <?php } function site_save_account_language_field( $user_id ) { if ( isset( $_POST['preferred_language'] ) ) { update_user_meta( $user_id, 'preferred_language', sanitize_key( wp_unslash( $_POST['preferred_language'] ) ) ); } }

Если стоит Polylang, список языков можно получить динамически:

$languages = function_exists( 'pll_languages_list' )
    ? pll_languages_list( [ 'fields' => [] ] )
    : [];

$languages = function_exists( 'pll_languages_list' ) ? pll_languages_list( [ 'fields' => [] ] ) : [];

Если стоит WPML, чаще используют фильтр wpml_active_languages. Главное — не сохранять произвольную строку без проверки. Перед сохранением проверьте, что выбранный код действительно есть среди установленных языков.

Важно: это поле само по себе не переключит язык интерфейса WooCommerce. Оно только сохраняет предпочтение пользователя. Чтобы реально использовать его, нужно при входе/переходе в аккаунт перенаправлять пользователя на нужную языковую версию или подставлять язык через API вашего мультиязычного плагина.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно