adamsage
Форумчанин
Всем привет! Делаю магазин с ценами в евро. Платежная система - Яндекс Касса. В оф. мануале говорится, что Яндекс Касса НЕ принимает оплату в валюте и необходимо конвертировать цены в рубли на стороне сайта. Готовых решений не нашел, собрал свое (собирал из кусков т.к. я не программист). После нажатия кнопки "Оформить заказ", при переходе на оплату цена конвертируется и отображается в рублях. НО в письмах админу и клиенту об "Оформлении заказа" также в total вставляется сумма в рублях (сама цифра) с подписью что это евро.
Нужно чтобы вставлялась первоначальная правильная цена, а не пере конвертированная. Помогите, плиз!
Сам код (в конец functions.php)
Нужно чтобы вставлялась первоначальная правильная цена, а не пере конвертированная. Помогите, плиз!
Сам код (в конец functions.php)
Код:
add_action( 'woocommerce_checkout_create_order', 'change_total_on_checking', 20, 1 );
function change_total_on_checking( $order ) {
// Get order total
$total = $order->get_total();
// Start converter config!!!! https://github.com/ilyatom/currency-converter
class CurrencyConverter {
/*
* Класс для конвертации валют
*/
// PROPERTIES
protected $fromCurrencyAmount;
protected $fromCurrencyName = 'RUB';
protected $fromCurrencyRate;
protected $toCurrencyAmount;
protected $toCurrencyName = 'RUB';
protected $toCurrencyRate;
protected $precision = 1;
// API
public function from($currencyName) {
$this->fromCurrencyName = $currencyName;
return $this;
}
public function to($currencyName) {
$this->toCurrencyName = $currencyName;
return $this;
}
public function precision($precision) {
$this->precision = $precision;
return $this;
}
public function convert($fromCurrencyAmount) {
if ($this->fromCurrencyName != 'RUB') {
$this->fromCurrencyRate = $this->GetRate($this->fromCurrencyName);
} else {
$this->fromCurrencyRate = 1;
}
if ($this->toCurrencyName != 'RUB') {
$this->toCurrencyRate = $this->GetRate($this->toCurrencyName);
} else {
$this->toCurrencyRate = 1;
}
$result = $fromCurrencyAmount / $this->fromCurrencyRate * $this->toCurrencyRate;
$this->toCurrencyAmount = round($result, $this->precision);
return $this->toCurrencyAmount;
}
// PROTECTED
private function today() {
return date('d/m/Y');
}
private function GetXML() {
$r = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$this->today());
$xml = simplexml_load_string($r);
return $xml;
}
private function GetRateFromXML($currency) {
$xml = $this->GetXML();
foreach ($xml->Valute as $valute) {
if ($valute->CharCode == $currency) {
$value = str_replace(',', '.', $valute->Value);
$rate = $valute->Nominal / $value;
}
}
if (isset($rate)) {
$r = $rate;
} else {
$r = false;
}
return $r;
}
private function GetRateFromCookie($currency) {
if ($this->IsSetCurrencyCookie($currency)) {
$parts = explode('_', $this->GetRateCookie($currency));
$rate = $parts[0];
$r = $rate;
} else {
$r = false;
}
return $r;
}
private function SetRateCookie($currency, $rate) {
setcookie($currency, $rate.'_'.$this->today());
}
private function GetRateCookie($currency) {
return filter_input(INPUT_COOKIE, $currency);
}
private function IsSetCurrencyCookie($currency){
if ($this->GetRateCookie($currency) != FALSE and $this->GetRateCookie($currency) != NULL) {
return TRUE;
}else {
return FALSE;
}
}
private function GetRate($currency) {
if ($this->IsSetCurrencyCookie($currency)) {
$parts = explode('_', $this->GetRateCookie($currency));
$date = $parts[1];
if ($date == $this->today()) {
$rate = $this->GetRateFromCookie($currency);
} else {
$rate = $this->GetRateFromXML($currency);
$this->SetRateCookie($currency, $rate);
}
} else {
$rate = $this->GetRateFromXML($currency);
$this->SetRateCookie($currency, $rate);
}
return $rate;
}
}
// End converter config
//start converting total
$curConv = new CurrencyConverter;
$new_total = $curConv->from('EUR')->convert($total);
//end converting total
// Set the new calculated total
$order->set_total( $new_total );
}