• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Автоматическое подставленные индекса в billing_postcode

Tavlar

Новичок
Здравствуйте
Хочу на странице оформления заказа уйти от введения индекса для расчета доставки. Задумка такая, пользователь выбирает улицу из раскрывающегося списка и на основании этого выбора billing_postcode должно присвоиться значение индекса улицы. Магазин работает в одном городе и стоимость доставки рассчитывается по улицам. Искал готовые решения, но ничего не нашел. Хотя, думаю, многие хотели бы убрать заполнение индекса для облегчения процесса оформления заказа.
В functions.php добавил следующий код. Подскажите, пожалуйста, как billing_postcode присвоить значение улицы, которую выбрал покупатель? Т.е. покупатель выбрал, например, Ленина и billing_postcode автоматически стал 452000 и доставка рассчиталась для этого индекса
Код:
// Добавляем новые поля
// Добавляем поля
add_action( 'woocommerce_after_checkout_billing_form', 'wpbl_text_field' );
 
// Сохраняем поля
add_action( 'woocommerce_checkout_update_order_meta', 'wpbl_save_fields' );
 

// // Поле text
function wpbl_text_field( $checkout ){
 
    // Описываем поле name2
    woocommerce_form_field( 'name2', array(
        'type'          => 'text', // Тип поля. Можно любое - text, textarea, select, radio, checkbox, password. В нашем случае это select
        'required'    => false, // этот параметр добавляет звездочку "*" к полю
        'class'         => array('wpbl-field', 'form-row-wide'), // Массив CSS классов
        'label'         => 'Имя получателя', // Заголовок поля
        'label_class'   => 'wpbl-label', // CSS класс заголовка
        ), $checkout->get_value( 'name2' ) );
    // Описываем поле tel2
    woocommerce_form_field( 'tel2', array(
        'type'          => 'text', // Тип поля. Можно любое - text, textarea, select, radio, checkbox, password. В нашем случае это select
        'required'    => false, // этот параметр добавляет звездочку "*" к полю
        'class'         => array('wpbl-field', 'form-row-wide'), // Массив CSS классов
        'label'         => 'Телефон получателя', // Заголовок поля
        'label_class'   => 'wpbl-label', // CSS класс заголовка
        ), $checkout->get_value( 'tel2' ) );
}

// Функция сохранения
function wpbl_save_fields( $order_id ){
 
    // Сохраняем select
    if( !empty( $_POST['name2'] ) ){
        update_post_meta( $order_id, 'name2', sanitize_text_field( $_POST['name2'] ) );
    }
        // Сохраняем select
    if( !empty( $_POST['tel2'] ) ){
        update_post_meta( $order_id, 'tel2', sanitize_text_field( $_POST['tel2'] ) );
    }
            // Сохраняем select
    if( !empty( $_POST['ulizza'] ) ){
        update_post_meta( $order_id, 'ulizza', sanitize_text_field( $_POST['ulizza'] ) );
    }
}
// конец добавленя полей

// добавляем раскрывающийся список городов
add_filter( 'woocommerce_checkout_fields' , 'override_checkout_city_fields' );
function override_checkout_city_fields( $fields ) {

    // Define here in the array your desired cities (Here an example of cities)
    $option_cities = array(
         '' => __( 'Выберите улицу' ),
        'Karachi' => 'Karachi',
        '452000' => 'Ленина',
        'Faisalabad' => 'Faisalabad',
        'Rawalpindi' => 'Rawalpindi',
        'Gujranwala' => 'Gujranwala',
        'Peshawar' => 'Peshawar',
        'Multan' => 'Multan',
        'Hyderabad' => 'Hyderabad',
        'Islamabad' => 'Islamabad'
    );

    $fields['billing']['billing_city']['type'] = 'select';
    $fields['billing']['billing_city']['options'] = $option_cities;
    $fields['shipping']['shipping_city']['type'] = 'select';
    $fields['shipping']['shipping_city']['options'] = $option_cities;
    return $fields;
}


$fields['billing']['billing_postcode']['options'] = array(
         'Karachi' => 'Karachi',
        '452600' => 'Гаражная',
        'Faisalabad' => 'Faisalabad',
        'Rawalpindi' => 'Rawalpindi',
        'Gujranwala' => 'Gujranwala',
        'Peshawar' => 'Peshawar',
        'Multan' => 'Multan',
        'Hyderabad' => 'Hyderabad',
        'Islamabad' => 'Islamabad'
);


// скрываем ненужные поля
add_filter( 'woocommerce_checkout_fields', 'wpbl_remove_some_fields', 9999 );
 
function wpbl_remove_some_fields( $array ) {
 
    //unset( $array['billing']['billing_first_name'] ); // Имя
    //unset( $array['billing']['billing_phone'] ); // Телефон
    //unset( $array['billing']['billing_city'] ); // Населённый пункт
    ////unset( $array['billing']['billing_ulizza'] ); // Улица
    //unset( $array['billing']['billing_address_1'] ); // 1-ая строка адреса
    //unset( $array['billing']['billing_address_2'] ); // 2-ая строка адреса
    //unset( $array['order']['order_comments'] ); // Примечание к заказу
    //unset( $array['billing']['name2'] ); // Имя получателя
    //unset( $array['billing']['tel2'] ); // Телефон получателя
    //unset( $array['billing']['billing_postcode'] ); // Почтовый индекс
     
    unset( $array['billing']['billing_last_name'] ); // Фамилия
    unset( $array['billing']['billing_email'] ); // Email
    unset( $array['billing']['billing_company'] ); // Компания
    unset( $array['billing']['billing_country'] ); // Страна
    unset( $array['billing']['billing_state'] ); // Область / район
    
    
    
    
    // Возвращаем обработанный массив
    return $array;
}

// меняем поля местами
add_filter( 'woocommerce_checkout_fields', 'wplb_phone_first' );
 
function wplb_phone_first( $array ) {
    
    // Меняем приоритет
    $array['billing']['billing_phone']['priority'] = 14;
    // назначаем ширину
    $array['billing']['billing_phone']['class'][0] = 'form-row-last';
    // Возвращаем обработанный массив
    return $array;
}
 

marr

Специалист
Местный
Задумка такая, пользователь выбирает улицу из раскрывающегося списка и на основании этого выбора billing_postcode должно присвоиться значение индекса улицы
В любом случае это надо писать на jQuery
 

joy66

Опытный
Здравствуйте
Хочу на странице оформления заказа уйти от введения индекса для расчета доставки. Задумка такая, пользователь выбирает улицу из раскрывающегося списка и на основании этого выбора billing_postcode должно присвоиться значение индекса улицы. Магазин работает в одном городе и стоимость доставки рассчитывается по улицам. Искал готовые решения, но ничего не нашел. Хотя, думаю, многие хотели бы убрать заполнение индекса для облегчения процесса оформления заказа.
Смотрите в сторону Сервиса подсказок Ddata https://dadata.ru/blog/instructions/wordpress/
 

joy66

Опытный
До 10000 запросов в день бесплатно. (Это около 300 адресов). Ну или алгоритм примерно такой.
Пишете и добавляете на страницу оформления заказ Javascript(JQuery) код- Его задача отслеживать значение введеной улицы и слать Ajax запрос на сервер а по ответу подставлять значение в поле индекса
В function темы написать обработчик этого запроса, который примет значение улицы или кода улицы и вернет нужный индекс..
Про Ajax в WP можно тут почитать https://wp-kama.ru/id_2018/ajax-v-wordpress.html
 

Tavlar

Новичок
До 10000 запросов в день бесплатно. (Это около 300 адресов). Ну или алгоритм примерно такой.
Пишете и добавляете на страницу оформления заказ Javascript(JQuery) код- Его задача отслеживать значение введеной улицы и слать Ajax запрос на сервер а по ответу подставлять значение в поле индекса
В function темы написать обработчик этого запроса, который примет значение улицы или кода улицы и вернет нужный индекс..
Про Ajax в WP можно тут почитать https://wp-kama.ru/id_2018/ajax-v-wordpress.html
Благодарю, в таком случае должно подойти решение, изучу вечерком
 
Сверху Снизу