php - PHP - 即使我填写了必填字段,也会出现验证消息
问题描述
我在我的测试网站上看到一个奇怪的问题。该网站可以在这里查看,它是一个测试网站,因此无需付款(需要输入无付款详细信息)。
https://puffpastrydelights.com/order-online/
因此,我要做的是确保用户在选择送货时提供了送货日期或时间,或者如果他们选择取货,则确保他们提供了取货日期和时间。
因此,对于复制,如果您订购食品,在购物车中选择取货,然后在结帐页面填写所有详细信息,您的结帐将处理,一切都很好。
现在再试一次,但是这次在结账之前在购物车页面中选择交货,你会看到它会显示一个验证错误,说明提供交货日期和时间,即使你有。这是我不确定的,在我的代码中看不到是什么导致了这个问题:
// Hide Local Pickup shipping method
add_filter( 'woocommerce_checkout_fields', 'hide_local_pickup_method');
function hide_local_pickup_method( $fields_pickup) {
// change below for the method
$shipping_method_pickup ='local_pickup:2';
// change below for the list of fields. Add (or delete) the field name you want (or don’t want) to use
$hide_fields_pickup = array( 'billing_company', 'billing_state', 'billing_company');
$shipping_fields_pickup = array( 'shipping_first_name', 'shipping_last_name', 'shipping_company', 'shipping_address_1', 'shipping_address_2', 'shipping_city', 'shipping_postcode');
$hide_pickup_date_time = array( 'pickup_date', 'pickup_time');
$hide_delivery_date_time = array( 'delivery_date', 'delivery_time');
$chosen_methods_pickup = WC()->session->get( 'chosen_shipping_methods' );
$chosen_shipping_pickup = $chosen_methods_pickup[0];
foreach($hide_fields_pickup as $field_pickup ) {
if ($chosen_shipping_pickup == $shipping_method_pickup) {
$fields_pickup['billing'][$field_pickup]['required'] = false;
$fields_pickup['billing'][$field_pickup]['class'][] = 'hide_pickup';
}
$fields_pickup['billing'][$field_pickup]['class'][] = 'billing-dynamic_pickup';
}
foreach($shipping_fields_pickup as $shipping_field ) {
if ($chosen_shipping_pickup == $shipping_method_pickup) {
$fields_pickup['shipping'][$shipping_field]['required'] = false;
}
}
foreach($hide_pickup_date_time as $pickup_date_time ) {
if ($chosen_shipping_pickup != $shipping_method_pickup) {
$fields_pickup['order'][$pickup_date_time]['required'] = false;
}
}
foreach($hide_delivery_date_time as $delivery_date_time ) {
if ($chosen_shipping_pickup != $shipping_method_pickup) {
$fields_pickup['order'][$delivery_date_time]['required'] = false;
}
}
return $fields_pickup;
}
/**
* Process the checkout
*/
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
$shipping_method_pickup ='local_pickup:2';
$chosen_methods_pickup = WC()->session->get( 'chosen_shipping_methods' );
$chosen_shipping_pickup = $chosen_methods_pickup[0];
// Check if set, if its not set add an error.
if ($chosen_shipping_pickup == $shipping_method_pickup) {
if ( ! $_POST['pickup_date'] ){
wc_add_notice( __( 'Please provide a Pickup Date.' ), 'error' );
}
if ( ! $_POST['pickup_time'] ){
wc_add_notice( __( 'Please provide a Pickup Time.' ), 'error' );
}
} else {
if ( ! $_POST['delivery_date'] ){
wc_add_notice( __( 'Please provide a Delivery Date.' ), 'error' );
}
if ( ! $_POST['delivery_time'] ){
wc_add_notice( __( 'Please provide a Delivery Time.' ), 'error' );
}
}
}
这些字段是自定义字段,设置如下:
add_action('woocommerce_before_order_notes', 'custom_checkout_field');
function custom_checkout_field($checkout)
{
echo '<div id="custom_checkout_field"><h3>' . __('Pickup/Delivery') . '</h3>';
woocommerce_form_field(
'delivery_date',
array(
'type' => 'date',
'required' => 'true',
'class' => array(
'delivery-date-class form-row-wide'
),
'label' => __('Delivery Date'),
),
$checkout->get_value('delivery_date')
);
woocommerce_form_field(
'delivery_time',
array(
'type' => 'time',
'required' => 'true',
'class' => array(
'delivery-time-class form-row-wide'
),
'label' => __('Delivery Time'),
),
$checkout->get_value('delivery_time')
);
woocommerce_form_field(
'pickup_date',
array(
'type' => 'date',
'required' => 'true',
'class' => array(
'pickup-date-class form-row-wide'
),
'label' => __('Pickup Date'),
),
$checkout->get_value('pickup_date')
);
woocommerce_form_field(
'pickup_time',
array(
'type' => 'time',
'required' => 'true',
'class' => array(
'pickup-time-class form-row-wide'
),
'label' => __('Pickup Time'),
),
$checkout->get_value('pickup_time')
);
echo '</div>';
}
解决方案
您的代码是正确的,没有错误。
问题是结帐页面上有两个具有相同 id(和名称)的 HTML 元素。
这些字段是:
delivery_date
有一个日期输入字段和一个带有此 ID(和名称)的文本输入字段delivery_time
有一个时间输入字段和一个带有此 ID(和名称)的文本输入字段pickup_date
有一个日期输入字段和一个带有此 ID(和名称)的文本输入字段pickup_time
有一个时间输入字段和一个带有此 ID(和名称)的文本输入字段
从这个屏幕截图中可以看出(文本输入字段被隐藏):
尝试删除文本输入字段,或者,如果需要,将 id 属性值更改为在页面上是唯一的。
在您发布的代码中,没有对文本输入字段的引用,很可能它们在您的functions.php
.
推荐阅读
- next.js - Next.js 中的 openGraph 和 next-seo
- python - 读取 GCS blob,其中文件名来自 apache Beam 中的先前 p 集合
- elm - 从两个 posix 时间戳在 Elm 中创建倒计时
- excel - 使用 VBA 创建图表,然后使其成为活动图表
- python - 如何获取歌词歌曲中最常用的 50 个单词(Python)
- flutter - 如果应用程序未启动,Flutter Firebase 推送通知无法获取数据
- c# - 如何在循环中保存 k 的每个值?
- xaml - xamarin forms - 将文本绑定到 xaml 中的标签 - 我可以剪掉文本的结尾吗?
- nginx - Nginx - 拒绝访问 IP 地址(HTTPS 端口 443)
- jquery - 如何将 jQuery 验证集成到多步骤表单中