Преобразование единиц измерения в зависимости от страны на странице продукта Woocommerce

У меня есть сайт woocommerce, который использует кг и см в качестве единиц измерения в настройках бэкэнда. Сайт в основном продает в Европу, так что не беспокойтесь. Теперь мне нужно продавать на рынок США, и меня просят настроить сайт таким образом, чтобы при входе в систему пользователей из группы клиентов США они видели имперские измерения, а также или вместо метрических единиц.

Есть ли способ, по крайней мере, отображать вес и размеры в британских единицах с использованием некоторого преобразования и т. Д. И сохранять в базе данных основные единицы, такие как кг и см?

Я везде искал плагин, но не могу найти тот, который мне поможет.


person James Donald    schedule 10.03.2018    source источник


Ответы (1)


Для страниц с одним продуктом, Вот конкретный пример, который преобразует значения единиц измерения и устанавливает правильную метку единицы измерения для стран, которые используют британские единицы.

// For Weight
add_filter( 'woocommerce_format_weight', 'imperial_format_weight', 20, 2 );
function imperial_format_weight( $weight_string, $weight ) {
    $country = WC()->customer->get_shipping_country(); // Customer country
    $countries = array( 'US', 'LR', 'MM' ); // Imperial measurement countries

    if ( ! in_array( $country, $countries ) ) return $weight_string; // Exit

    $weight_unit = get_option( 'woocommerce_weight_unit' );

    $weight_string = wc_format_localized_decimal( $weight );
    if ( empty( $weight_string ) )
        return __( 'N/A', 'woocommerce' ); // No values

    if ( $weight_unit == 'kg' ) {
        // conversion rate for 'kg' to 'lbs'
        $rate = 2.20462;
        $label = ' lbs';
    } elseif ( $weight_unit == 'g' ) {
        // conversion rate for 'g' to 'oz'
        $rate = 0.035274;
        $label = ' oz';
    }

    return round( $weight * $rate, 2 ) . $label;
}

// For Dimensions
add_filter( 'woocommerce_format_dimensions', 'imperial_format_dimensions', 20, 2 );
function imperial_format_dimensions( $dimension_string, $dimensions ) {
    $country = WC()->customer->get_shipping_country(); // Customer country
    $countries = array( 'US', 'LR', 'MM' ); // Imperial measurement countries

    if ( ! in_array( $country, $countries ) ) return $dimension_string; // Exit

    $dimension_unit = get_option( 'woocommerce_dimension_unit' );

    $dimension_string = implode( ' x ', array_filter( array_map( 'wc_format_localized_decimal', $dimensions ) ) );
    if( empty( $dimension_string ) )
        return __( 'N/A', 'woocommerce' ); // No values

    if ( $dimension_unit == 'mm' ) {
        // conversion rate for 'mm' to 'inch'
        $rate = 0.0393701;
        $label = ' in';
    } elseif ( $dimension_unit == 'cm' ) {
        // conversion rate for 'cm' to 'inch'
        $rate = 0.393701;
        $label = ' in';
    } elseif ( $dimension_unit == 'm' ) {
        // conversion rate for 'm' to 'yard'
        $rate = 1.09361;
        $label = ' yd';
    }

    $new_dimentions = array();

    foreach( $dimensions as $key => $value ){
        $new_dimentions[$key] = round( $value * $rate, 2 );
    }

    return implode( ' x ', array_filter( array_map( 'wc_format_localized_decimal', $new_dimentions ) ) ) . $label;
}

Этот код находится в файле function.php вашей активной дочерней темы (или темы). Протестировано и работает.

введите здесь описание изображения

person LoicTheAztec    schedule 10.03.2018
comment
Привет! Окей, я проверил код и отлично работает, когда клиентский адрес доставки установлен в США. Моя проблема сейчас в том, что когда Великобритания или какие-либо клиенты, использующие метрику, посещают сайт, измерения вообще не отображаются. Есть ли способ отображать британские или метрические единицы в зависимости от географического местоположения клиента? - person James Donald; 15.03.2018
comment
@JamesDonald Да, это возможно ... Если вы не знаете, как это сделать, вам следует задать новый вопрос с тегом woocommerce и сообщить мне здесь, когда это будет сделано. Также была небольшая ошибка в моем актуальном коде, который я обновил. - person LoicTheAztec; 15.03.2018
comment
понял о том, что задают вопрос - извинения - спасибо за исправление кода - теперь все работает отлично. - person James Donald; 16.03.2018