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

Woocommerce, каждому товару своя валюта

pagemaster

Форумчанин
#1
Здравствуйте, столкнулся с проблемой поиска плагина или функционала, который бы позволил указывать каждому товару свою валюту и стоимость в этой же валюте. Кроме этого все цены на сайте должны быть только в 1 валюте, а все остальные валюты вбитые вручную должны конвертироваться в основную валюту сайта, к примеру, по курсу ЦБ России.

То есть будут товары с ценами в долларах, евро и рублях, но нужно чтобы на самом сайте выводилось все в рублях по курсу текущему курсу ЦБ.

Или напишите встречали ли вы что то хотя бы частично похожее по функционалу.
 

pagemaster

Форумчанин
#3
Есть вот такой плагин от saphali. Описание на русском, изучайте.
видел его, платные решения не подходят, разве что платные версии от Woo, они встречаются нуленные. В общем ищу или бесплатные\нуленные плагины или примеры php кода.
 

pagemaster

Форумчанин
#5
спасибо, нуленные конвертеры я уже находил, они вполне нормально работают, вот только они конвертируют основную валюту в другие, а как сделать через настройки woocommerce, чтобы основная валюта была везде разной, не понятно... Может как то через доп.поля можно указывать другие валюты?
 

pagemaster

Форумчанин
#6
вот интересная статья как добавить произвольное поле в Woocommerce, что если создать 3 таких поля (руб., доллары, евро) и вписывать туда цену с админки и если поле не пустое - выводить на сайте. Дальше берем значение с поля (если оно евро или доллар) и умножаем на переменную с курсом этой валюты ЦБ России (я встречал мини-скрипты подгружающие данные о курсе валют с ЦБ). Полученное значение и будет наша цена в рублях (наша основная цена), вот только как её присвоить глобальной цене woocommerce? Какая переменная за это отвечает?
 

ADv

Гуру
Местный
#7
вот интересная статья как добавить произвольное поле в Woocommerce, что если создать 3 таких поля (руб., доллары, евро) и вписывать туда цену с админки и если поле не пустое - выводить на сайте. Дальше берем значение с поля (если оно евро или доллар) и умножаем на переменную с курсом этой валюты ЦБ России (я встречал мини-скрипты подгружающие данные о курсе валют с ЦБ). Полученное значение и будет наша цена в рублях (наша основная цена), вот только как её присвоить глобальной цене woocommerce? Какая переменная за это отвечает?
Посмотрите это Калькулятор товара в интерфейсе интернет магазина
 

pagemaster

Форумчанин
#9
оказалось что не совсем то что нужно))
в общем подскажите пожалуйста как на странице товара изменить основную цену (regular_price), то есть подставить в нее значение со своей переменной? Ну и чтобы дальше без каких либо изменений перезаписанная цена шла дальше в корзину и на оформление заказа.
Можно даже чтобы перезаписывалась цена на уровне БД.
 

pagemaster

Форумчанин
#10
В общем вот мой говно-код, который добавляет на страницу изменения товара woocommerce еще 3 поля для валюты и потом конвертирует значение заполненного поля (то есть заполняем только 1 поле) по курсу ЦБ России в рубли.

PHP:
function wc_rubprice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_rub_price', 'class' => 'wc_input_price short', 'label' => __( 'RUB', 'woocommerce' ) ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_rubprice_product_field' );


function wc_usdprice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_usd_price', 'class' => 'wc_input_price short', 'label' => __( 'USD', 'woocommerce' ) ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_usdprice_product_field' );


function wc_europrice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_euro_price', 'class' => 'wc_input_price short', 'label' => __( 'EUR', 'woocommerce' ) ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_europrice_product_field' );


function wc_myprice_save_product( $product_id ) {

if ( ( $_POST['_rub_price'] ) ) {
if ( is_numeric( $_POST['_rub_price'] ) )
update_post_meta( $product_id, '_rub_price', $_POST['_rub_price'] );
} else delete_post_meta( $product_id, '_rub_price' );



if ( ( $_POST['_usd_price'] ) ) {
if ( is_numeric( $_POST['_usd_price'] ) )
update_post_meta( $product_id, '_usd_price', $_POST['_usd_price'] );
} else delete_post_meta( $product_id, '_usd_price' );


if ( ( $_POST['_euro_price'] ) ) {
if ( is_numeric( $_POST['_euro_price'] ) )
update_post_meta( $product_id, '_euro_price', $_POST['_euro_price'] );
} else delete_post_meta( $product_id, '_euro_price' );
}
add_action( 'save_post', 'wc_myprice_save_product' );


function wc_myprice_show() {
global $product, $post;
// Ничего не предпринимаем для вариативных товаров
//if ( $product->product_type <> 'variable' ) {
$RUB = get_post_meta( $product->id, '_rub_price', true );
$USD = get_post_meta( $product->id, '_usd_price', true );
$EUR = get_post_meta( $product->id, '_euro_price', true );
// woocommerce_price( $RUB )

// Формируем сегодняшнюю дату 
    $date = date("d/m/Y"); 
    // Формируем ссылку 
    $link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"; 
    // Загружаем HTML-страницу 
    $fd = fopen($link, "r"); 
    $text=""; 
    if (!$fd) echo "Запрашиваемая страница не найдена"; 
    else 
    { 
      // Чтение содержимого файла в переменную $text 
      while (!feof ($fd)) $text .= fgets($fd, 4096); 
    } 
    // Закрыть открытый файловый дескриптор 
    fclose ($fd); 
   
  // Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru 
  $content = $text; 
  // Разбираем содержимое, при помощи регулярных выражений 
  $pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"; 
  preg_match_all($pattern, $content, $out, PREG_SET_ORDER); 
  $dollar = ""; 
  $euro = ""; 
  foreach($out as $cur) 
  { 
    if($cur[2] == 840) $dollar = str_replace(",",".",$cur[4]); 
    if($cur[2] == 978) $euro   = str_replace(",",".",$cur[4]); 
  }

  // проверяем заполнено ли поле, если да, то умножаем на курс и записываем в $custom_price
if (($RUB != "") && ($RUB != 0)) {
    $custom_price = $RUB;
}
if (($USD != "") && ($USD != 0)) {
    $custom_price = $USD * $dollar;
}
if (($EUR != "") && ($EUR != 0)) {
    $custom_price = $EUR * $euro;
}
round($custom_price, 2); // округляем до сотых, чтобы в regular_price не записывались огромные дроби

$regular_price = get_post_meta($post->ID, '_price', true); //получаем текущую цену товара

//if ($regular_price != $ $custom_price) { // проверяем совпадает ли текущая цена с нашей новой, если нет, то перезаписываем её
update_post_meta( $post->ID, '_regular_price', $custom_price );
update_post_meta( $post->ID, '_price', $custom_price );   

//можно вывести нашу custom_price для проверки
 // echo '<div class="woocommerce_msrp">';
 // _e( 'RUB : ', 'woocommerce' );
 // echo '<span class="woocommerce-rrp-price RUB">' . $RUB . '</span>';
 // echo '</div>';

 // echo '<div class="woocommerce_msrp">';
 // _e( 'USD : ', 'woocommerce' );
 // echo '<span class="woocommerce-rrp-price USD">' . $USD . '</span>';
 // echo '</div>';

 // echo '<div class="woocommerce_msrp">';
 // _e( 'EUR : ', 'woocommerce' );
 // echo '<span class="woocommerce-rrp-price EUR">' . $EUR . '</span>';
 // echo '</div>';
}

//}
//}
add_action( 'woocommerce_single_product_summary', 'wc_myprice_show', 5 ); 
// Дополнительно: Для вывода на страницах архивов (в товарных категориях, например)
add_action( 'woocommerce_after_shop_loop_item_title', 'wc_myprice_show' );
я больше чем уверен что его можно и нужно оптимизировать, так что если кто то поможет его оптимизировать, буду очень благодарен =)
 
Последнее редактирование:

maxfire

Новичок
#11
В общем вот мой говно-код, который добавляет на страницу изменения товара woocommerce еще 3 поля для валюты и потом конвертирует значение заполненного поля (то есть заполняем только 1 поле) по курсу ЦБ России в рубли.

PHP:
function wc_rubprice_product_field() {
woocommerce_wp_text_input( array( 'id' => 'rub_price', 'class' => 'wc_input_price short', 'label' => __( 'RUB', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')' ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_rubprice_product_field' );


function wc_usdprice_product_field() {
woocommerce_wp_text_input( array( 'id' => 'usd_price', 'class' => 'wc_input_price short', 'label' => __( 'USD', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')' ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_usdprice_product_field' );


function wc_europrice_product_field() {
woocommerce_wp_text_input( array( 'id' => 'euro_price', 'class' => 'wc_input_price short', 'label' => __( 'EUR', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')' ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_europrice_product_field' );


function wc_rubprice_save_product( $product_id ) {
// Если это автосохранение, то ничего не делаем, сохраняем данные только при нажатии на кнопку Обновить
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( isset( $_POST['rub_price'] ) ) {
if ( is_numeric( $_POST['rub_price'] ) )
update_post_meta( $product_id, 'rub_price', $_POST['rub_price'] );
} else delete_post_meta( $product_id, 'rub_price' );
}
add_action( 'save_post', 'wc_rubprice_save_product' );


function wc_usdprice_save_product( $product_id ) {
// Если это автосохранение, то ничего не делаем, сохраняем данные только при нажатии на кнопку Обновить
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( isset( $_POST['usd_price'] ) ) {
if ( is_numeric( $_POST['usd_price'] ) )
update_post_meta( $product_id, 'usd_price', $_POST['usd_price'] );
} else delete_post_meta( $product_id, 'usd_price' );
}
add_action( 'save_post', 'wc_usdprice_save_product' );


function wc_europrice_save_product( $product_id ) {
// Если это автосохранение, то ничего не делаем, сохраняем данные только при нажатии на кнопку Обновить
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( isset( $_POST['euro_price'] ) ) {
if ( is_numeric( $_POST['euro_price'] ) )
update_post_meta( $product_id, 'euro_price', $_POST['euro_price'] );
} else delete_post_meta( $product_id, 'euro_price' );
}
add_action( 'save_post', 'wc_europrice_save_product' );


function wc_myprice_show() {
global $product, $post;
// Ничего не предпринимаем для вариативных товаров
if ( $product->product_type <> 'variable' ) {
$RUB = get_post_meta( $product->id, 'rub_price', true );
$USD = get_post_meta( $product->id, 'usd_price', true );
$EUR = get_post_meta( $product->id, 'euro_price', true );
// woocommerce_price( $RUB )

// Формируем сегодняшнюю дату
    $date = date("d/m/Y");
    // Формируем ссылку
    $link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
    // Загружаем HTML-страницу
    $fd = fopen($link, "r");
    $text="";
    if (!$fd) echo "Запрашиваемая страница не найдена";
    else
    {
      // Чтение содержимого файла в переменную $text
      while (!feof ($fd)) $text .= fgets($fd, 4096);
    }
    // Закрыть открытый файловый дескриптор
    fclose ($fd);

  // Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru
  $content = $text;
  // Разбираем содержимое, при помощи регулярных выражений
  $pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
  preg_match_all($pattern, $content, $out, PREG_SET_ORDER);
  $dollar = "";
  $euro = "";
  foreach($out as $cur)
  {
    if($cur[2] == 840) $dollar = str_replace(",",".",$cur[4]);
    if($cur[2] == 978) $euro   = str_replace(",",".",$cur[4]);
  }

if ($RUB != "") {
    $custom_price = $RUB;
}
if ($USD != "") {
    $custom_price = $USD * $dollar;
}
if ($EUR != "") {
    $custom_price = $EUR * $euro;
}

update_post_meta( $post->ID, '_regular_price', $custom_price );
update_post_meta( $post->ID, '_price', $custom_price );
}
}
add_action( 'woocommerce_single_product_summary', 'wc_myprice_show', 5 );
// Дополнительно: Для вывода на страницах архивов (в товарных категориях, например)
add_action( 'woocommerce_after_shop_loop_item_title', 'wc_myprice_show' );
я больше чем уверен что его можно и нужно оптимизировать, так что если кто то поможет его оптимизировать, буду очень благодарен =)
Получилось что нибудь сделать? Тоже нужно такое решение!
 

pagemaster

Форумчанин
#12
Получилось что нибудь сделать? Тоже нужно такое решение!
Да, код работает:
добавилось 3 поля для валют: рубль, евро, доллар
нужно указывать только 1 валюту и она будет автоматически конвертироваться по курсу ЦБ России и записываться в _regular_price - основную цену, которая и выводится на странице товара.
Минус моего кода в том, что при каждом открытии категории\страницы с товаром срабатывает функция конвертации, то есть может быть нагрузка на сервер... в идеале проверку курса нужно сделать через крон, чтобы курс обновлялся несколько раз в день, а не при каждом открытии страницы как сейчас.
 

maxfire

Новичок
#13
Да, код работает:
добавилось 3 поля для валют: рубль, евро, доллар
нужно указывать только 1 валюту и она будет автоматически конвертироваться по курсу ЦБ России и записываться в _regular_price - основную цену, которая и выводится на странице товара.
Минус моего кода в том, что при каждом открытии категории\страницы с товаром срабатывает функция конвертации, то есть может быть нагрузка на сервер... в идеале проверку курса нужно сделать через крон, чтобы курс обновлялся несколько раз в день, а не при каждом открытии страницы как сейчас.
Тоесть этот код уже рабочий?Куда его нужно вставить заранее блогадарен!
 

pagemaster

Форумчанин
#14
Тоесть этот код уже рабочий?Куда его нужно вставить заранее блогадарен!
прикрепил код, что точно работает (сейчас у меня на сайте), он почти такой же как на форуме (выше), но немного изменен.
Его нужно вставлять в самый конец файла functions.php, который находится в папке вашей темы (/wp-content/themes/ваша_тема/functions.php)
Только не забывайте на странице редактировании товара нужно указывать ТОЛЬКО 1 цену (смотрите картинку)
 

Вложения

maxfire

Новичок
#15
прикрепил код, что точно работает (сейчас у меня на сайте), он почти такой же как на форуме (выше), но немного изменен.
Его нужно вставлять в самый конец файла functions.php, который находится в папке вашей темы (/wp-content/themes/ваша_тема/functions.php)
Только не забывайте на странице редактировании товара нужно указывать ТОЛЬКО 1 цену (смотрите картинку)
Отлично работает!А возможно ли чтоб к автоматически к итоговой рублевой стоимость добовлялось 3% ?
 

pagemaster

Форумчанин
#16
Отлично работает!А возможно ли чтоб к автоматически к итоговой рублевой стоимость добовлялось 3% ?
перед строкой с round($custom_price, 2); допишите $custom_price = ($custom_price * 0,03) + $custom_price;
где 0,03 - это 3%
 

pagemaster

Форумчанин
#18
Просто потрясающе все работает!!!
спасибо)) вот только если будет много одновременных пользователей на сайте, то может быть слишком большая нагрузка на сервер, смотрите чтобы хостер не жаловался и не закрыл сайт. Ну а в общем код работает отлично и цены всегда актуальные по курсу ЦБ.
 

maxfire

Новичок
#19
спасибо)) вот только если будет много одновременных пользователей на сайте, то может быть слишком большая нагрузка на сервер, смотрите чтобы хостер не жаловался и не закрыл сайт. Ну а в общем код работает отлично и цены всегда актуальные по курсу ЦБ.
Вопрос возможно ли какое-то дальнейшее сотрудничество с вами? Можно в личку
 

aNg

Форумчанин
#20
прикрепил код, что точно работает (сейчас у меня на сайте), он почти такой же как на форуме (выше), но немного изменен.
Его нужно вставлять в самый конец файла functions.php, который находится в папке вашей темы (/wp-content/themes/ваша_тема/functions.php)
Только не забывайте на странице редактировании товара нужно указывать ТОЛЬКО 1 цену (смотрите картинку)
А если для гривны, и можно без парсинга... что изменить нужно?