Woocommerce – добавяне и конвертиране на нова валута

Публикувано от | февруари 25, 2013 | Wordpress уроци | 5 коментара
woocommerce валута лев

WooCommerce е мощен e-commerce плъгин за създаване на електронни магазини. Въпреки неговата богата функционалност е възможно да се сблъскате с някои проблеми, когато става дума за валута.

Тези проблеми и разрешението сме разгледали по-долу:

1. Как се добавя валута на държава, която я няма в списъка.

2. Как се променят валутните единици (например лв.) спрямо новодобавената валута.

3. Как да накараме WooCommerce да позволи Paypal, въпреки че валутата ни не се поддържа.

1. Ако в падащия списък в основните настройки на WooCommerce не намерим желаната валута, ще се наложи да я добавим. Да кажем, че искаме да добавим ‘Bulgarian Lev (лв.)’. Можем да направим това като поставим този код във functions.php файла на темплейта, който ползваме.

add_filter( 'woocommerce_currencies', 'add_bgn_currency' );

function add_bgn_currency( $currencies ) {
 $currencies['BGN'] = __( 'Bulgarian Lev (лв.)', 'woocommerce' );
 return $currencies;
}

$currencies[‘BGN’] – вместо ‘BGN’ можем да сложим друг низ, важно е обаче да знаем, че от тук нататък с него ще се идентифицира нашата валута.

‘Bulgarian Lev (лв.)’ – това е символният низ, който искаме да се появява в падащия списък с валутите.
(За информация филтърът се прилага в woocommerce\admin\settings\settings-init.php)

2. Сега трябва да добавим валутни единици. Под предния код можем да поставим следния:

add_filter('woocommerce_currency_symbol', 'add_bgn_currency_symbol', 10, 2);
 
function add_bgn_currency_symbol( $currency_symbol, $currency ) {
 switch( $currency ) {
 case 'BGN': $currency_symbol = 'лв.'; break;
 }
 return $currency_symbol;
}

case ‘X’ – ако по-горе сме декларирали $currencies[‘X’], където X в нашия случай е BGN

$currency_symbol = ‘лв.’ – валутният символ, който ще използваме в нашите цени.
(За информация филтърът се прилага в woocommerce\woocommerce-core-functions.php)

Ако валутният символ се появява пред цената, а не зад нея и желаете това да се промени, това става от администраторския панел -> WooCommerce-> Настройки-> Каталог-> Настройки на цените-> от падащото меню ‘Позиция на валутния знак’ избираме ‘Дясно (с разстояние)’. Това ще даде вид на цените например: ‘100 лв.’

3. Първият проблем, с който можем да се сблъскаме ако решим да използваме Paypal с новата валута е грешка при достъп до Paypal настройките в администраторския панел на WooCommerce. Да накараме Paypal да бъде достъпен като начин на плащане е първата стъпка.

Ще използваме следния филтър за да добавим „BGN“ към масива с валидни валути за PayPal:

add_filter( 'woocommerce_paypal_supported_currencies', 'add_bgn_paypal_valid_currency' );      
    function add_bgn_paypal_valid_currency( $currencies ) {  
     array_push ( $currencies , 'BGN' );
     return $currencies;  
    } 

(Филтърът се прилага в woocommerce/classes/gateways/paypal/class-wc-paypal.php).

Друг проблем е че Paypal не борави с валутната единица лев, която добавихме. Тогава ще е добре преди плащане, сумите ни да могат да се преобразуват във валута, която Paypal поддържа, например евро. Можем да добавим следния филтър при останалите:

add_filter('woocommerce_paypal_args', 'convert_bgn_to_eur');
function convert_bgn_to_eur($paypal_args){
	if ( $paypal_args['currency_code'] == 'BGN'){
		$convert_rate = 1.954; //set the converting rate
		$paypal_args['currency_code'] = 'EUR'; //change BGN to EUR
		$i = 1;
		
		while (isset($paypal_args['amount_' . $i])) {
			$paypal_args['amount_' . $i] = round( $paypal_args['amount_' . $i] / $convert_rate, 2);
			++$i;
		}
	
	}
return $paypal_args;
}

Проверяваме дали $paypal_args[‘currency_code’] == ‘X’, където X се определя в $currencies[‘X’] от точка 1. В нашия случай X е BGN.

‘BGN’ обаче не се поддържа от Paypal, за това го променяме на ‘EUR’. Осталото са преобразувания на сумите, които трябва да се платят от лева в евро.
(За информация филтърът се прилага в woocommerce\classes\gateways\paypal\class-wc-paypal.php)

Ако информацията ви е била полезна, сподeлете я в социалните мрежи като използвате бутоните по-долу.

The following two tabs change content below.

Светослав Стоянов

Светослав Стоянов е SEO и маркетинг специалист в Devseon. Интересува се от SEO, маркетинг, социални мрежи и предприемачество. Създател на българския форум за фрийлансъри. За повече информация вижте профилите му в социалните мрежи.
  • Martin

    Здравейте,
    Благодаря за полезната информация и решението на проблема с PayPal!!!!! Има ли начин да настроя сайта си автоматично да смята колко е курса на еврото? Мога да си заплатя за услугата ако е много сложно и отнема много време.
    Поздрави,
    Мартин

    • https://devseon.com/ Svetoslav Stoyanov

      Здравейте,

      Радваме се, че информацията Ви е била полезна.

      Курса на еврото е фиксиран към лева, и затова е достатъчно да се въведе съответната стойност (1.954) както сме показали в последния примерен код – $convert_rate = 1.954; //set the converting rate. Така сумата ще се преобразува автоматично от лева в евро.

      Ако имате нужда от допълнително съдействие може да се свържете с нас на имейл адрес: info (at) devseon.com.

  • mpatzekov

    Привет! За да върви комюнитито напред искам и аз да споделя моя опит.
    Приложих нужните филтри и Woocommerce праща към PayPal конвертираната стойност от BGN в EUR. Плащанията също минават успешно и поръчките влизат. До тук добре, но от тези действия произтичат два проблема (поне при мен е така).

    1. Поръчки направени през PayPal влизат като on-hold. Причината е, че PayPal връща към Woocommerce, че плащането е извършено в EUR, a Woocommerce чака обратен отговор BGN. Ето данни от лога:

    Payment error: Currencies do not match (sent „BGN“ | returned „EUR“)

    – Намерих начин да накарам поръчката да влиза като processing, въпреки тази грешка. Добавих във functions.php следното:

    add_action( ‘woocommerce_thankyou’, ‘custom_woocommerce_auto_complete_order’ );
    function custom_woocommerce_auto_complete_order( $order_id ) {
    global $woocommerce;
    if ( !$order_id )
    return;
    $order = new WC_Order( $order_id );
    $order->update_status( ‘processing’ );
    }

    Вече всички поръчки минали през PayPal влизат като „processing“, а не „on-hold“, въпреки разликата във валутите;

    2. Когато имаме складови наличности, например от всички стоки само по 1 продукт е от изключителна важност stock quantity стойностите да се update-ват при всяко успешно плащане. Може би заради тази грешка: Payment error: Currencies do not match (sent „BGN“ | returned „EUR“), stock_quantity не се update-ват. И на практика се получава, че продукт от 1 брой след като е продаден през PayPal остава available in stock в магазина.

    В момента търся решение за този проблем, но все още не мога да намеря. Тъй като не съм много добре запознат технически с php не знам точно как трябва да бъде формулирано правилото. На мен ми правилната логика ми изглежда като:

    Ако след плащане поръчката е със статус „processing“, тогава направи update на stock_quantity на продукта.

  • Nickolay Stoyanov

    Здравейте и благодаря за полезния код. Сам бях измислил половината неща, но доста ми помогна.

    Сега поне при мен остана проблем, че след като мине плащането поръчката се появява като „отказана“.

    Тъй като в лога на Pay Pal не виждам грешки предполагам, че се дължи на нещо друго…

  • Rumen Georgieff

    Здравей,

    а сумата от доставката конвертира ли се? Питам, понеже в момента използвам подобен код, който ми конвертира сумата от лева (примерно 10 лева) в евро (5.12 евро), но не конвертира доставката (примерно 3.50 лева) и тя си остава същата като сума, но в евро (т.е. се увеличава почти двойно като стойност – 3.50 евро).

    Благодаря.

Готови ли сте да победите конкуренцията? Действайте днес!