2017-02-15 5 views
0

У меня было около 10 000 заказов на веб-сайте Woo-commerce. Около 0,4% не сохранили требуемое настраиваемое поле «custom_location». Я понятия не имею, как это возможно и не может найти способ воспроизвести.Пользовательское поле WooCommerce не сохраняется в DB ... иногда

Кроме того, я использую выбранное значение поля для сохранения вторичного значения в БД. Вторичное значение сохраняется правильно, даже когда «custom_location» имеет значение NULL в БД. Очевидно, что $ _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); 
} 
+0

Где определена ваша переменная '$ locations', используемая в цикле foreach? – LoicTheAztec

+0

Я добавил $ loc var в код. Это массив сообщений, которые я получаю через «get_posts()» –

ответ

0

Ваше местонахождение будет сохранено null, если адрес выставления счета и доставки клиента совпадают. В вашем коде отсутствует декларация для 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; 
} 
+0

В этом почтовом адресе приложения всегда отличается от биллинга, поэтому мы не позволяем ему быть необязательным. Недавно я добавил объявление о местоположении, извините, вы пропустили это. (btw, $ ops должен быть доступен для редактирования админами, поэтому код get_posts есть) –

+0

Вы пытались сменить идентификатор с 'custom_location' на' shipping_custom_location'? Он должен работать. – LearnWoo