• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Автоматический пересчет цен по курсу

Image CMS

Stork.71

Гуру
Местный
#61
Всем доброго дня!

Взял решение в самом начале топика и немного переделал, в этом случае практически все тоже самое, что предлагали ранее: в админке есть поле для ввода курса в ручном режиме и корректный вывод цены в различных типах товара (простой, вариативный), включая товары со скидкой. Если цена у товара не стоит, вместо полученного 0 выводим пустоту:

PHP:
//Получаем значения, которые вводит пользователь в отдельной функции
function prime_value_kurs() {
    $kurs = get_option( 'woocommerce_set_kurs', 1 );
    return $kurs;
}

// Типы товара simple, grouped and external
add_filter('woocommerce_product_get_price', 'prime_change_rprice', 99, 2 );
add_filter('woocommerce_product_get_regular_price', 'prime_change_rprice', 99, 2 );

// Тип товара Variations
add_filter('woocommerce_product_variation_get_regular_price', 'prime_change_rprice', 99, 2 );
add_filter('woocommerce_product_variation_get_price', 'prime_change_rprice', 99, 2 );

//Производим пересчет значения
function prime_change_rprice($price,$product) {
    $price = (int)$price * prime_value_kurs();
    if ($price == 0) {
        echo $price='';
        return $price;
    }
    else {
        return $price;
    }
}

/** Добавляем в админку поле для настройки курса **/
add_filter( 'woocommerce_general_settings', 'add_a_setting_kurs' );

function add_a_setting_kurs( $settings ) {

$updated_settings = array();

  foreach ( $settings as $section ) {

    if ( isset( $section['id'] ) && 'pricing_options' == $section['id'] &&
       isset( $section['type'] ) && 'sectionend' == $section['type'] ) {

      $updated_settings[] = array(

        'title'        => 'Курс валюты',
        'desc'         => 'Курс валюты учета по отношению к валюте, которая отображается посетителю',
        'id'           => 'woocommerce_set_kurs',
        'type'         => 'text',
        'css'          => 'width:70px;',
        'default'      => '1',
        'desc_tip'     => false,
      );
    }
    $updated_settings[] = $section;
  }

  return $updated_settings;
}
Пример работы (админка):

http://joxi.ru/vAWOLYEt141nDA

На фронте:

http://joxi.ru/ZrJkdqxT979Opm

@panteradiab,
Если все работает правильно - то ура, наконец-то нашелся человек, который довел все до ума!
 

Stan1991

Новичок
#63
В комментариях есть жалобы на некорректную работу со скидками, а также с неокругленными ценами. Сам не ставил, не пробовал.
Есть ряд сложностей, чтоб округлял нужно поставить запятую (по умолчанию стоит точка в настройках WooCommerce), также он тупит с ценами в вариативных товарах (не умножает на курс). Но для простых задач - самое то.
 

Stork.71

Гуру
Местный
#64
Есть ряд сложностей, чтоб округлял нужно поставить запятую (по умолчанию стоит точка в настройках WooCommerce), также он тупит с ценами в вариативных товарах (не умножает на курс). Но для простых задач - самое то.
для простых задач еще на первой страницы этого топика есть код. С ним как раз и была проблема в работе с вариативными, распродажами и т.д.
 
#65
Всем доброго дня!

Взял решение в самом начале топика и немного переделал, в этом случае практически все тоже самое, что предлагали ранее: в админке есть поле для ввода курса в ручном режиме и корректный вывод цены в различных типах товара (простой, вариативный), включая товары со скидкой. Если цена у товара не стоит, вместо полученного 0 выводим пустоту:

PHP:
//Получаем значения, которые вводит пользователь в отдельной функции
function prime_value_kurs() {
    $kurs = get_option( 'woocommerce_set_kurs', 1 );
    return $kurs;
}

// Типы товара simple, grouped and external
add_filter('woocommerce_product_get_price', 'prime_change_rprice', 99, 2 );
add_filter('woocommerce_product_get_regular_price', 'prime_change_rprice', 99, 2 );

// Тип товара Variations
add_filter('woocommerce_product_variation_get_regular_price', 'prime_change_rprice', 99, 2 );
add_filter('woocommerce_product_variation_get_price', 'prime_change_rprice', 99, 2 );

//Производим пересчет значения
function prime_change_rprice($price,$product) {
    $price = (int)$price * prime_value_kurs();
    if ($price == 0) {
        echo $price='';
        return $price;
    }
    else {
        return $price;
    }
}

/** Добавляем в админку поле для настройки курса **/
add_filter( 'woocommerce_general_settings', 'add_a_setting_kurs' );

function add_a_setting_kurs( $settings ) {

$updated_settings = array();

  foreach ( $settings as $section ) {

    if ( isset( $section['id'] ) && 'pricing_options' == $section['id'] &&
       isset( $section['type'] ) && 'sectionend' == $section['type'] ) {

      $updated_settings[] = array(

        'title'        => 'Курс валюты',
        'desc'         => 'Курс валюты учета по отношению к валюте, которая отображается посетителю',
        'id'           => 'woocommerce_set_kurs',
        'type'         => 'text',
        'css'          => 'width:70px;',
        'default'      => '1',
        'desc_tip'     => false,
      );
    }
    $updated_settings[] = $section;
  }

  return $updated_settings;
}
Пример работы (админка):

http://joxi.ru/vAWOLYEt141nDA

На фронте:

http://joxi.ru/ZrJkdqxT979Opm

@panteradiab,
Привет!
У меня почему-то на вариативных товарах пересчет не происходит. Работает только с простым товаром.
 
Сверху Снизу