在 WooCommerce 中禁用基于自定义运输方式的付款方式

Disabling payment methods based on custom shipping methods in WooCommerce

在 WooCommerce 商店中,我有 2 种基于包裹储物柜的送货方式。第一种是预付,第二种是货到付款。

想法是:

下面是我的代码。在这两种情况下申请后,我只有提前付款。怎么了?

add_filter( 'woocommerce_available_payment_gateways', 'gateway_disable_shipping_meth' );
  
function gateway_disable_shipping_meth( $available_gateways ) {
   if ( ! is_admin() ) {
      $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );      
      $chosen_shipping = $chosen_methods[0];
      
       if ( isset( $available_gateways['bacs'] ) && 0 === strpos( $chosen_shipping, 'easypack_parcel_machines' ) ) {
         unset( $available_gateways['cod'] );
      }
      elseif ( isset( $available_gateways['cod'] ) && 0 === strpos( $chosen_shipping, 'easypack_parcel_machines_cod' ) ) {
         unset( $available_gateways['bacs'] );
      }
   }  
   return $available_gateways;
}

由于两种运输方式都以相同的 slug 开头,您只需要在 if / elseif 语句中将它们反转如下 (还有一些其他错误):

add_filter( 'woocommerce_available_payment_gateways', 'gateway_disable_shipping_meth' );
  
function gateway_disable_shipping_meth( $available_gateways ) {
    if ( ! is_admin() ) {
        $chosen_shipping = WC()->session->get( 'chosen_shipping_methods' )[0];
      
        if ( isset( $available_gateways['bacs'] ) && 0 === strpos( $chosen_shipping, 'easypack_parcel_machines_cod' ) ) {
            unset( $available_gateways['bacs'] );
        }
        elseif ( isset( $available_gateways['cod'] ) && 0 === strpos( $chosen_shipping, 'easypack_parcel_machines' ) ) {
            unset( $available_gateways['cod'] );
        }
    }  
    return $available_gateways;
}

或者也这样:

add_filter( 'woocommerce_available_payment_gateways', 'gateway_disable_shipping_meth' );
  
function gateway_disable_shipping_meth( $available_gateways ) {
    if ( ! is_admin() ) {
        $chosen_shipping = WC()->session->get( 'chosen_shipping_methods' )[0];
        
        if ( 0 === strpos( $chosen_shipping, 'easypack_parcel_machines' ) ) {
            if ( false !== strpos( $chosen_shipping, 'cod' ) && isset( $available_gateways['bacs'] ) ) {
                unset( $available_gateways['bacs'] );
            } elseif ( isset( $available_gateways['cod'] ) ) {
                unset( $available_gateways['cod'] );
            }
        }
    }  
    return $available_gateways;
}

应该可以。