必需的自定义WooCommerce结帐字段不验证输入值
问题描述:
我在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选项和价格计算公式
答
正如你在woocommerce_before_checkout_form
钩阅读,这在结算表单之前(所以外结帐表单) 。 出于这个原因,这个自定义字段不能在这个钩子工作。
,您可以改用woocommerce_checkout_update_order_meta
行动挂钩,在你的代码做一些小的变化,因为在它没有可用$结帐的说法。
这将 “在页面顶部,计费领域之前” 显示字段 ...
所以你完整的代码应该是现在:
/**
* 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+
答
你试试这个代码。测试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;
}
谢谢!这回答了这个问题,并且运作良好 – buzibuzi