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

[php]
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;
}
[/php]

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;
}

Zostaw komentarz

Przewijanie do góry