WooCommerce自定义字段不保存到数据库...有时
我已经在Woo-commerce网站上订购了大约10,000个订单。约0.4%未保存所需的自定义字段“custom_location”。我不知道这是如何可能的,无法找到重现的方式。WooCommerce自定义字段不保存到数据库...有时
此外,我使用该字段的选定值将辅助值保存到数据库。即使数据库中的'custom_location'为空,辅助值也会正确保存。显然,$ _POST ['custom_location']包含有效的数据,但它没有保存...为什么?
// Here I create the custom select field
add_filter('woocommerce_checkout_fields' , 'custom_override_checkout_fields');
function custom_override_checkout_fields($fields) {
// <select> options
$args = array('post_type' => 'MY_CUSTOM_POST_TYPE',
'posts_per_page' => -1,
'order' => 'ASC',
'post_status' => 'publish',
'suppress_filters' => true);
$locations = get_posts($args);
$ops = array('default' => 'Select a location');
foreach($locations as $l) {
$ops[$l->ID] = __($l->post_title, 'woocommerce');
}
// Add 'custom_location' field to 'shipping'
$fields['shipping'] = array('custom_location' => array(
'label' => __('Location', 'woocommerce'),
'placeholder' => _x('', 'empty', 'woocommerce'),
'required' => true,
'clear' => false,
'type' => 'select',
'options' => $ops
))
+ $fields['shipping'];
return $fields;
}
// Save related data
add_action('woocommerce_checkout_update_order_meta', 'save_extra_data');
function save_extra_data($order_id) {
$loc = $_POST['custom_location'];
// This was saved correctly to DB even when 'custom_location' is null in DB!
$meta = get_post_meta($loc, 'extra-shipping-data', true);
update_post_meta($order_id, '_shipping_extra', $meta);
}
如果客户账单和送货地址相同,您的位置将被保存为空。在您的代码中,缺少locations
的声明。只需稍作更改,您就可以最大限度地减少代码和工作量。确保你用你的选择替换ops
。
add_filter('woocommerce_checkout_fields' , 'custom_override_checkout_fields');
function custom_override_checkout_fields($fields) {
// <select> options
$ops = array('default' => 'Select a location', 'location1' => 'Location 1');
// Add 'custom_location' field to 'shipping'
$fields['shipping'] = array('shipping_custom_location' => array(
'label' => __('Location', 'woocommerce'),
'placeholder' => _x('', 'empty', 'woocommerce'),
'required' => true,
'clear' => false,
'type' => 'select',
'options' => $ops
))
+ $fields['shipping'];
return $fields;
}
在这个应用程序中,送货地址总是与开票不同,所以我们不允许它是可选的。我在前一段时间添加了位置声明,对不起,你错过了。 (顺便说一下,$ ops确实需要由管理员编辑,这就是get_posts代码存在的原因) –
您是否尝试将id从'custom_location'更改为'shipping_custom_location'?它应该工作。 – LearnWoo
其中定义了您在foreach循环中使用的$位置变量? – LoicTheAztec
我将$ locations var添加到代码中。这是我通过“get_posts()”获得的一系列帖子 –