Jak ve WooCommerce deaktivovat určitý způsob platby pro vybranou dopravu

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 &section=idplatebnimetody.

V našem příkladě u Bankovního převodu je zde &section=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.

ID dopravy

ID dopravy

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.

O autorovi

Tomáš Cirkl

WordPress specialista · 12 let praxe · 300+ webů ve správě

Baví mě Internet a zvláště pak redakční systém WordPress. Jsem pravidelným účastníkem a přednášejícím na WordCamp Praha a WordPress konferencích.

18 Komentáře

  1. Admiva

    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ří!

    Odpovědět
    • Tomáš Cirkl

      Díky, opraveno.

      Odpovědět
    • Milan

      Správně by mělo být:
      $chosen_shipping_rates = WC()->session->get( ‚chosen_shipping_methods‘ );

      Odpovědět
  2. Robin

    Ahoj, lze to takto také nastavit pro více než jednu dopravu?

    Odpovědět
  3. Kristýna

    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í?

    Odpovědět
  4. Pavel

    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.

    Odpovědět
  5. Jirka

    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

    Odpovědět
  6. Petan

    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

    Odpovědět
  7. Tomáš

    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áš.

    Odpovědět
    • Tomáš Cirkl

      Zdravím,
      dotaz moc nechápu. Posloupnost je tam produkt -> košík -> pokladna, přičemž dopravu si vybírá v posledním kroku.

      Odpovědět
  8. Jan

    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í?

    Odpovědět
    • Jerry

      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

      Odpovědět
  9. jejda

    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‘ );

    Odpovědět
  10. Jakub

    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.

    Odpovědět
  11. karel

    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‘ );

    Odpovědět

Odeslat Komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Pojďme se seznámit

30 minut video callu, podívám se na tvůj web a řeknu, co by se dalo zlepšit. Nic neslibuju, ale obvykle odcházíš se seznamem priorit.