PHP - 即使我填写了必填字段,也会出现验证消息

时间:2021-04-17 18:39:26

标签: php wordpress woocommerce

我在我的测试网站上看到一个奇怪的问题。可以在此处查看该网站,它是一个测试站点,因此无需付款(无需输入付款详细信息)。

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>';
}

1 个答案:

答案 0 :(得分:1)

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

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

字段是:

  • delivery_date 有一个 date 输入字段和一个带有此 ID(和名称)的 text 输入字段
  • delivery_time 有一个 time 输入字段和一个带有此 ID(和名称)的 text 输入字段
  • pickup_date 有一个 date 输入字段和一个带有此 ID(和名称)的 text 输入字段
  • pickup_time 有一个 time 输入字段和一个带有此 ID(和名称)的 text 输入字段

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

enter image description here

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

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