2017-05-01 114 views
1

我在Storefront子主題functions.php文件中添加WooCommerce自定義結算字段。
他們有一個「必需的」屬性。
目的是讓這些字段出現在頁面的頂部,計費領域之前。必需的自定義WooCommerce結帳字段不驗證輸入值

點擊提交按鈕進行支付的時候,我得到所需的自定義字段驗證錯誤(「請填寫您的姓名」),並不能與支付繼續,即使有有效數據填充字段。

任何線索如何解決此問題或者從哪裏開始調試?

這裏是functions.php代碼:

add_action('woocommerce_before_checkout_form', 'my_custom_checkout_fields'); 

function my_custom_checkout_fields($checkout) { 

    echo '<div id="my_custom_checkout_field" class="col4-set"><h2>' . __('name') . '</h2>'; 

    woocommerce_form_field('developer_name', array(
     'type'   => 'text', 
     'class'   => array('developer_name-class form-row form-row-first'), 
     'label'   => __('name'), 
     'placeholder' => __('fill in your name'), 
     'required'  => true, 
     ), $checkout->get_value('developer_name'));        

    echo '</div>'; 

} 

/** 
* Process the checkout 
*/ 
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process'); 

function my_custom_checkout_field_process() { 
    // Check if set, if its not set add an error. 
if (! $_POST['developer_name']) 
     wc_add_notice(__('please fill in your name'), 'error'); 
} 

我嘗試以下,但沒有他們的幫助:

1.變化:

if (! $_POST['developer_name']) 

if (empty($_POST['developer_name'])) 

2.改變觸發來自:

add_action('woocommerce_before_checkout_form', 'my_custom_checkout_fields'); 

add_action('woocommerce_after_checkout_form', 'my_custom_checkout_fields'); 

3.更新到最新的3.0.5 Woocomerce版本

我運行Wordpress 4.7。 4個
其他相關活動插件:
統一CPO - WooCommerce選項和價格計算公式

回答

3

正如你在woocommerce_before_checkout_form鉤閱讀,這在結算表單之前(所以外結帳表單) 。 出於這個原因,這個自定義字段不能在這個鉤子工作。

,您可以改用woocommerce_checkout_update_order_meta行動掛鉤,在你的代碼做一些小的變化,因爲在它沒有可用$結帳的說法。

這將 「在頁面頂部,計費領域之前」 顯示字段 ...

enter image description here

所以你完整的代碼應該是現在:

/** 
* Add the field to the checkout 
*/ 
add_action('woocommerce_checkout_before_customer_details', 'my_custom_checkout_fields'); 

function my_custom_checkout_fields() { 

    echo '<div id="my_custom_checkout_field" class="col4-set"><h2>' . __('name') . '</h2>'; 

    woocommerce_form_field('developer_name', array(
     'type'   => 'text', 
     'class'   => array('developer_name-class form-row form-row-first'), 
     'label'   => __('name'), 
     'placeholder' => __('fill in your name'), 
     'required'  => true, 
    ), WC()->checkout->get_value('developer_name')); 

    echo '</div>'; 

} 

/** 
* Process the checkout 
*/ 
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process'); 

function my_custom_checkout_field_process() { 
    // Check if set, if its not set add an error. 
    if (! $_POST['developer_name']) 
     wc_add_notice(__('Please fill in your name.'), 'error'); 
} 


// Update the order meta with field value 
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta', 10, 1); 
function my_custom_checkout_field_update_order_meta($order_id) { 
    if (! empty($_POST['developer_name'])) { 
     update_post_meta($order_id, 'Developer name', sanitize_text_field($_POST['developer_name'])); 
    } 
} 

// Display the custom-field in orders view 
add_action('woocommerce_order_details_after_customer_details', 'display_my_custom_field_in_orde_details', 10, 1); 
function display_my_custom_field_in_orde_details($order) { 

    $developer_name = get_post_meta($order->get_id(), 'Developer name', true); 

    if (! empty($developer_name)): 
    ?> 
     <table class="woocommerce-table woocommerce-table--customer-details shop_table customer_details"> 
      <tbody><tr> 
       <th>Developer name:</th> 
       <td><?php echo $developer_name; ?></td> 
      </tr></tbody> 
     </table> 
    <?php 
    endif; 
} 

此代碼在你的活動子主題(或主題)的function.php文件中,或者也可以在任何pl ugin文件。

此代碼已經過測試,適用於WooCommerce版本3.0+

+1

謝謝!這回答了這個問題,並且運作良好 – buzibuzi

1

你試試這個代碼。測試OK

add_action('woocommerce_billing_fields', 'my_custom_checkout_fields'); 

function my_custom_checkout_fields($fields) { 

    $fields['billing_developer_name'] = array(
    'label'  => __('Developer name', 'woocommerce'),    
    'placeholder' => _x('Developer name', 'placeholder', 'woocommerce'), 
    'required' => TRUE,    
    'clear'  => false,    
    'type'  => 'text',    
    'class'  => array('my-css')  
    ); 

return $fields; 

} 

您可以在這個片段中安排它

add_filter("woocommerce_checkout_fields", "order_fields"); 

function order_fields($fields) { 

    $order = array(
     "billing_developer_name", 
     "billing_first_name", 
     "billing_last_name", 
     "billing_company", 
     "billing_address_1", 
     "billing_address_2", 
     "billing_postcode", 
     "billing_country", 
     "billing_email", 
     "billing_phone" 

    ); 
    foreach($order as $field) 
    { 
     $ordered_fields[$field] = $fields["billing"][$field]; 
    } 

    $fields["billing"] = $ordered_fields; 
    return $fields; 

} 

screenshot

+0

我忘了說清楚。我的目標是讓這些字段位於結算信息之前。這意味着在頁面的頂部。您的解決方案很好,但自定義字段顯示在結算字段下方。 – buzibuzi

+0

@buzibuzi:更新 –

+0

它的作品,這些字段集可以有一個標題上方和下方?用我的結帳代碼,我在他們上面印有H2標題。 「帳單詳細信息」標題出現在它們的下方,因此在這些字段之間有某種分隔符。 – buzibuzi

相關問題