/ Плагины / Добавление полей при оформлении заказа

Добавление полей при оформлении заказа

HIT

27.01.2017

12102

12

Добавляем поля для шаблона Оформление заказа Woocommerce. Стандартные поля Woocommerce делятся на 3 группы:

  1. поля оплаты (billing)
  2. поля доставки (shipping)
  3. поля аккаунта (account)

Добавляем текстовое поле в стандартные группы WC

// Добавляем поле в группу Детали доставки

add_filter( 'woocommerce_checkout_fields' , 'custom_checkout_fields' );

function custom_checkout_fields( $fields ) {
	$fields['shipping']['shipping_apartment'] = array(
		'type' => 'text', 
		'label' => __('Квартира', 'woocommerce'),
		'placeholder' => _x('Квартира', 'placeholder', 'woocommerce'),
		'required' => false,
		'class' => array('form-row-wide'),
		'clear' => true
	);

	return $fields;
}

Далее создаем функцию сохранения значения метаполя. При необходимости, можно сделать функцию единой для нескольких полей.

// Сохраняем метаданные заказа со значением поля
add_action( 'woocommerce_checkout_update_order_meta', 'shipping_apartment_update_order_meta' );

function shipping_apartment_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['shipping_apartment'] ) ) {
        update_post_meta( $order_id, 'shipping_apartment', sanitize_text_field( $_POST['shipping_apartment'] ) );
    }
}

Чтобы поле было обязательным, меняем параметр required на true и добавляем функцию верификации

// Проверка поля при отправке заказа (обязательное)

add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    // Проверяем, заполнено ли поле, если же нет, добавляем ошибку.
    if ( ! $_POST['shipping_apartment'] )
        wc_add_notice( __( 'Пожалуйста, введите требуемый текст в наше новое замечательное поле.' ), 'error' );
}

Для чего-нибудь возможно пригодится в будущем: функция полного отключения валидации полей

add_filter('woocommerce_after_checkout_validation', 'additional_validation');
function additional_validation($fields) {
	wc_clear_notices();
}

Еще один пример, добавление поля Отчество (в группу полей Плательщик):

add_filter('woocommerce_checkout_fields', 'custom_woocommerce_billing_fields');
function custom_woocommerce_billing_fields( $fields ) {
    $fields['billing']['billing_patronymic'] = array(
        'label'       => __('Отчество', 'woocommerce'), // Add custom field label
        'placeholder' => __('Отчество', 'woocommerce'), // Add custom field placeholder
        'required'    => true, // if field is required or not
        'clear'       => false, // add clear or not
        'type'        => 'text', // add field type
        'class'       => array('billing_patronymic'),   // add class name
        'priority'    => 10, // Priority sorting option
    );

    return $fields;
}

Места вывода полей

Поля можно выводить в разных местах формы, благодаря системе хуков.

woocommerce_before_checkout_billing_form — перед полями Детали оплаты

woocommerce_after_checkout_billing_form — после полей Детали оплаты

woocommerce_checkout_fields — после всех полей, но перед комментарием к заказу

Значения полей в админке и в шаблоне письма

Смысл любого поля в том, чтобы мы получили из него информацию, поэтому выводим значение поля в админке и в шаблоне писем отправляемых клиенту и администратору.

Выводим значения полей на странице редактирования заказа (в админке). Если у нас несколько произвольных полей можно их все вносить в данную функцию.

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'custom_field_display_admin_order_meta', 10, 1 );

function custom_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('Квартира').':</strong> ' . get_post_meta( $order->id, 'shipping_apartment', true ) . '</p>';
    echo '<p><strong>'.__('Период доставки').':</strong> ' . get_post_meta( $order->id, 'shipping_date', true ) . '</p>';
}

Выводим значения полей в шаблоне письма клиенту. Данная функция может быть единой для всех произвольных полей. Каждое новое значение записываем с новой строки

// Выводим значения полей в шаблоне письма с заказом
add_filter('woocommerce_email_order_meta_keys', 'email_checkout_field_order_meta_keys');

function email_checkout_field_order_meta_keys( $keys ) {

$keys['Квартира'] = 'shipping_apartment';
$keys['Период доставки'] = 'shipping_date';
$keys['Разгрузка'] = 'unloading';

return $keys;
}

Вывод поля Отчество в конце колонки Плательщик

add_action( 'woocommerce_admin_order_data_after_billing_address', 'custom_field_display_admin_order_meta', 10, 1 );
function custom_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('Отчество').':</strong> ' . get_user_meta( $order->user_id, 'billing_patronymic', true ) . '</p>';
}

Добавляем другие типы полей

Радио кнопка

// Добавление поля Покупатель
add_action( 'woocommerce_before_checkout_billing_form', 'organisation_checkout_field' );

function organisation_checkout_field( $checkout ) {

    echo '<div id="organisation_checkout_field">';

    woocommerce_form_field( 'organisation', array(
        'type'          => 'radio',
        'class'         => array('form-row-wide'),
        'label'         =>  '',
	    'options' => array(
  							'Частное лицо' => 'Частное лицо',
  							'Организация' => 'Организация'
							)
	  
        ), $checkout->get_value( 'organisation' ));

    echo '</div>';
}

Вывести поле

<?php echo get_post_meta($order->id, 'organisation', true); ?>

Сделать один из вариантов изначально активным

$(function() {
    var $radios = $('input:radio[name=organisation]');
    if($radios.is(':checked') === false) {
        $radios.filter('[value="Частное лицо"]').prop('checked', true);
    }
});

Ещё один пример. Добавление поля Выбор даты доставки

// Поля выбора даты доставки
add_filter( 'woocommerce_checkout_fields' , 'shipping_date_checkout_fields' );

function shipping_date_checkout_fields( $fields ) {
	$today = date("d.m.Y");

	$d = strtotime("+1 day");
	$tomorrow = date("d.m.Y", $d); 

	$dd = strtotime("+2 day");
	$aftertomorrow = date("d.m.Y", $dd);

	$ddd = strtotime("+3 day");
	$afteraftertomorrow = date("d.m.Y", $ddd);  	

	$fields['shipping']['shipping_date'] = array(
		'type' => 'radio',   
		'required' => false,
		'class' => array('form-row-wide'),
		'clear' => true,
		'label' => 'Период доставки: ',
		'options' => array(
			$today => 'Сегодня',
			$tomorrow => 'Завтра',
			$aftertomorrow => $aftertomorrow,
			$afteraftertomorrow => $afteraftertomorrow
		)

	);

	return $fields;
}

Можно сделать упрощенное включение по-умолчанию (1 — второй элемент #shipping_date_field input, отсчет начинается с 0)

$('#shipping_date_field input').eq( 1 ).attr('checked',true);

Checkbox

// Добавляем поле Разгрузка доставки в группу Детали доставки
add_filter( 'woocommerce_checkout_fields' , 'unloading_checkout_fields' );

function unloading_checkout_fields( $fields ) { 	
	
     $fields['shipping']['unloading'] = array(
	'type'        => 'checkbox',   
        'required'    => false,
        'class'       => array('form-row-wide'),
	'clear'       => true,
	'label'       => 'Разгрузка'

     );

     return $fields;
}

Значение поля будет либо 0 — не отмечено, либо 1 — отмечено. Выводим значение checkbox проверкой

<?php if (get_post_meta($order->id, 'unloading', true)): ?>Разгрузка<?php endif; ?>

и также при добавлении значения checkbox в админку можно вывод также сделать в виде условия

if(get_post_meta( $order->id, 'unloading', true )) { echo '<p><strong>'.__('Нужна разгрузка').'</strong></p>'; }

Добавляем поле НЕ в стандартные группы WC

// Добавление своего поля для страницы Оформление товара

add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

function my_custom_checkout_field( $checkout ) {

	echo '<div id="my_custom_checkout_field"><h2>' . __('Мое поле') . '</h2>';

	woocommerce_form_field( 'my_field_name', array(
		'type' => 'radio',
		'class' => array('my-field-class form-row-wide'),
		'label' => 'organization-form',
		'placeholder' => __('Введите здесь требуемый текст'),
		'options' => array(
			'option_1' => 'urface',
			'option_2' => 'fizface'
		)
	), $checkout->get_value( 'my_field_name' ));

	echo '</div>';

}

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Групповой товар Woocommerce

Групповой товар Woocommerce

Групповой товар в Woocommerce это объединение в одной карточке нескольких товаров. Причем зайдя в карточку можно приобрести каждый товар по отдельности это по сути не правильно. Зачем нужен такой вид Читать далее »

Upgrade WC

Upgrade WC

Очередная серия улучшений (upgrade) плагина WC. Буду добавлять по мере изучения новые решения. Поиск по SKU (артикулу) Из коробки WC не ищет по артикулам (SKU). Но достаточно установить плагин Search Читать далее »

/
Купить в 1 клик

Купить в 1 клик

Добавляем в интернет-магазин кнопку «Купить в 1 клик». Рассмотрим различные плагины по данному направлению. WooCommerce Direct Checkout Плагин с 20 000 скачиваниями, по сути только меняет назначение кнопки «В корзину», Читать далее »

Добавить комментарий

12 комментариев

  1. Аватар
    Игорь

    Здравствуйте! А как вставить только ТЕКСТ (h3) МЕЖДУ ПОЛЯМИ в Детали оплаты? Мне собственно перед адресом надо вставить ТОЛЬКО текст — «Доставка только по ….» — и необходимо это как-то отдельным полем на всю ширину… остальные поля у меня в два столбца идут…
    Спасибо!

    1. Alexandr
      Alexandr

      Необходимо править шаблон woocommerce (локализованный) cart/cart-shipping.php. !После строки:

      <?php if ( $show_package_details ) : ?>

      Либо делать хук, например к функции woocommerce_review_order_before_shipping

  2. Аватар
    Сергей

    Как вывести результат Радиокнопки в Детали заказа ?

  3. Аватар
    Дмитрий

    Может вы подскажете где искать инфу. Требуется В зависимости от размера Добавлять товар в корзину под разным id и соответственно все это потом в оформление отравить. https://prnt.sc/oz3no2

    1. Alexandr
      Alexandr

      Это стандартный функционал вариативного товара. Вы создаете у товара вариации от размера и, при добавлении в корзину и оформлении, у товара с каждым размером будет уникальный ID и общий parrent_ID.

  4. Аватар
    Кирилл

    Здравствуйте ! Можете подсказать как добавлять выпадающий список? 

    1. Alexandr
      Alexandr

      Добрый день! Еще не могу, выпадающий список еще не добавлял. Как добавлю, опубликую здесь.

  5. Аватар
    Роман

    Здравствуйте, спасибо за статью! Но подскажите пожалуйста, для мультиязычного сайта, есть возможность это сделать чтобы потом можно было в Loco перевод вписать?

    1. Alexandr
      Alexandr

      Добрый день! Не подскажу, т.к. не пользуюсь этим (Loco) плагином.

  6. Аватар
    igor

    никак не получается записать значение чекбокса в заказ, можно плиз подробный пример .

  7. Аватар
    Елена

    Спасибо огромное за статью! ) Никак не могла найти способ вывести кастомные поля в Редактирование заказа. Ваша статья мне помогла в этом вопросе )

    1. Alexandr
      Alexandr

      Спасибо за отзыв! Очень рад что информация полезна.

Добавление полей при оформлении заказа
Несколько менеджеров магазина
Рекомендации для васНесколько менеджеров магазинаOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.