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

Решено Как избавится от заполнения всех полей при Самовывозе?

Image CMS

roman001

Новичок
#41
Нужно что бы при выборе самовывоз отображались ТОЛЬКО поля: ИМЯ, ФАМИЛИЯ, ТЕЛЕФОН, EMAIL (добавить - я добавил уже, но как убрать другие поля? ненужные)
Поля: АДРЕС, СТРАНА, НАСЕЛЕННЫЙ ПУНКТ, ОБЛАСТЬ/РЕГИОН, ПОЧТОВЫЙ ИНДЕКС, ПРИМЕЧАНИЯ К ЗАКАЗУ - нужно убрать со страницы ОФОРМЛЕНИЕ ЗАКАЗА при выборе: Cамовывоз

При выборе единой ставки нужно убрать со страницы оформления заказа поля: Страна, Область/регион, Населенный пункт, почтовый индекс и дублирующее поле адрес в верхней левой части страницы.

Если можно то код целиком.

Clip2net_180805005512.png

С уважением Роман
 

rred

Новичок
#42
осталась главная проблема - как убрать не нужные поля из самовывоза?
Весь изюм как раз был в том, что привязанные к доставке поля пропадают из общего блока, а у Вас они дублируются, это странно и пока непонятно. А Вы точно весь код целиком скопировали? Проверьте пожалуйста, наличие строк
add_action('woocommerce_before_cart_totals', 'smf_before_checkout_form');
add_action('woocommerce_before_checkout_form', 'smf_before_checkout_form'); ?
add_filter('woocommerce_checkout_fields', 'smf_remove_checkout_fields');
 

roman001

Новичок
#43
Весь изюм как раз был в том, что привязанные к доставке поля пропадают из общего блока, а у Вас они дублируются, это странно и пока непонятно. А Вы точно весь код целиком скопировали? Проверьте пожалуйста, наличие строк
add_action('woocommerce_before_cart_totals', 'smf_before_checkout_form');
add_action('woocommerce_before_checkout_form', 'smf_before_checkout_form'); ?
add_filter('woocommerce_checkout_fields', 'smf_remove_checkout_fields');
Этих строк нет.
Но их нет и у вас в коде.

А нет нашел. Есть они. Эти строки.
 
Последнее редактирование:

roman001

Новичок
#44
Вот код который я копирую и вставляю:

Код:
/**
* Настройка привязки полей к методам доставки.
*
* Функция возвращает массив полей заказа, которые актуальны
* только для указанных методов доставки и неприменимы для других методов.
*
* Указанные в массиве поля не будут отображаться в стандартных блоках оплаты и доставки.
* Вместо этого они будут выведены после наименования метода доставки
* и только когда он выбран.
*
* Если к определённому виду доставки привязано обязательное поле, но
* выбрана другая доставка, проблем с валидацией не будет, поскольку
* в этом случае поле исключается из обрабатываемых полей стандартным способом.
*
* Массив двумерный: поля сгруппированы по блокам, в соответствии с документацией
* https://docs.woocommerce.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/#section-2
*
* Например, как сделать, чтобы поля адреса были применимы
* только к методу доставки "Единая ставка":
*
       return array(
         'billing' => array(
             'billing_address_1' => array( 'flat_rate' ),
             'billing_address_2' => array( 'flat_rate' )
         )
       );
*/
function get_shipping_method_fields() {
    return array(
        'billing' => array(
            'billing_address_1' => array( 'flat_rate' ),
            'billing_address_2' => array( 'flat_rate' ),
            'billing_postcode' => array( 'local_pickup' ),
        )
    );
}
/**
* Проверяет наличие метода доставки в формате типа 'flat_rate:3'
* в массиве методов доставки (method_id - в формате типа 'flat_rate' )
*
* @param type $chosen_shipping
* @param type $methods
* @return type
*/
function in_methods_array($chosen_shipping_id, $method_ids)
{
    $found = FALSE;
    $i = 0;
    $count = count($method_ids);
    while ( !$found && ( $i < $count ) ){
        $method_id = $method_ids[$i];
        $found = ( strpos($chosen_shipping_id, $method_id) !== FALSE );
        $i++;
    }
    return $found;
}

/**
* Скрыть в корзине и блоках оплаты и доставки поля,
* которые имеют привязку к методам доставки.
* Установленная переменная используется в фильтре woocommerce_checkout_fields
*/
add_action('woocommerce_before_cart_totals',  'smf_before_checkout_form');
add_action('woocommerce_before_checkout_form',  'smf_before_checkout_form');
function smf_before_checkout_form(){
       set_query_var( 'smf_hide_fields', TRUE );
}
add_action('woocommerce_after_checkout_form',  'smf_after_checkout_form');
add_action('woocommerce_after_cart_totals',  'smf_after_checkout_form');
function smf_after_checkout_form(){
       set_query_var( 'smf_hide_fields', FALSE );
}

/**
* Отключить неприменимые к текущему методу доставки поля.
* Или отключить всё поля, привязанные к методам доставки,
* если идёт вывод checkout_form
*/
add_filter('woocommerce_checkout_fields', 'smf_remove_checkout_fields');
function smf_remove_checkout_fields($fields) {
    $smf_fields = get_shipping_method_fields();
    if ( !empty( $smf_fields ) ){
        $hideall = get_query_var('smf_hide_fields') === TRUE;
        $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
        $chosen_shipping_id = $chosen_methods[0];
        foreach ( $fields as $fieldset => $fieldlist ) {
            if ( key_exists( $fieldset, $smf_fields ) ) {
                foreach ( $fieldlist as $fieldkey => $field ) {
                    if ( key_exists($fieldkey, $smf_fields[$fieldset] ) ){

                        $method_ids = $smf_fields[$fieldset][$fieldkey];
                        if ( $hideall || !in_methods_array($chosen_shipping_id, $method_ids) ){

                            unset( $fields[$fieldset][$fieldkey] );

                        }
                    }
                }
            }
        }
    }
  
    return $fields;
}

/**
*  Вывести поля для метода доставки, если он выбран в данный момент
*/
add_action('woocommerce_after_shipping_rate', 'smf_after_shipping_rate');
function smf_after_shipping_rate( $method ) {
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping_id = $chosen_methods[0];

    $smf_fields = get_shipping_method_fields();
    if ( !empty( $smf_fields ) ){

        // это выбранный метод доставки?
        if ( strpos($chosen_shipping_id, $method->id) !== FALSE ){
          
            $checkout = WC()->checkout;
            foreach ($smf_fields as $fieldset => $fieldlist) {
                $allfields = $checkout->get_checkout_fields( $fieldset );
                $fieldkeys = array_keys($fieldlist);
                foreach ( $allfields as $fieldkey => $field ) {
                    $method_ids = $smf_fields[$fieldset][$fieldkey];
                    if (
                            in_array($fieldkey, $fieldkeys) &&
                            in_methods_array($chosen_shipping_id, $method_ids)
                       )
                    {
                        woocommerce_form_field( $fieldkey, $field, $checkout->get_value( $fieldkey ) );
                    }
                }
              
            }
        }
    }
}
 

rred

Новичок
#45
Всё правильно, код рабочий, просто после редактирования функции в functions.php надо "обновить" страницу оформления заказа и всё встанет на свои места.
 

marr

Новичок
#47
Спасибо большое вам за труд.
А я использовала вот этот скрипт: ссылка на stackoverflow.com
Доработала его под нужды своего сайта. У меня 4 метода доставки (в данном скрипте только 2).
Я добавила свои условия, у меня в каждом из 4-х случаев видны разные поля в зависимости от метода доставки.

Сайт, на котором сейчас это поставила, можете посмотреть (положите товар в корзину и перейдите на оформление, только прошу не подтвержать заказ - магазин работающий !): http://volga-21.ru/checkout/

Единственное с чем пока не разобралась - это слово "необязательно", которое появилось рядом со звездочкой. Это фишка последнего релиза woocommerce. Пока в раздумьях откатить до предыдущего релиза или писать скрипт, который исправит это).
 
Последнее редактирование:
#48
А я использовала вот этот скрипт: ссылка на stackoverflow.com
Доработала его под нужды своего сайта. У меня 4 метода доставки (в данном скрипте только 2).
Я добавила свои условия, у меня в каждом из 4-х случаев видны разные поля в зависимости от метода доставки.

Сайт, на котором сейчас это поставила, можете посмотреть (положите товар в корзину и перейдите на оформление, только прошу не подтвержать заказ - магазин работающий !): http://volga-21.ru/checkout/

Единственное с чем пока не разобралась - это слово "необязательно", которое появилось рядом со звездочкой. Это фишка последнего релиза woocommerce. Пока в раздумьях откатить до предыдущего релиза или писать скрипт, который исправит это).
Подскажите пожалуйста, как вы поле Населенный Пункт удалили из формы заказа при активном самовывозе?
 

marr

Новичок
#49
Подскажите пожалуйста, как вы поле Населенный Пункт удалили из формы заказа при активном самовывозе?
Скриптом проверяю, какой выбран метод доставки. И показываю только нужные поля для этого метода. Добавила в скрипт с stackoverflow.com свои поля
 
#50
Скриптом проверяю, какой выбран метод доставки. И показываю только нужные поля для этого метода. Добавила в скрипт с stackoverflow.com свои поля
А можете привести пример как добавили список всех своих полей в скрипт.

Я решил свой вопрос вот так) Просто вставив после вашего кода:

/*
* Убираем поля для конкретного способа доставки
*/
add_filter( 'woocommerce_checkout_fields', 'awoohc_override_checkout_fields' );
function awoohc_override_checkout_fields( $fields ) {
// получаем выбранные метод доставки
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
// проверяем текущий метод и убираем не ненужные поля
if ( 'local_pickup:3' === $chosen_methods[0] ) {
unset( $fields['billing']['billing_city'] );

}

return $fields;
}
 
#52
У меня через jQuery, просто добавила к тем полям что в скрипте еще несколько своих.
К этим полям добавить надо свои?
showHide('show',b1 ); // Country
showHide('hide',b2 ); // Address 1
showHide('hide',b3 ); // Address 2
showHide('hide',b4 ); // Postcode
showHide('hide',b5 ); // State
Или к этим?
$chosen_shipping_method = WC()->session->get( 'chosen_shipping_methods' )[0];
$billing = '<strong> ' . __('Billing', 'woocommerce') . ' ';
$shipping = '<strong> ' . __('Shipping', 'woocommerce') . ' ';
$country = __('country.', 'woocommerce');
$address1 = __('address.', 'woocommerce');
$postcode = __('postcode.', 'woocommerce');
$state = __('state.', 'woocommerce');
$end_text = '</strong> '. __('is a required field.', 'woocommerce');
 
Последнее редактирование:

marr

Новичок
#53
К этим полям добавить надо свои?
здесь они уже скрываются, а выше вы должны были их объявить

здесь выдаются сообщения об ошибке, если не заполнены обязательные поля


Код:
        jQuery(function($){
            var ism = 'input[name^="shipping_method"]',         ismc = ism+':checked',
                csa = 'input#ship-to-different-address-checkbox',
                rq = '-required',       vr = 'validate'+rq,     w = 'woocommerce',      wv = w+'-validated',
                iv = '-invalid',        fi = '-field',          wir = w+iv+' '+w+iv+rq+fi,
                b = '#billing_',        s = '#shipping_',       f = '_field',    g = 'wc_',  k = 'field_',
                a1 = 'country',     a2 = 'address_1',   a3 = 'address_2',   a4 = 'postcode',    a5 = 'state',    a6 = 'city',    a7 = 'company',
                b1 = b+a1+f,        b2 = b+a2+f,        b3 = b+a3+f,        b4 = b+a4+f,        b5 = b+a5+f,        b6 = b+a6+f,        b7 = b+a7+f,
                s1 = s+a1+f,        s2 = s+a2+f,        s3 = s+a3+f,        s4 = s+a4+f,        s5 = s+a5+f,
                courierPickup = '<?php echo $courier_pickup; ?>',        localPickup = '<?php echo $local_pickup; ?>',        postPickup = '<?php echo $post_pickup; ?>',        tkPickup = '<?php echo $tk_pickup; ?>';
.....
.....
 
Сверху Снизу