我通过更改模板 /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
,如果在 时字段为空,验证也不会发生。 >下订单
按钮被按下。理想情况下,订单不应完成,并且应生成错误消息。我已经在 functions.php
中添加了以下代码来强制验证输入字段,但它没有做任何事情。代码在这里:
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" );
}
}
}
所以,这就是我正在寻找的:
- 任何人都可以帮我强制验证两个输入字段吗 添加了吗?
- 验证后,我还想在新订单电子邮件中添加这两个字段,并在 Wordpress 仪表板中添加订单详细信息。
如果您想知道为什么我不首先使用 woocommerce 结账字段 Hook 来添加输入字段...我没有将字段添加到结账表单中,因此 Hook 没有任何帮助。这些字段添加到运输方式部分。另一个原因是,我想在用户每次切换运输方式时更新 required
属性。使用 Jquery 更改 required
属性无论出于何种原因都不起作用,相信我,我尝试了两天。不管怎样,这部分已经开始工作了。唯一的问题是验证字段并将其添加到订单电子邮件和订单详细信息中。我环顾四周,得到的最接近的帮助是这篇文章 where LoicTheAztec gave a detailed solution
最佳答案
这可以无需 jQuery 使用特殊的钩子(Hook)来完成,该钩子(Hook)将在legacy_local_pickup
运输方法下方显示两个“承运人”自定义字段已选择。如果客户更改为不同的运输方式,这些字段将被删除。
因此您应该需要先删除自定义模板和所有相关代码。
现在验证工作正常,当填写“承运商”自定义字段时,它们将保存在订单元数据中。
// 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 '<div class="custom-carrier">';
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 '</div>';
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'] ) );
}
此代码位于事件子主题(或主题)的functions.php 文件中。已测试且有效。
不显示:
选择“本地取件”时显示:
关于php - Woocommerce 结帐页面中的承运商自定义字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49159445/