oont-contents/plugins/currency-switcher-woocommerce/includes/functions/alg-switcher-exchange-rates-functions.php
2025-02-08 15:10:23 +01:00

512 lines
18 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Currency Switcher Functions - Exchange Rates
*
* @version 2.16.0
* @since 2.8.0
* @author Tom Anbinder
* @author WP Wham
*
* @todo show an admin notice if Free Currency Coverter API key is invalid.
* @todo show an admin notice if libxml is missing (impacts the XML-based APIs: ECB, BoE, TCMB)
*/
if ( ! function_exists( 'alg_wc_cs_get_exchange_rates_servers' ) ) {
/*
* alg_wc_cs_get_exchange_rates_servers.
*
* @version 2.16.0
* @since 2.8.0
*
* @author Algoritmika Ltd.
* @author David Grant
*/
function alg_wc_cs_get_exchange_rates_servers() {
return array(
'boe' => __( 'Bank of England', 'currency-switcher-woocommerce' ),
'coinbase' => __( 'Coinbase (for Cryptocurrencies)', 'currency-switcher-woocommerce' ),
'coinmarketcap' => __( 'CoinMarketCap (for Cryptocurrencies)', 'currency-switcher-woocommerce' ),
'currencyapi' => __( 'Currencyapi.com', 'currency-switcher-woocommerce' ),
'ecb' => __( 'European Central Bank [recommended]', 'currency-switcher-woocommerce' ),
'free_cur_api' => __( 'Free Currency Converter API', 'currency-switcher-woocommerce' ),
'georgia' => __( 'National Bank of Georgia', 'currency-switcher-woocommerce' ),
'tcmb' => __( 'Türkiye Cumhuriyet Merkez Bankası', 'currency-switcher-woocommerce' ),
);
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rate_georgia' ) ) {
/*
* alg_wc_cs_get_exchange_rate_georgia.
*
* @version 2.14.0
* @since 2.9.0
*/
function alg_wc_cs_get_exchange_rate_georgia( $currency_from, $currency_to ) {
if ( ! class_exists( "SoapClient" ) ) {
return 0;
}
$client = new SoapClient( 'https://services.nbg.gov.ge/Rates/Service.asmx?wsdl' );
$currencies = "{$currency_from},{$currency_to}";
$result = $client->GetCurrentRates( array( 'Currencies' => $currencies ) );
if ( is_array( $result->GetCurrentRatesResult->CurrencyRate ) ) {
foreach ( $result->GetCurrentRatesResult->CurrencyRate as $currency ) {
if ( $currency->Code === $currency_from ) {
$rate_from = $currency->Rate / $currency->Quantity;
}
if ( $currency->Code === $currency_to ) {
$rate_to = $currency->Rate / $currency->Quantity;
}
}
} else {
// if its not an array then NBG does not have the currency pair
$rate_from = 0;
$rate_to = 0;
}
if ( ! empty( $rate_from ) && ! empty( $rate_to ) ) {
$final_rate = round( $rate_from / $rate_to, ALG_WC_CS_EXCHANGE_RATES_PRECISION );
} else {
$final_rate = 0;
}
return $final_rate;
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rate_free_currency_api' ) ) {
/**
* Converts using the Free Currency Converter api
* @link https://free.currencyconverterapi.com/
*
* @version 2.12.0
* @since 2.9.1
*
* @author Algoritmika Ltd.
* @author WP Wham
*/
function alg_wc_cs_get_exchange_rate_free_currency_api( $currency_from, $currency_to ) {
$pair = $currency_from . '_' . $currency_to;
$url = 'https://free.currconv.com/api/v7/convert?q=' . $pair . '&compact=y';
$api_key = get_option( 'wpw_cs_fcc_api_key' );
if ( ! empty( $api_key ) ) {
$url = add_query_arg( array(
'apiKey' => $api_key
), $url );
}
$response = alg_wc_cs_get_currency_exchange_rates_url_response( $url );
if ( $response ) {
return ( ! empty( $response->{$pair}->val ) ? $response->{$pair}->val : false );
}
return false;
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rate_ecb' ) ) {
/*
* alg_wc_cs_get_exchange_rate_ecb.
*
* @version 2.14.0
* @since 2.2.0
*
* @author Algoritmika Ltd.
* @author WP Wham
*/
function alg_wc_cs_get_exchange_rate_ecb( $currency_from, $currency_to ) {
$final_rate = 0;
$url = 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml';
if ( function_exists( 'simplexml_load_file' ) ) {
$xml = simplexml_load_file( $url );
if ( ! $xml ) {
$xml = simplexml_load_string( alg_wc_cs_get_currency_exchange_rates_url_response( $url, array(), false ) );
}
if ( isset( $xml->Cube->Cube->Cube ) ) {
if ( 'EUR' === $currency_from ) {
$EUR_currency_from_rate = 1;
}
if ( 'EUR' === $currency_to ) {
$EUR_currency_to_rate = 1;
}
foreach ( $xml->Cube->Cube->Cube as $currency_rate ) {
$currency_rate = $currency_rate->attributes();
if ( ! isset( $EUR_currency_from_rate ) && $currency_from == $currency_rate->currency ) {
$EUR_currency_from_rate = (float) $currency_rate->rate;
}
if ( ! isset( $EUR_currency_to_rate ) && $currency_to == $currency_rate->currency ) {
$EUR_currency_to_rate = (float) $currency_rate->rate;
}
}
if ( isset( $EUR_currency_from_rate ) && isset( $EUR_currency_to_rate ) && 0 != $EUR_currency_from_rate ) {
$final_rate = round( $EUR_currency_to_rate / $EUR_currency_from_rate, ALG_WC_CS_EXCHANGE_RATES_PRECISION );
} else {
$final_rate = 0;
}
}
}
return $final_rate;
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rates_server_title' ) ) {
/*
* alg_wc_cs_get_exchange_rates_server_title.
*
* @version 2.8.0
* @since 2.8.0
*/
function alg_wc_cs_get_exchange_rates_server_title( $server_id ) {
$servers = alg_wc_cs_get_exchange_rates_servers();
return ( isset( $servers[ $server_id ] ) ? $servers[ $server_id ] : $server_id );
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rate' ) ) {
/*
* alg_wc_cs_get_exchange_rate.
*
* @version 2.15.0
* @since 2.0.0
* @return float rate on success, else 0
*/
function alg_wc_cs_get_exchange_rate( $currency_from, $currency_to, $server_override = false ) {
$return = 0;
if ( $server_override ) {
$server = $server_override;
} else {
$server = get_option( 'alg_currency_switcher_exchange_rate_server_' . $currency_from . '_' . $currency_to, 'default' );
}
if ( $server === 'default' ) {
$server = get_option( 'alg_currency_switcher_exchange_rate_server', 'ecb' );
}
switch ( $server ) {
case 'coinmarketcap':
$return = alg_wc_cs_get_exchange_rate_coinmarketcap( $currency_from, $currency_to );
break;
case 'coinbase':
$return = alg_wc_cs_get_exchange_rate_coinbase( $currency_from, $currency_to );
break;
case 'currencyapi':
$return = alg_wc_cs_get_exchange_rate_currencyapi( $currency_from, $currency_to );
break;
case 'tcmb':
$return = wpw_cs_tcmb_get_exchange_rate( $currency_from, $currency_to );
break;
case 'georgia':
$return = alg_wc_cs_get_exchange_rate_georgia( $currency_from, $currency_to );
break;
case 'boe':
$return = wpw_cs_boe_get_exchange_rate( $currency_from, $currency_to );
break;
case 'free_cur_api':
$return = alg_wc_cs_get_exchange_rate_free_currency_api( $currency_from, $currency_to );
break;
default: // 'ecb'
$return = alg_wc_cs_get_exchange_rate_ecb( $currency_from, $currency_to );
}
$return = number_format( floatval( $return ), 8, '.', '' ); // make sure its in a format we can handle
$return = apply_filters( 'alg_wc_cs_get_exchange_rate', $return, $server, $currency_from, $currency_to );
if ( 'default' === get_option( 'alg_currency_switcher_exchange_rate_offset_type_' . $currency_from . '_' . $currency_to, 'default' ) ) {
$offset = get_option( 'alg_currency_switcher_exchange_rate_offset', 0 );
} else {
$offset = get_option( 'alg_currency_switcher_exchange_rate_offset_' . $currency_from . '_' . $currency_to, 0 );
}
return ( 0 != $offset ? ( $offset / 100 * $return + $return ) : $return );
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rate_coinmarketcap' ) ) {
/*
* alg_wc_cs_get_exchange_rate_coinmarketcap.
*
* @version 2.14.0
* @since 2.8.0
*/
function alg_wc_cs_get_exchange_rate_coinmarketcap( $currency_from, $currency_to, $try_reverse = true ) {
$return = 0;
$api_key = get_option( 'wpw_currency_switcher_coinmarketcap_api_key' );
$response = alg_wc_cs_get_currency_exchange_rates_url_response(
"https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=$currency_to&convert=$currency_from",
array(
'Accepts' => 'application/json',
'X-CMC_PRO_API_KEY' => $api_key,
)
);
if ( isset( $response->data->{$currency_to}->quote->{$currency_from}->price ) ) {
$return = $response->data->{$currency_to}->quote->{$currency_from}->price;
$return = round( ( 1 / $return ), ALG_WC_CS_EXCHANGE_RATES_PRECISION );
}
if ( $return === 0 && $try_reverse ) {
$return = alg_wc_cs_get_exchange_rate_coinmarketcap( $currency_to, $currency_from, false );
}
return $return;
}
}
if ( ! function_exists( 'alg_wc_cs_get_currency_exchange_rates_url_response' ) ) {
/*
* alg_wc_cs_get_currency_exchange_rates_url_response.
*
* @version 2.14.0
* @since 2.8.0
*/
function alg_wc_cs_get_currency_exchange_rates_url_response( $url, $headers = array(), $do_json_decode = true ) {
$response = apply_filters( 'wpw_cs_http_request', false, $url, $headers );
if ( ! $response ) {
$response = wp_remote_get(
$url,
array(
'sslverify' => false,
'timeout' => 10,
'headers' => $headers,
)
);
if ( ! is_wp_error( $response ) ) {
$response = $response['body'];
} else {
$response = false;
}
}
if ( $response !== false && $do_json_decode ) {
$response = json_decode( $response );
}
return $response;
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rate_coinbase' ) ) {
/*
* alg_wc_cs_get_exchange_rate_coinbase.
*
* @version 2.8.0
* @since 2.8.0
*/
function alg_wc_cs_get_exchange_rate_coinbase( $currency_from, $currency_to ) {
$response = alg_wc_cs_get_currency_exchange_rates_url_response( "https://api.coinbase.com/v2/exchange-rates?currency=$currency_from" );
return ( isset( $response->data->rates->{$currency_to} ) ? $response->data->rates->{$currency_to} : 0 );
}
}
if ( ! function_exists( 'alg_wc_cs_get_exchange_rate_currencyapi' ) ) {
/*
* alg_wc_cs_get_exchange_rate_currencyapi.
*
* @version 2.16.0
* @since 2.16.0
*/
function alg_wc_cs_get_exchange_rate_currencyapi( $currency_from, $currency_to ) {
$api_key = get_option( 'wpw_currency_switcher_currencyapi_api_key' );
$response = alg_wc_cs_get_currency_exchange_rates_url_response(
"https://api.currencyapi.com/v3/latest?base_currency=$currency_from&currencies=$currency_to",
array(
'apikey' => $api_key,
)
);
return ( isset( $response->data->{$currency_to}->value ) ? $response->data->{$currency_to}->value : 0 );
}
}
if ( ! function_exists( 'alg_wc_cs_update_the_exchange_rates' ) ) {
/**
* alg_wc_cs_update_the_exchange_rates.
*
* @version 2.0.0
* @since 2.0.0
* @todo add price filter widget and sorting by price support
*/
function alg_wc_cs_update_the_exchange_rates() {
$currency_from = get_option( 'woocommerce_currency' );
foreach ( alg_get_enabled_currencies() as $currency ) {
if ( $currency_from != $currency ) {
$the_rate = alg_wc_cs_get_exchange_rate( $currency_from, $currency );
if ( 0 != $the_rate ) {
update_option( 'alg_currency_switcher_exchange_rate_' . $currency_from . '_' . $currency, $the_rate );
}
}
}
/*
if ( 'yes' === get_option( 'alg_price_by_country_price_filter_widget_support_enabled', 'no' ) ) {
alg_update_products_price_by_country();
}
*/
}
}
if ( ! function_exists( 'alg_wc_cs_get_currency_exchange_rate' ) ) {
/**
* alg_wc_cs_get_currency_exchange_rate.
*
* @version 2.2.4
* @since 2.2.4
*/
function alg_wc_cs_get_currency_exchange_rate( $currency_code ) {
$currency_from = get_option( 'woocommerce_currency' );
return ( $currency_from == $currency_code ) ? 1 : get_option( 'alg_currency_switcher_exchange_rate_' . $currency_from . '_' . $currency_code, 1 );
}
}
if ( ! function_exists( 'wpw_cs_boe_get_exchange_rate_gbp' ) ) {
/*
* wpw_cs_boe_get_exchange_rate_gbp.
*
* @version 2.14.0
* @since 2.12.0
*/
function wpw_cs_boe_get_exchange_rate_gbp( $currency_to ) {
if ( 'GBP' == $currency_to ) {
return 1;
}
$final_rate = false;
$currency_codes = array(
'AUD' => 'EC3', // Australian Dollar
'CAD' => 'ECL', // Canadian Dollar
'CNY' => 'INB', // Chinese Yuan
'CZK' => 'DS7', // Czech Koruna
'DKK' => 'ECH', // Danish Krone
'EUR' => 'C8J', // Euro
'HKD' => 'ECN', // Hong Kong Dollar
'HUF' => '5LA', // Hungarian Forint
'INR' => 'INE', // Indian Rupee
'ILS' => 'IN7', // Israeli Shekel
'JPY' => 'C8N', // Japanese Yen
'MYR' => 'IN8', // Malaysian ringgit
'NZD' => 'ECO', // New Zealand Dollar
'NOK' => 'EC6', // Norwegian Krone
'PLN' => '5OW', // Polish Zloty
'RUB' => 'IN9', // Russian Ruble
'SAR' => 'ECZ', // Saudi Riyal
'SGD' => 'ECQ', // Singapore Dollar
'ZAR' => 'ECE', // South African Rand
'KRW' => 'INC', // South Korean Won
'SEK' => 'ECC', // Swedish Krona
'CHF' => 'ECU', // Swiss Franc
'TWD' => 'ECD', // Taiwan Dollar
'THB' => 'INA', // Thai Baht
'TRY' => 'IND', // Turkish Lira
'USD' => 'C8P', // US Dollar
);
if ( isset( $currency_codes[ $currency_to ] ) && function_exists( 'simplexml_load_file' ) ) {
for ( $i = 1; $i <= 7; $i++ ) {
$date = time() - $i*24*60*60;
$date_from_d = date( 'd', $date );
$date_from_m = date( 'M', $date );
$date_from_y = date( 'Y', $date );
$date_to_d = date( 'd', $date );
$date_to_m = date( 'M', $date );
$date_to_y = date( 'Y', $date );
$date_url = '&FD=' . $date_from_d . '&FM=' . $date_from_m . '&FY=' . $date_from_y . '&TD=' . $date_to_d . '&TM=' . $date_to_m . '&TY=' . $date_to_y;
$url = 'http://www.bankofengland.co.uk/boeapps/iadb/fromshowcolumns.asp?Travel=NIxRSxSUx&FromSeries=1&ToSeries=50&DAT=RNG' . $date_url .
'&VFD=Y&xml.x=23&xml.y=18&CSVF=TT&C=' . $currency_codes[ $currency_to ] . '&Filter=N';
$xml = simplexml_load_file( $url );
if ( ! $xml ) {
$xml = simplexml_load_string( alg_wc_cs_get_currency_exchange_rates_url_response( $url, array(), false ) );
}
$json_string = json_encode( $xml );
$result_array = json_decode( $json_string, true );
if ( isset( $result_array['Cube']['Cube'] ) ) {
$last_element_index = count( $result_array['Cube']['Cube'] ) - 1;
if ( isset( $result_array['Cube']['Cube'][ $last_element_index ]['@attributes']['OBS_VALUE'] ) ) {
return $result_array['Cube']['Cube'][ $last_element_index ]['@attributes']['OBS_VALUE'];
}
}
}
}
return $final_rate;
}
}
if ( ! function_exists( 'wpw_cs_boe_get_exchange_rate' ) ) {
/*
* wpw_cs_boe_get_exchange_rate.
*
* @version 2.12.0
* @since 2.12.0
*/
function wpw_cs_boe_get_exchange_rate( $currency_from, $currency_to ) {
if (
false != ( $gbp_currency_from = wpw_cs_boe_get_exchange_rate_gbp( $currency_from ) ) &&
false != ( $gbp_currency_to = wpw_cs_boe_get_exchange_rate_gbp( $currency_to ) )
) {
return round( $gbp_currency_to / $gbp_currency_from, 6 );
}
return false;
}
}
if ( ! function_exists( 'wpw_cs_tcmb_get_exchange_rate_TRY' ) ) {
/*
* wpw_cs_tcmb_get_exchange_rate_TRY.
*
* @version 2.14.0
* @since 2.12.0
*/
function wpw_cs_tcmb_get_exchange_rate_TRY( $currency_from ) {
if ( 'TRY' === $currency_from ) {
return 1;
}
$url = 'http://www.tcmb.gov.tr/kurlar/today.xml';
$xml = simplexml_load_file( $url );
if ( ! $xml ) {
$xml = simplexml_load_string( alg_wc_cs_get_currency_exchange_rates_url_response( $url, array(), false ) );
}
if ( isset( $xml->Currency ) ) {
foreach ( $xml->Currency as $the_rate ) {
$attributes = $the_rate->attributes();
if ( isset( $attributes['CurrencyCode'] ) ) {
$currency_code = (string) $attributes['CurrencyCode'];
if ( $currency_code === $currency_from ) {
// Possible values: ForexSelling, ForexBuying, BanknoteSelling, BanknoteBuying. Not used: CrossRateUSD, CrossRateOther.
if ( '' != ( $property_to_check = apply_filters( 'wpw_cs_tcmb_property_to_check', '' ) ) ) {
if ( isset( $the_rate->{$property_to_check} ) ) {
$rate = (float) $the_rate->{$property_to_check};
} else {
continue;
}
} else {
if ( isset( $the_rate->ForexSelling ) ) {
$rate = (float) $the_rate->ForexSelling;
} elseif ( isset( $the_rate->ForexBuying ) ) {
$rate = (float) $the_rate->ForexBuying;
} elseif ( isset( $the_rate->BanknoteSelling ) ) {
$rate = (float) $the_rate->BanknoteSelling;
} elseif ( isset( $the_rate->BanknoteBuying ) ) {
$rate = (float) $the_rate->BanknoteBuying;
} else {
continue;
}
}
$unit = ( isset( $the_rate->Unit ) ) ? (float) $the_rate->Unit : 1;
return ( $rate / $unit );
}
}
}
}
return false;
}
}
if ( ! function_exists( 'wpw_cs_tcmb_get_exchange_rate' ) ) {
/*
* wpw_cs_tcmb_get_exchange_rate.
*
* @version 2.12.0
* @since 2.12.0
*/
function wpw_cs_tcmb_get_exchange_rate( $currency_from, $currency_to ) {
$currency_from_TRY = wpw_cs_tcmb_get_exchange_rate_TRY( strtoupper( $currency_from ) );
if ( false == $currency_from_TRY ) {
return false;
}
$currency_to_TRY = wpw_cs_tcmb_get_exchange_rate_TRY( strtoupper( $currency_to ) );
if ( false == $currency_to_TRY ) {
return false;
}
if ( 1 == $currency_to_TRY ) {
return round( $currency_from_TRY, 6 );
}
return round( ( $currency_from_TRY / $currency_to_TRY ), 6 );
}
}