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

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

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 надо "обновить" страницу оформления заказа и всё встанет на свои места.
 
Сверху Снизу