Woocommerce结帐页面中的运输承运商自定义字段validation

我通过更改模板/genesis-sample/woocommerce/checkout/review-order.php在发货方法部分添加了两个自定义输入字段。我还设法有条件地要求它们。 仅当选中特定单选按钮时,输入字段才会出现并成为必需。 我使用jQuery代码使字段显示和消失。 所有这一切都很好。 代码在这里:

 if ( isset($_POST['shipping_method_0_legacy_local_pickup']) && $_POST['shipping_method_0_legacy_local_pickup'] == 1 ) { $cheq = 'true'; } else { $cheq = 'false'; } woocommerce_form_field( 'fieldtester1' , array( 'type' => 'text', 'class' => array('wccs-field-class wccs-form-row-wide blahblah1'), 'label' => 'Enter Your Carrier Name', 'required' => $cheq, 'placeholder' => 'Carrier Name', ), $checkout->get_value( 'fieldtester1' )); woocommerce_form_field( 'fieldtester2' , array( 'type' => 'text', 'class' => array('wccs-field-class wccs-form-row-wide blahblah2'), 'label' => 'Enter Your Carrier Account #', 'required' => $cheq, 'placeholder' => 'Carrier Number', ), $checkout->get_value( 'fieldtester2' )); 

但是问题就在于,即使两个字段的required属性设置为true ,如果按下“下Place Order按钮时该字段为空,也不会进行validation。 理想情况下,订单不应该通过,并且应该生成错误消息。 我已经在functions.php添加了以下代码来强制输入字段的validation,但它没有做任何事情。 代码在这里:

 add_action('woocommerce_checkout_process', 'carrier_checkout_process'); function carrier_checkout_process() { if ( isset($_POST['shipping_method_0_legacy_local_pickup']) && $_POST['shipping_method_0_legacy_local_pickup'] == 1 ) { if( empty( $_POST['fieldtester1'] ) ) { wc_add_notice( ( "Please don't forget to enter your shipping carrier details." ), "error" ); } } } 

所以,这就是我要找的东西:

  1. 任何人都可以帮助我强制validation我添加的两个输入字段?
  2. validation后,我还想在新订单电子邮件中添加这两个字段,并在Wordpress仪表板中订购详细信息。

如果你想知道为什么我没有使用woocommerce checkout字段钩子来添加输入字段…我没有将字段添加到结帐表单,所以钩子没有任何帮助。 这些字段将添加到送货方法部分。 另一个原因是,我希望每次用户切换发货方法时都更新required属性。 使用Jquery更改required属性无论出于何种原因都不起作用,相信我,我试了两天。 无论如何,那部分已经在运作。 唯一的问题是让字段进行validation并将其添加到订单电子邮件和订单详细信息中。 我到处都看了看,我得到的最接近的帮助就是LoicTheAztec提供详细解决方案的post

这可以在没有jQuery的情况下使用特殊的钩子来完成该钩子会在选择时显示legacy_local_pickup运输方法下面的两个“Carrier”自定义字段。 如果客户更改为其他送货方式,则会删除这些字段。

因此,您需要先删除自定义模板和所有相关代码。

现在validation工作正常,当“Carrier”自定义字段填充时,它们将保存在元数据中。

 // Add custom fields to a specific selected shipping method add_action( 'woocommerce_after_shipping_rate', 'carrier_custom_fields', 20, 2 ); function carrier_custom_fields( $method, $index ) { if( ! is_checkout()) return; // Only on checkout page $customer_carrier_method = 'legacy_local_pickup'; if( $method->id != $customer_carrier_method ) return; // Only display for "local_pickup" $chosen_method_id = WC()->session->chosen_shipping_methods[ $index ]; // If the chosen shipping method is 'legacy_local_pickup' we display if($chosen_method_id == $customer_carrier_method ): echo '
'; woocommerce_form_field( 'carrier_name' , array( 'type' => 'text', 'class' => array('form-row-wide carrier-name'), 'label' => 'Carrier Information:', 'required' => true, 'placeholder' => 'Carrier Name', ), WC()->checkout->get_value( 'carrier_name' )); woocommerce_form_field( 'carrier_number' , array( 'type' => 'text', 'class' => array('form-row-wide carrier-number'), 'required' => true, 'placeholder' => 'Carrier Number', ), WC()->checkout->get_value( 'carrier_number' )); echo '
'; endif; } // Check custom fields validation add_action('woocommerce_checkout_process', 'carrier_checkout_process'); function carrier_checkout_process() { if( isset( $_POST['carrier_name'] ) && empty( $_POST['carrier_name'] ) ) wc_add_notice( ( "Please don't forget to enter the shipping carrier name." ), "error" ); if( isset( $_POST['carrier_number'] ) && empty( $_POST['carrier_number'] ) ) wc_add_notice( ( "Please don't forget to enter the shipping carrier account number." ), "error" ); } // Save custom fields to order meta data add_action( 'woocommerce_checkout_update_order_meta', 'carrier_update_order_meta', 30, 1 ); function carrier_update_order_meta( $order_id ) { if( isset( $_POST['carrier_name'] )) update_post_meta( $order_id, '_carrier_name', sanitize_text_field( $_POST['carrier_name'] ) ); if( isset( $_POST['carrier_number'] )) update_post_meta( $order_id, '_carrier_number', sanitize_text_field( $_POST['carrier_number'] ) ); }

此代码位于活动子主题(或主题)的function.php文件中。 经过测试和工作。

未显示:

在此处输入图像描述

选择“Local Pickup”时显示:

在此处输入图像描述