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

Автоматическое подставленные индекса в 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
Благодарю, в таком случае должно подойти решение, изучу вечерком
 
Сверху Снизу