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

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

pagemaster

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

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

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

pagemaster

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

pagemaster

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

pagemaster

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

ADv

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

pagemaster

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

pagemaster

Форумчанин
В общем вот мой говно-код, который добавляет на страницу изменения товара 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

Новичок
В общем вот мой говно-код, который добавляет на страницу изменения товара 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

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

maxfire

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

pagemaster

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

Вложения

maxfire

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

pagemaster

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

maxfire

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

aNg

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