首页 > 解决方案 > 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>';
}

标签: phpwordpresswoocommerce

解决方案


您的代码是正确的,没有错误。

问题是结帐页面上有两个具有相同 id(和名称)的 HTML 元素。

这些字段是:

  • delivery_date有一个日期输入字段和一个带有此 ID(和名称)的文本输入字段
  • delivery_time有一个时间输入字段和一个带有此 ID(和名称)的文本输入字段
  • pickup_date有一个日期输入字段和一个带有此 ID(和名称)的文本输入字段
  • pickup_time有一个时间输入字段和一个带有此 ID(和名称)的文本输入字段

从这个屏幕截图中可以看出(文本输入字段被隐藏)

在此处输入图像描述

尝试删除文本输入字段,或者,如果需要,将 id 属性值更改为在页面上是唯一的

在您发布的代码中,没有对文本输入字段的引用,很可能它们在您的functions.php.


推荐阅读