Ukrywanie płatności ze względu na wysyłkę
Taka oto sytuacja w woocommerce. Bierzemy prosty schemat:
Wysyłki:
– kurier
– kurier za pobraniem
Płatności:
– przelew
– gotówka
Logicznym jest, że jeśli klient wybierze kuriera to musi zapłacić przelewem a jeśli wybierze wysyłkę za pobraniem to musi zapłacić gotówką. Niestety domyślnie cały czas ma wszystkie opcje dostępne i robi się małe zamieszanie. No to bierzemy na warsztat ukrywanie tego co zbędne. Wykorzystamy do tego filtr woocommerce_available_payment_gateways
if ( ! is_admin() ) add_filter( 'woocommerce_available_payment_gateways', 'my_custom_available_payment_gateways' ); //w adminie nie dajemy bo konflikt function my_custom_available_payment_gateways( $gateways ) { $chosen_shipping_rates = WC()->session->get( 'chosen_shipping_methods' ); if ( !empty($chosen_shipping_rates) && in_array( 'flat_rate:1', $chosen_shipping_rates )) : unset( $gateways['cod'] ); //jeśli wybrana dostawa kurierem to wyrzucamy z płatności cod czyli cash on delivery endif; if (!empty($chosen_shipping_rates) && in_array( 'flat_rate:2', $chosen_shipping_rates )) : unset( $gateways['bacs'] ); //jeśli dostawa za pobraniem to wywal z płatności przelew - bacs czyli bank transfer endif; return $gateways; }
Ta da da! Gotowe. Cała filozofia polega jedynie na tym by sobie określić jakie kody mają nasze wysyłki zdefiniowane w woocommerce. Najprościej możemy to zrobić na zapleczu: Woocommerce->Ustawienia zakładka Wysyłka wchodzimy w zarządzanie metodami wysyłki i po najechaniu na odpowiednią wysyłkę pokazuje nam się w pasku link page=wc-settings&tab=shipping&instance_id=numer. Jeśli nasze wysyłki ustawiliśmy jako płaskie stawki to właśnie ten numer podajemy w naszym kodzie: flat_rate:numer.
Ponieważ powyższy kod ma już sporo lat a wiem, że nie tylko ja go stosuję, to mała poprawka poprawiająca błędy.
if ( !is_admin() ) add_filter( 'woocommerce_available_payment_gateways', 'my_custom_available_payment_gateways' );
//w adminie nie dajemy bo konflikt
function my_custom_available_payment_gateways( $gateways ) {
$session = WC()->session;
//musimy wywołać sesję bo inaczej w kolejnej linijce wyskoczy błąd Call To A Member Function Get() On Null
if ( $session ) {
$chosen_shipping_rates = WC()->session->get( 'chosen_shipping_methods', array() );
//dodane array() bo inaczej w kolejnej linijce będzie błąd
//PHP Warning: in_array() expects parameter 2 to be array, null given
if ( in_array( 'flat_rate:5', $chosen_shipping_rates )) :
unset( $gateways['cod'] ); //jeśli wybrana dostawa kurierem to wyrzucamy z płatności cod czyli cash on delivery
endif;
if ( in_array( 'flat_rate:6', $chosen_shipping_rates )) {
unset( $gateways['bacs'] ); //jeśli dostawa za pobraniem to wywal z płatności przelew - bacs czyli bank transfer
unset( $gateways['przelewy24'] );
}
}
return $gateways;
}