【问题标题】:WooCommerce custom checkout checkboxes fields validation for one mandatory checkboxWooCommerce 自定义结帐复选框字段验证一个必填复选框
【发布时间】:2021-07-10 11:46:45
【问题描述】:

我有三个自定义结帐字段,人们必须至少检查一个才能通过订单。 这仅适用于 1 个产品。

因此,我遍历购物车项目以检查产品是否在购物车中,然后添加字段。这部分工作正常:

add_action( 'woocommerce_before_order_notes', 'mmm_add_custom_checkout_field' );

function mmm_add_custom_checkout_field( $checkout ) { 
    
       $product_id = 214884;
   $in_cart = false;
  
   foreach( WC()->cart->get_cart() as $cart_item ) {
      $product_in_cart = $cart_item['product_id'];
      if ( $product_in_cart === $product_id ) $in_cart = true;
   }
  
   if ( $in_cart ) {
    echo '<h2>Membership Application</h2>';
    echo '<p>Select all that applies</p>';
   woocommerce_form_field( 'read_wog', array(        
      'type' => 'checkbox',        
      'class' => array( 'form-row-wide no-req' ), 
       'required' => true,
      'label' => 'I accept term 1', 
   ), $checkout->get_value( 'read_wog' ) ); 
        woocommerce_form_field( 'one_on_one', array(        
      'type' => 'checkbox',        
      'class' => array( 'form-row-wide no-req' ),
      'required' => true,
      'label' => 'I accept term 2', 
   ), $checkout->get_value( 'one_on_one' ) ); 
        woocommerce_form_field( 'mm_sn', array(        
      'type' => 'checkbox',
      'required' => true,
      'class' => array( 'form-row-wide no-req' ),        
      'label' => 'I accept term 3).', 
   ), $checkout->get_value( 'mm_sn' ) ); 

      
  
   }

}

该网站使用 Paypal Express 作为支付网关,无论复选框是否验证,验证都允许人们通过 Paypal。默认字段的验证工作正常。但是手动刷新页面时会添加错误提示!

验证码如下:

add_action( 'woocommerce_checkout_process', 'mmm_validate_new_checkout_field' );
  
function mmm_validate_new_checkout_field() {    
   $product_id = 214884;
   $in_cart = false;
  
   foreach( WC()->cart->get_cart() as $cart_item ) {
      $product_in_cart = $cart_item['product_id'];
      if ( $product_in_cart === $product_id ) $in_cart = true;
   }
     if( $in_cart && !isset($_POST['mm_sn']) && !isset($_POST['one_on_one']) && !isset($_POST['read_wog']) ) {
         wc_add_notice( 'You can only have a full membership if you accept at least 1 term', 'error' );
     }
}

知道如何让它工作吗?

【问题讨论】:

    标签: php wordpress validation woocommerce paypal-subscriptions


    【解决方案1】:

    “该网站使用 PayPal Express 作为支付网关”

    这不够具体,无法提供建议。如果正在使用 PayPal JS SDK 按钮(在 WooCommerce PayPal 插件配置中称为智能按钮),那么您可以添加一个 onClick 处理程序,如下所述:https://developer.paypal.com/docs/business/javascript-sdk/javascript-sdk-reference/#oninitonclick

    您需要编辑 WooCommerce 插件如何调用 paypal.Buttons 的输出 JS 以包含这样的功能。

    【讨论】:

    • 谢谢。我怎样才能使它更具体?这是官方的 PayPal 结帐扩展程序。我原以为如果标准验证有效,它们也可以通过标准 woocommerce 操作进行扩展以进行自定义验证。
    • 只有 onClick 中的 JS 会影响 PayPal 按钮呈现后发生的情况
    • 相关部分:github.com/woocommerce/… -- 这是一个 JS 文件,没有 woocommerce action php
    • 谢谢!那我试试用JS验证一下。
    【解决方案2】:

    如果在结帐时至少有一个复选框未被选中,则以下重新访问的代码将引发错误验证消息:

    // Custom function that check if a specific product is in cart
    function is_product_in_cart( $product_id ) {
        foreach( WC()->cart->get_cart() as $item ) {
            if ( in_array( $product_id, array($item['product_id'], $item['variation_id']) ) ) {
                return true;
            }
        }
        return false;
    }
    
    // Add Custom checkout checkboxes fields
    add_action( 'woocommerce_before_order_notes', 'mmm_add_custom_checkout_field' );
    function mmm_add_custom_checkout_field( $checkout ) {
        $targeted_id = 214884;
    
        if ( is_product_in_cart( $targeted_id ) ) {
            echo '<h2>Membership Application</h2>
                <p>Select all that applies</p>';
            
            woocommerce_form_field( 'read_wog', array(
                'type' => 'checkbox',
                'class' => array( 'form-row-wide no-req' ),
                'required' => true,
                'label' => 'I accept term 1',
            ), $checkout->get_value( 'read_wog' ) );
            
            woocommerce_form_field( 'one_on_one', array(
                'type' => 'checkbox',
                'class' => array( 'form-row-wide no-req' ),
                'required' => true,
                'label' => 'I accept term 2',
            ), $checkout->get_value( 'one_on_one' ) );
            
            woocommerce_form_field( 'mm_sn', array(
                'type' => 'checkbox',
                'required' => true,
                'class' => array( 'form-row-wide no-req' ),
                'label' => 'I accept term 3).',
            ), $checkout->get_value( 'mm_sn' ) );
        }
    }
    
    // Custom checkout checkboxes fields validation
    add_action( 'woocommerce_checkout_process', 'mmm_validate_new_checkout_field' );
    function mmm_validate_new_checkout_field() {
        $targeted_id = 214884;
    
        if ( is_product_in_cart( $targeted_id ) && ! ( isset($_POST['read_wog']) || isset($_POST['one_on_one']) || isset($_POST['mm_sn']) ) ) {
            wc_add_notice( 'You can only have a full membership if you accept at least 1 term', 'error' );
        }
    }
    

    代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    【讨论】:

    • 谢谢。不幸的是,这仍然没有在我的设置中使用官方 PayPal Checkout 插件进行验证。它通过 Paypal 并且仅在页面刷新后添加通知。你介意告诉我你用的是什么支付网关吗? woocommerce.com/products/woocommerce-gateway-paypal-checkout
    • 是的。我也有同样的印象。并且它确实适用于不同的支付方式,如 Stripe。但是我刚刚尝试在默认主题上没有任何其他插件,但它不适用于 Paypal 结帐
    • @lastnoob 显然 paypal-checkout 使用 javascript 进行验证,不处理自定义结帐字段验证。我没有足够的与 paypal-checkout 相关的知识来使用它。
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 2020-10-22
    • 2020-11-23
    • 2013-03-25
    • 2018-10-24
    • 2021-04-03
    • 2015-04-20
    • 2017-03-21
    相关资源
    最近更新 更多