Existuje spousta důvodů proč chtít deaktivovat specifickou platební metodu pro vybranou dopravu ve WooCommerce. V tomto článku si ukážeme, jak toho pomocí malého snippetu dokázat.
Poznámka: Tento způsob se hodí především při práci s Bankovním převodem, u kterého chybí možnost nastavení povolené dopravy.
Pro příklad ukážu, jak deaktivovat možnost platby Bankovním převodem pro Místní vyzvednutí. Ať už to budete upravovat pro jakoukoliv platební metodu nebo doručení, vždy budete potřebovat znát jejich ID.
Získání ID platební metody
ID platební metody získáte tak, že se přihlásíte do WordPress administrace a v levém menu vyberete WooCommerce -> Nastavení a ze záložky pak Pokladna. Zde si rozkliknete vybranou platební metodu. Nyní se podíváte na URL a na konci je §ion=idplatebnimetody.
V našem příkladě u Bankovního převodu je zde §ion=bacs. ID je tedy „bacs“.
Získání ID dopravy
Zde je to trochu složitější. Od verze WooCommerce 2.6+ se to změnilo a sledováním parametru v URL se již ID nedozvíte. Místo toho musíte jít na stránku Pokladny a pomocí Průzkumníka nebo zdrojového kódu najít ID dopravy.
ID je hodnota value u dané dopravy. V naše příkladu je to local_pickup:2.
Když nyní víme všechno potřebné, stačí do functions.php v šabloně (ideálně child šabloně) vložit kód. Nezapomeňte však upravit ID. ID dopravy se nachází na řádku 10 a ID platební metody je na řádku 13.
/**
* Filtr platební brány
*/
function my_custom_available_payment_gateways( $gateways ) {
if ( ! is_admin() ) {
$chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ );
if(!empty($chosen_shipping_rates)){
// Když je vybraná doprava
if ( in_array( 'local_pickup:1', $chosen_shipping_rates ) ) :
// Odstraň platební metodu
unset( $gateways['bacs'] );
endif;
}
return $gateways;
}
}
add_filter( 'woocommerce_available_payment_gateways', 'my_custom_available_payment_gateways' );
Nyní jen vše uložte a můžete otestovat, zda se již vybraná platební metoda skrývá při výběru určité dopravy.
Ahoj, nějak se ti tam rozhodilo formátování a háže to chybu. V 6. řádku máš: „$chosen_shipping_rates = WC()->session->get( ‚chosen_shipping_methods‘ );“
Správně by mělo být:
$chosen_shipping_rates = WC()->session->get( ‚chosen_shipping_methods‘ );
Jinak díky a ať se daří!
Díky, opraveno.
Správně by mělo být:
$chosen_shipping_rates = WC()->session->get( ‚chosen_shipping_methods‘ );
Ahoj, lze to takto také nastavit pro více než jednu dopravu?
Ano, jen musíte tu funkci drobet upravit.
Dobrý den, děkuji za skvělou radu, funguje to 🙂 při osobním vyzvednutí se nezobrazuje bankovní převod. Ale ještě bych potřebovala vyřešit 40 Kč (extra charge z pluginu COD), která mi zůstává v dobírce při osobním vyzvednutí?
Zdravím, ještě bych před voláním $chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ ); doporučil pomocí is_admin ověřit, že nejste v administraci, ale na frontendu. U mě konkrétně to způsobilo, že nefungovala stránka pro editaci menu.
Dobrý den. Tento kód funguje pěkně. Bohužel jak někdo psal výše, zakáže nastavit vzhled menu v administraci (tj. vubec se neobjevi). Máte tip co do kódu dopsat, aby se tak nedělo? Děkuji
Zdravím,
kód jsem upravil.
Zdravím Tome.
Skvělý návod a pracuje dobře. Jak bylo napsáno výše, jak přepsat kód pokud mám více doprav a více plateb? Nemohl by si poskytnout také návod.
Pokud se jedná o jeden způsob dopravy(např. Česká pošta-balík na poštu – na řádku 10 if ( in_array( ‚ID přepravy Česká pošta-balík na poštu‘, $chosen_shipping_rates ) ) :
Na řádku 13, co je omezení platební brány unset( $gateways[‚ID platební brány-např. v hotovosti‘] );.
Pod tento řádek jsem přidal další omezení platební brány unset( $gateways[‚ID další platební brány-např. bankovní převod‘] );. Při vybrání dopravy Česká pošta-balík na poštu se v tuto chvíli zobrazuje pouze dobírka. Toto je pro jeden způsob dopravy.
Potřeboval bych nadefinovat tímto způsobem více dopravních možností a kombinovat s platbami.
Například.
Doprava Česká pošta – balik na poštu, cena XY – Zobrazená Platba pouze dobírka
Doprava Česká pošta – balik na poštu-platba předem na účet, cena XXY – Zobrazená platba pouze bankovní převod
Doprava osobní vyzvednutí – Zobrazená platba pouze v hotovosti.
Mnohokrát díky
Dobrý den, mám problém, když si zákazník vybere dodání Na dobírku, tak se v košíku ukazuje stále možnost platit i platební kartou (platební brána Tatrabanka CardPay), což je logický nesmysl. Nevěděli byste, prosím, někdo poradit, jak mám tohle vyřešit? Děkuji. Tomáš.
Zdravím,
dotaz moc nechápu. Posloupnost je tam produkt -> košík -> pokladna, přičemž dopravu si vybírá v posledním kroku.
Dobrý den,
kód stále hlásí chybu na řádku 6, jak již bylo zmiňováno, ale ani jedna z verzí zde uvedených není funkční:
Warning: Use of undefined constant ‘chosen_shipping_methods’ – assumed ‚‘chosen_shipping_methods’‘ (this will throw an Error in a future version of PHP) in /www/doc/www.vermikompostuj.cz/www/wp-content/themes/astra-child-theme/functions.php on line 6
Mohu poprosit o nějaké opravené řešení?
Tohle umí plugin České služby https://github.com/pavelevap/ceske-sluzby
Omg! díky za ten odkaz, něco takovýho (zaokrouhlení celkové částky a jiný hračky) jsem hledal strašně dlouho!! dík díik
Tento snippet, který se vloží do function.php, skryje možnosti platby (dobírka, bankovní převod a paypal) při místním vyzvednutí (platbě na prodejně).
function we_gateway_disable_shipping( $available_gateways ) {
global $woocommerce;
if ( !is_admin() ) {
$chosen_methods = WC()->session->get( ‚chosen_shipping_methods‘ );
$chosen_shipping = $chosen_methods[0];
if ( isset( $available_gateways[‚cod‘] ) && 0 === strpos( $chosen_shipping, ‚local_pickup‘ ) ) {
unset( $available_gateways[‚cod‘] );
}
if ( isset( $available_gateways[‚bacs‘] ) && 0 === strpos( $chosen_shipping, ‚local_pickup‘ ) ) {
unset( $available_gateways[‚bacs‘] );
}
if ( isset( $available_gateways[‚ppec_paypal‘] ) && 0 === strpos( $chosen_shipping, ‚local_pickup‘ ) ) {
unset( $available_gateways[‚ppec_paypal‘] );
}
}
return $available_gateways;
}
add_filter( ‚woocommerce_available_payment_gateways‘, ‚we_gateway_disable_shipping‘ );
Zdravím, vidím, že někteří zde již žádali o úpravu kódu pokud je potřeba toto nastavit pro více doprav. Najde se někdo, kdo by s tím pomohl a dal upravený kód alespoň pro dvě dopravy u kterých se nemá zobrazovat platba převodem? Mockrát děkuji Jakub.
Jejda chtěl jsem skusit tvuj kod na skrytí plateb při místním vyzvednutí a musel jsem ho trochu poupravit byly tam na prd uvozovky a nebralo mi to. A nemam tam paypal tak se třeba bude někomu hodit.
function we_gateway_disable_shipping( $available_gateways ) {
global $woocommerce;
if ( !is_admin() ) {
$chosen_methods = WC()->session->get( ‚chosen_shipping_methods‘ );
$chosen_shipping = $chosen_methods[0];
if ( isset( $available_gateways[‚cod‘] ) && 0 === strpos( $chosen_shipping, ‚local_pickup:2‘ ) ) {
unset( $available_gateways[‚cod‘] );
}
if ( isset( $available_gateways[‚bacs‘] ) && 0 === strpos( $chosen_shipping, ‚local_pickup:2‘ ) ) {
unset( $available_gateways[‚bacs‘] );
}
}
return $available_gateways;
}
add_filter( ‚woocommerce_available_payment_gateways‘, ‚we_gateway_disable_shipping‘ );