File "currency.php"
Full Path: /home/jlklyejr/public_html/wp-content/test/wp-content/plugins/woo-currency/modules/currency/models/currency.php
File size: 21.66 KB
MIME-type: text/x-php
Charset: utf-8
<?php
class currencyModelWcu extends modelWcu {
public static $savedCurrencies = null;
public function saveCurrencies($data) {
$currencies = array();
if(!empty($data['name'])) {
foreach($data['name'] as $key => $name) {
$currencies[$name] = array('index' => $key,);
}
foreach($data as $key => $item) {
foreach($currencies as $index => $cur) {
$currencies[$index][$key] = isset($item[$currencies[$index]['index']]) ? $item[$currencies[$index]['index']] : '';
}
}
foreach($currencies as $key => $c) {
$currencies[$key]['title'] = utilsWcu::escape($currencies[$key]['title']);
if($currencies[$key]['rate'] == 1) {
update_option('woocommerce_currency', $currencies[$key]['name']);
}
if (isset($currencies[$key]['symbol'])) {
$currencies[$key]['symbol'] = apply_filters('wcu_get_change_custom_symbol', $currencies[$key]['symbol'], $key);
}
}
}
return update_option($this->getModule()->currencyDbOpt, $currencies);
}
public function getCurrencies() {
if (!is_null(self::$savedCurrencies)) {
return self::$savedCurrencies;
}
$currencies = get_option($this->getModule()->currencyDbOpt, array());
if(empty($currencies) || !is_array($currencies)) {
$currencies = $this->getDefaultCurrency();
}
foreach ($currencies as $key => $value) {
$currencies[$key]['rate'] = !empty($currencies[$key]['rate_custom']) ? $currencies[$key]['rate_custom'] : $currencies[$key]['rate'];
}
self::$savedCurrencies = apply_filters('wcu_get_currencies_data', $currencies);
return self::$savedCurrencies;
}
public function getDefaultCurrency() {
$wcCurrency = get_option('woocommerce_currency', 'USD');
$wcCurrencyPos = get_option('woocommerce_currency_pos', 'left');
$currencies = array();
$currencies[$wcCurrency] = array(
'name' => $wcCurrency,
'title' => $wcCurrency,
'symbol' => $this->getCurrencySymbol($wcCurrency),
'show_cents' => $wcCurrency,
'position' => $wcCurrencyPos,
'etalon' => 1,
'rate' => 1,
'rate_custom' => '',
'sort_order' => 1,
);
return $currencies;
}
public function getCurrencySymbol($currency) {
$currencySymbols = $this->getModule()->getCurrencySymbols();
return isset($currencySymbols[$currency]) ? $currencySymbols[$currency] : $currencySymbols['USD'];
}
public function getCurrencyPriceFormat($format) {
$currencies = $this->getCurrencies();
$currentCurrency = $this->getModule()->currentCurrency;
if(isset($currencies[$currentCurrency])) {
switch($currencies[$currentCurrency]['position']) {
case 'left':
$format = '%1$s%2$s';
break;
case 'right':
$format = '%2$s%1$s';
break;
case 'left_space':
$format = '%1$s %2$s';
break;
case 'right_space':
$format = '%2$s %1$s';
break;
default:
break;
}
}
return $format;
}
public function getCurrencyPrice($price, $product = null) {
$module = $this->getModule();
$currencies = $this->getCurrencies();
$defaultCurrency = $module->getDefaultCurrency();
$currentCurrency = $module->getCurrentCurrency();
$cryptoCurrencies = $module->getCryptoCurrencyList();
$decimalSep = $module->decimalSep;
$priceNumDecimals = $module->priceNumDecimals;
$precision = $currentCurrency != $defaultCurrency
? $this->_getPriceDecimalsCount($currentCurrency, $priceNumDecimals, $currencies)
: $this->_getPriceDecimalsCount($defaultCurrency, $priceNumDecimals, $currencies);
$exchangeFeeSign = isset($currencies[$currentCurrency]['exchange_fee_sign']) ? $currencies[$currentCurrency]['exchange_fee_sign'] : 0;
$exchangeFee = isset($currencies[$currentCurrency]['exchange_fee']) ? $currencies[$currentCurrency]['exchange_fee'] : 0;
if($currentCurrency != $defaultCurrency) {
$newPrice = dispatcherWcu::applyFilters('getManualPrice', $price, $currentCurrency, $product);
if ($newPrice !== false) {
if ($newPrice === true) {
return $price;
}
if ($newPrice != $price) {
return $newPrice;
}
}
//Rewrite manual rate
if ( !empty($currencies[$currentCurrency]['rate_custom']) ) {
$currencies[$currentCurrency]['rate'] = $currencies[$currentCurrency]['rate_custom'];
} elseif ( $exchangeFee ) {
$exchangeFee = $exchangeFeeSign ? $exchangeFee * (-1) : $exchangeFee;
$currencies[$currentCurrency]['rate'] += $exchangeFee;
}
}
//Edited this line to set default converting of currency
if ( !array_key_exists( $currentCurrency, $cryptoCurrencies ) ) {
if ($currentCurrency != $defaultCurrency) {
$price = isset($currencies[$currentCurrency]) && $currencies[$currentCurrency] != null
? floatval((float) $price * (float) $currencies[$currentCurrency]['rate'])
: floatval((float) $price * (float) $currencies[$defaultCurrency]['rate']);
} else {
$price = (float) $price;
}
if (empty($currencies[$currentCurrency]['decimals'])) {
$price = floor($price);
} else if ($currencies[$currentCurrency]['decimals'] == 1) {
$price = number_format(round($price), $precision, $decimalSep, '');
} else {
$price = number_format($price, $precision, $decimalSep, '');
}
/*$price = isset($currencies[$currentCurrency]) && $currencies[$currentCurrency] != null
? number_format(floatval((float) $price * (float) $currencies[$currentCurrency]['rate']), $precision, $decimalSep, '')
: number_format(floatval((float) $price * (float) $currencies[$defaultCurrency]['rate']), $precision, $decimalSep, '');*/
} else {
$price = isset($currencies[$currentCurrency]) && $currencies[$currentCurrency] != null
? floatval((float) $price * (float) $currencies[$currentCurrency]['rate'])
: floatval((float) $price * (float) $currencies[$currentCurrency]['rate']);
}
return $price;
//some hints for price rounding
//http://stackoverflow.com/questions/11692770/rounding-to-nearest-50-cents
//$price = round($price * 2, 0) / 2;
//return round ( $price , 0 ,PHP_ROUND_HALF_EVEN );
//return number_format ($price, $priceNumDecimals, $decimalSep, $this->thousands_sep);
}
public function getCurrencyVariationPrices($pricesArr) {
// lets sort arrays by values to avoid wrong price displaying on the front
if(!empty($pricesArr) && is_array($pricesArr)) {
foreach($pricesArr as $key => $arrvals) {
asort($arrvals);
$pricesArr[$key] = $arrvals;
}
}
//another way displaying of price range is not correct
if(empty($pricesArr['sale_price'])) {
if(isset($pricesArr['regular_price'])) {
$pricesArr['price'] = $pricesArr['regular_price'];
}
}
return $pricesArr;
}
public function getCurrencyRate($fromCurrency, $toCurrency) {
$options = $this->getOptions();
$mode = !empty($options['options']['converter_type']) ? $options['options']['converter_type'] : 'cryptocompare';
$freeConverterApiKey = !empty($options['options']['free_converter_apikey']) ? $options['options']['free_converter_apikey'] : 'a4472cb452c8fb230db0';
$fixerConverterApiKey = !empty($options['options']['fixer_converter_apikey']) ? $options['options']['fixer_converter_apikey'] : 'a2697855aaf0f03e3bf46d2215106ef0';
$currencylayerConverterApiKey = !empty($options['options']['currencylayer_converter_apikey']) ? $options['options']['currencylayer_converter_apikey'] : '905875ebd37315ce29619a9663b071aa';
$oerConverterApiKey = !empty($options['options']['oer_converter_apikey']) ? $options['options']['oer_converter_apikey'] : 'e9f616eaa0fb49448d9fe3bd3b9bcd47';
$fromCurrency = urlencode($fromCurrency);
$toCurrency = urlencode($toCurrency);
if (!$fromCurrency) {
$errorMsg = sprintf(__("set main currency", WCU_LANG_CODE), $fromCurrency);
} else {
$errorMsg = sprintf(__("no data for %s", WCU_LANG_CODE), $toCurrency);
}
$rate = '';
switch ($mode) {
case 'free_converter':
//http://free.currencyconverterapi.com/api/v6/convert?apiKey=sample-api-key&q=EUR_USD&compact=y
$queryStr = sprintf("%s_%s", $fromCurrency, $toCurrency);
$url = "http://free.currencyconverterapi.com/api/v6/convert?apiKey={$freeConverterApiKey}&q={$queryStr}&compact=y";
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = !empty($currencyData[$queryStr]['val']) ? $currencyData[$queryStr]['val'] : $errorMsg;
break;
case 'currencyapi':
//https://api.currencyapi.com/v3/latest?apikey=APIKEY&base_currency=USD¤cies=EUR
$accessKey = ! empty( $options['options']['currencyapi_apikey'] ) ? $options['options']['currencyapi_apikey'] : '1d47d4f973a69d43edb9f8b4bb7cd4c8';
$queryStr = sprintf( '?apikey=%s&base_currency=%s¤cies=%s', $accessKey, $fromCurrency, $toCurrency );
$url = 'https://api.currencyapi.com/v3/latest' . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = !empty($currencyData['data']) && !empty($currencyData['data'][$toCurrency]) && !empty($currencyData['data'][$toCurrency]['value']) ? $currencyData['data'][$toCurrency]['value'] : $errorMsg;
break;
case 'ratesapi':
/* $url = "https://api.ratesapi.io/api/latest?base={$fromCurrency}&symbols={$toCurrency}";
$url_get = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$url_json = json_decode($url_get,true);
$rate = $url_json['rates'][$toCurrency];
$rate = !empty($rate) ? $rate : $errorMsg;
break;*/
case 'ecb':
if ( $fromCurrency === $toCurrency ) {
$rate = 1;
} else {
$accessKey = ! empty( $options['options']['ecb_converter_apikey'] ) ? $options['options']['ecb_converter_apikey'] : '1d47d4f973a69d43edb9f8b4bb7cd4c8';
$queryStr = sprintf( '?apikey=%s&symbols=%s&base=%s', $accessKey, $toCurrency, $fromCurrency );
$url = 'https://api.apilayer.com/exchangerates_data/latest' . $queryStr;
$url_get = function_exists( 'curl_init' ) ? $this->_fileGetContentsCurl( $url ) : file_get_contents( $url );
$url_json = json_decode( $url_get, true );
$rate = $url_json['rates'][ $toCurrency ];
$rate = ! empty( $rate ) ? $rate : ( ( isset( $url_json['error']['info'] ) ) ? $url_json['error']['info'] : $errorMsg );
}
break;
case 'cryptocompare':
//https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=BTC
$queryStr = sprintf("?fsym=%s&tsyms=%s", $fromCurrency, $toCurrency);
$url = "https://min-api.cryptocompare.com/data/price" . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = !empty($currencyData[$toCurrency]) ? $currencyData[$toCurrency] : $errorMsg;
break;
case 'xe':
//http://www.xe.com/currencyconverter/convert/?Amount=1&From=ZWD&To=CUP
//https://www.xe.com/currencyconverter/convert/?Amount=4&From=USD&To=EUR
$queryStr = sprintf("?Amount=1&From=%s&To=%s", $fromCurrency, $toCurrency);
$url = "https://www.xe.com/currencyconverter/convert/" . $queryStr;
$html = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
preg_match_all('/<span class=\'converterresult-toAmount\'>(.*?)<\/span>/s', $html, $matches);
$rate = isset($matches[1][0]) ? floatval(str_replace(",", "", $matches[1][0])) : $errorMsg;
break;
case 'finance_yahoo':
//https://finance.yahoo.com/quote/USDBTC=X
$queryStr = sprintf("%s%s=X", $fromCurrency, $toCurrency);
$url = "https://finance.yahoo.com/quote/" . $queryStr;
$html = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
preg_match_all('/quote-header-info.*?fin-streamer.*?>(.*?)<\/fin-streamer>/s', $html, $matches);
$rate = isset($matches[1][0]) ? floatval(str_replace(",", "", $matches[1][0])) : $errorMsg;
break;
case 'poloniex':
if ($fromCurrency == $toCurrency) {
$rate = 1;
} else {
$fromCurrency = $fromCurrency == 'USD' ? 'USDT' : $fromCurrency;
$isUsd = false;
if ($toCurrency == 'USD') {
$isUsd = true;
$toCurrency = $fromCurrency;
$fromCurrency = 'USDT';
}
$queryStr = sprintf("%s_%s", $fromCurrency, $toCurrency);
$url = "https://poloniex.com/public?command=returnTicker";
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = isset($currencyData[$queryStr]) && !empty($currencyData[$queryStr]) ?
($isUsd ? $currencyData[$queryStr]['last'] : 1 / $currencyData[$queryStr]['last']) : $errorMsg;
}
break;
case 'cbr':
if ($fromCurrency != 'RUB') {
$rate = sprintf(__("set %s as main", WCU_LANG_CODE), 'RUB');
} elseif ($fromCurrency == $toCurrency) {
$rate = 1;
} else {
$url = "https://www.cbr-xml-daily.ru/daily_json.js";
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$currencyData = !empty($currencyData) && isset($currencyData['Valute']) ? $currencyData['Valute']
: $currencyData;
$rate = isset($currencyData[$toCurrency]) ? intval($currencyData[$toCurrency]['Nominal'])
/ $currencyData[$toCurrency]['Value'] : $errorMsg;
}
break;
case 'nbp':
if ($fromCurrency != 'PLN') {
$rate = sprintf(__("set %s as main", WCU_LANG_CODE), 'PLN');
} elseif ($fromCurrency == $toCurrency) {
$rate = 1;
} else {
$url = "https://api.nbp.pl/api/exchangerates/tables/A/last/?format=json";
$url_get = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$url_json = json_decode($url_get, true);
$rates = $url_json[0]['rates'];
$rate = '';
foreach ($rates as $item) {
if ($item['code'] == $toCurrency) {
$rate = number_format(1 / $item['mid'], 4, '.', '');
break;
}
}
if (empty($rate)) {
$url = "https://api.nbp.pl/api/exchangerates/tables/B/today/?format=json";
$url_get = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$url_json = json_decode($url_get, true);
$rates = $url_json[0]['rates'];
foreach ($rates as $item) {
if ($item['code'] == $toCurrency) {
$rate = number_format(1 / $item['mid'], 4, '.', '');
break;
}
}
}
$rate = !empty($rate) ? $rate : $errorMsg;
}
break;
case 'pb':
if ($fromCurrency != 'UAH') {
$rate = sprintf(__("set %s as main", WCU_LANG_CODE), 'UAH');
} elseif ($fromCurrency == $toCurrency) {
$rate = 1;
} else {
$url = "https://api.privatbank.ua/p24api/exchange_rates?json&date=".date('d.m.Y');
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = $errorMsg;
if (!empty($currencyData) && isset($currencyData['exchangeRate'])) {
foreach ($currencyData['exchangeRate'] as $item) {
if (isset($item['currency']) && $item['currency'] == $toCurrency) {
$rate = number_format(isset($item['saleRate']) ? 1 / $item['saleRate']
: 1 / $item['saleRateNB'], 4, '.', '');
break;
}
}
}
}
break;
case 'bnr':
if ($fromCurrency != 'RON') {
$rate = sprintf(__("set %s as main", WCU_LANG_CODE), 'RON');
} elseif ($fromCurrency == $toCurrency) {
$rate = 1;
} else {
$dom = new DOMDocument();
$dom->load("https://www.bnr.ro/nbrfxrates.xml");
$rates = $dom->getElementsByTagName('Rate');
$rate = '';
if ($rates->length) {
foreach ($rates as $item) {
if ($item->getAttribute('currency') == $toCurrency) {
$multiplier = $item->hasAttribute('multiplier') ? $item->getAttribute('multiplier') : 1;
$rate = number_format($multiplier / $item->nodeValue, 4, '.', '');
break;
}
}
}
$rate = !empty($rate) ? $rate : $errorMsg;
}
break;
case 'fixer':
$queryStr = sprintf("?access_key=%s&from=%s&to=%s&amount=1", $fixerConverterApiKey, $fromCurrency, $toCurrency);
$url = "https://data.fixer.io/api/convert" . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
if ($currencyData['success']) {
$rate = !empty($currencyData['result']) ? $currencyData['result'] : $errorMsg;
} elseif ($currencyData['error']['code'] == 105 && $fromCurrency != 'EUR') {
$rate = sprintf(__("set %s as main", WCU_LANG_CODE), 'EUR');
} elseif ($currencyData['error']['code'] == 105) {
$queryStr = sprintf("?access_key=%s", $fixerConverterApiKey);
$url = "http://data.fixer.io/api/latest" . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = !empty($currencyData['rates'][$toCurrency]) ? $currencyData['rates'][$toCurrency] : $errorMsg;
} else {
$rate = wp_trim_words($currencyData['error']['info'], 2, '');
}
break;
case 'currencylayer':
$queryStr = sprintf("?access_key=%s&from=%s&to=%s&amount=1", $currencylayerConverterApiKey, $fromCurrency, $toCurrency);
$url = "https://api.currencylayer.com/convert" . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
if ($currencyData['success']) {
$rate = !empty($currencyData['result']) ? $currencyData['result'] : $errorMsg;
} elseif ($currencyData['error']['code'] == 105 && $fromCurrency != 'USD') {
$rate = sprintf(__("set %s as main", WCU_LANG_CODE), 'USD');
} elseif ($currencyData['error']['code'] == 105) {
$queryStr = sprintf("?access_key=%s&currencies=%s,%s&date=%s", $currencylayerConverterApiKey, $fromCurrency, $toCurrency, date('Y-m-d'));
$url = "http://api.currencylayer.com/live" . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = !empty($currencyData['quotes'][$fromCurrency.$toCurrency]) ? $currencyData['quotes'][$fromCurrency.$toCurrency] : $errorMsg;
} else {
$rate = wp_trim_words($currencyData['error']['info'], 2, '');
}
break;
case 'oer':
$queryStr = sprintf("?app_id=%s&base=%s&symbols=%s", $oerConverterApiKey, $fromCurrency, $toCurrency);
$url = "https://openexchangerates.org/api/latest.json" . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
if (!empty($currencyData) && isset($currencyData['rates'])) {
$rate = !empty($currencyData['rates'][$toCurrency]) ? $currencyData['rates'][$toCurrency] : $errorMsg;
} elseif ((empty($currencyData) || in_array($currencyData['status'], [403, 429])) && $fromCurrency != 'USD') {
$rate = sprintf(__("set %s as main", WCU_LANG_CODE), 'USD');
} elseif (empty($currencyData) || in_array($currencyData['status'], [403, 429])) {
$queryStr = sprintf("?app_id=%s&symbols=%s,%s", $oerConverterApiKey, $fromCurrency, $toCurrency);
$url = "https://openexchangerates.org/api/latest.json" . $queryStr;
$res = function_exists('curl_init') ? $this->_fileGetContentsCurl($url) : file_get_contents($url);
$currencyData = json_decode($res, true);
$rate = isset($currencyData['rates']) && !empty($currencyData['rates'][$toCurrency])
? $currencyData['rates'][$toCurrency] : $errorMsg;
} else {
$rate = wp_trim_words($currencyData['description'], 3, '');
}
break;
default:
break;
}
return $rate;
}
public function saveOptions($options) {
return update_option($this->getModule()->optionsDbOpt, escHtmlRecursively($options));
}
public function getOptions() {
$options = get_option($this->getModule()->optionsDbOpt, array());
if(empty($options) || !is_array($options)) {
$options = $this->getModule()->getDefaultOptions();
}
return $options;
}
public function _getPriceDecimalsCount($currency, $val = 2, $currencies = array()) {
if ($this->getModule()->nowCalcCartTotals || $this->getModule()->nowCalcOrderTotals) {
$currency = $this->getModule()->defaultCurrency;
}
return $this->_getRealPriceDecimalsCount($currency, $val, $currencies);
}
public function _getRealPriceDecimalsCount($currency, $val = 2, $currencies = array()) {
$currencies = $this->getCurrencies();
if( isset($currencies[$currency]['decimals']) && ($currencies[$currency]['decimals'] != 0) ) {
$val = isset($currencies[$currency]['after_point'])
? $currencies[$currency]['after_point']
: $currencies[$currency]['decimals'];
return intval($val);
} else {
if (isset($currencies[$currency]['decimals'])) {
$val = 0;
}
return intval($val);
}
}
private function _fileGetContentsCurl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public function changeSettingFlags($setting) {
$field = $this->getModule()->settingFlags;
update_option($field, $setting);
}
}