WooCommerce: Deaktiver Klarna betalingsgateway efter land eller valuta

Jeg har for en kunde mødt dette senarie. Klarna Bank siger “Vi tilbyder ikke Klarna i Canada eller USA til din betalingsløsning i øjeblikket, det er derfor, at US/CA-kunder ikke kan betale med Klarna” Derudover siger Klarna følgende: “Du har følgende markeder tilgængelige på din konto: AT, BE, DK, FR, DE, IT, NL, ES. Derudover accepterer vi IKKE USD som valuta, lige meget hvor.”

I dette tilfælde vil vi altså gerne deaktivere Klarna Gateway for de kunder som ikke bor i de nævnte lande, altså ikke kun Canada og USA. Det er vigtigt at bemærke, at selvom vi bruger Klarna Bank som et eksempel her, gælder denne situation for mange betalingsløsninger, når man handler internationalt, da ikke alle lande eller valutaer kan accepteres.

Jeg har udviklet en lille kode, som sikrer, at Klarna Gateway kun vises for de accepterede lande og for kunder, der ikke har valgt USD som valuta. Vær opmærksom på, at du skal tilpasse dette kodeeksempel til din egen løsning, så det passer til dine behov. Du skal bruge slugs til at identificere den valgte gateway-løsning, som du ønsker at deaktivere (i dette tilfælde [‘klarna’]). Sluggen for Klarna Gateway er altså “klarna”. I de to arrays skal du indtaste valutaerne, der ikke accepteres, samt de lande, hvor betalingsløsningen accepteres. Dette PHP-kodeeksempel skal placeres i functions.php-filen for dit WordPress-tema (eller child-tema).


add_filter('woocommerce_available_payment_gateways', 'Klarna_CCO_woo_filter_gateways', 1);
function Klarna_CCO_woo_filter_gateways($gateway_list) {
   	if (!isset($gateway_list['klarna']) or is_admin()) return $gateway_list;
   $klarnaCountries = ['AT', 'BE', 'DK','FR','DE', 'IT','NL', 'ES']; // insæt tilladte lande 
   $klarnaValuatas = ['USD']; // indsæt ikke tilladte valutaer
   if (in_array(get_woocommerce_currency(), $klarnaValuatas)) {unset($gateway_list['klarna']);} // unset if currency not allowed
   if (!in_array(WC()->customer->get_billing_country(), $klarnaCountries)) {unset($gateway_list['klarna']);} //unset gateway if not allowed country
   return $gateway_list;
}

Opdatering: PHP Fatal error: Uncaught Error: Call to a member function: WC()->customer giver null og smider en fejl

Hvis der ikke er indlæst nogen kunde, vil WC()->customer være null i stedet for et WC_Customer-objekt. Dette kan forekomme i forskellige scenarier. Når WC()->customer er null, kan det medføre uforudsigelige problemer eller fejl i din kode, der er afhængig af kundedata. Hvis du støder på denne situation i din kode, kan du bruge løsningen method_exists(WC()->customer,’get_billing_country’) til at undgå potentielle problemer. Denne løsning tjekker, om metoden “get_billing_country” er tilgængelig i WC()->customer-objektet, før du forsøger at bruge den.

Helt konkret opdagede jeg fejlen, da jeg oplevede problemer i forbindelse med forbindelsen til API’en (wp-json/wc/v2/). Under brugen af API’en bemærkede jeg, at der opstod fejl, der var forbundet med manglende kundedata eller en null-værdi i WC()->customer.

Dette førte mig til at undersøge koden nærmere og identificere, at WC()->customer kunne være null, når der ikke var indlæst nogen kunde. Jeg indså, at dette var den underliggende årsag til problemerne med API-forbindelsen.

Ved at bruge method_exists() funktionen kan du sikre, at du kun arbejder med kundedata, når metoden er tilgængelig. Dette hjælper med at undgå fejl og uønsket adfærd i din kode, når der ikke er indlæst nogen kunde.

Her er et eksempel på, hvordan du kan implementere løsningen i din kode:


// Ekskluder hvis kundedata ikke er tilgængelig
if(!is_object(WC()->customer) OR !method_exists(WC()->customer,'get_billing_country') ){
      return $available_gateways;
   }

Og her det fulde opdaterede kodestykke som også ekskluderer hvis kundedata ikke er tilgængelig.


add_filter('woocommerce_available_payment_gateways', 'Klarna_CCO_woo_filter_gateways', 1);
function Klarna_CCO_woo_filter_gateways($gateway_list) {
   	if (!isset($gateway_list['klarna']) or is_admin() or !is_object(WC()->customer) OR !method_exists(WC()->customer,'get_billing_country')) return $gateway_list;
   $klarnaCountries = ['AT', 'BE', 'DK','FR','DE', 'IT','NL', 'ES']; // insæt tilladte lande 
   $klarnaValuatas = ['USD']; // indsæt ikke tilladte valutaer
   if (in_array(get_woocommerce_currency(), $klarnaValuatas)) {unset($gateway_list['klarna']);} // unset if currency not allowed
   if (!in_array(WC()->customer->get_billing_country(), $klarnaCountries)) {unset($gateway_list['klarna']);} //unset gateway if not allowed country
   return $gateway_list;
}