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

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

HIT

27.01.2017

11230

10

Добавляем поля для шаблона Оформление заказа 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>';

}

Тэги: ,

Поделится информацией с друзьями

  • Похожие записи
  • Комментарии
  • Вложения
Вкладка Дополнительная информация

Вкладка Дополнительная информация

У товаров WC есть вкладка Дополнительная информация (Additional Information), в которой по-умолчанию выводятся атрибуты, вес и габариты товара. Добавим в эту вкладку дополнительные данные. Проверки содержит ли товар атрибуты, вес Читать далее »

Плагины для woocommerce (нюансы)

Плагины для woocommerce (нюансы)

Рассмотрим различные плагины дополняющие функционал woocommerce, а также различные нюансы их использования. YITH WooCommerce Wishlist Плагин для добавление в ИМ раздела Избранное. В который можно/нужно помещать товары которые могут понадобится Читать далее »

/
Конвертировать цену в рубли

Конвертировать цену в рубли

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

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

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

  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

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

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