WooCommerce Checkout:根据支付选项制作(非)必填字段

WooCommerce Checkout: make fields (not) required depending on payment option

要求:

根据所选的支付选项,某些结帐字段不应是必需的。

我的场景:

它的客户 select “本地取货”他们可以选择 select PayPal、信用卡等并“在取货时付款”。 如果他们在取货时付款,我们不需要他们的付款地址。发票将在取件时处理,结帐实际上是预订。

我自己找到了解决办法,分享这个问题作为参考。 在答案中找到解决方案。

这是我的解决方案:

add_action( 'woocommerce_checkout_process', 'gw_deactivate_some_fields_on_condition');

function gw_deactivate_some_fields_on_condition() {
  add_filter( 'woocommerce_checkout_fields' , 'gw_some_billing_fields_not_required_for_cash_on_delivery_payment_method' );
}

function gw_some_billing_fields_not_required_for_cash_on_delivery_payment_method( $fields ) {
  $chosen_payment_method = WC()->session->get('chosen_payment_method');

  if ( 0 === strpos( $chosen_payment_method, 'cash_on_delivery' ) ) {
    $fields['billing']['billing_address_1']['required'] = false;
    $fields['billing']['billing_address_2']['required'] = false;
    $fields['billing']['billing_city']['required'] = false;
    $fields['billing']['billing_postcode']['required'] = false;
    $fields['billing']['billing_country']['required'] = false;
    $fields['billing']['billing_state']['required'] = false;
  } 

  return $fields;
}

add_action( 'woocommerce_after_checkout_form', 'gw_disable_payment_fields_if_local_payment' );
function gw_disable_payment_fields_if_local_payment( $available_gateways ) {
  ?>
    <script type="text/javascript">
      jQuery( document ).ready(function() {
        show_hide_payment_options();
      });

      jQuery('form.checkout').on('change','input[name^="payment_method"]',function() {
        show_hide_payment_options();
      });

      jQuery('form.checkout').on('change','input[name^="shipping_method"]',function() {
        show_hide_payment_options();
      });

      function show_hide_payment_options() {
        var val = jQuery('input[name^="payment_method"]:checked').val(); // If it changed, then it must be the radio options so check the one that's selected
        var fields_selector = '#billing_country_field, #billing_address_1_field, #billing_address_2_field, #billing_city_field, #billing_postcode_field';
        if (val.match("^cash_on_delivery")) {
            jQuery( fields_selector ).fadeOut();
        } else {
          jQuery( fields_selector ).fadeIn();
        }
      }
    </script>
  <?php
}

要处理运输字段,请参阅此 post: https://www.businessbloomer.com/woocommerce-hide-shipping-local-pickup-selected/

这对我的代码也有很大的启发。