2017-05-01 118 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

相关问题