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

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

HIT

27.01.2017

9905

9

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

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

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

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_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>';

}

Тэги: ,

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

  • Похожие записи
  • Комментарии
  • Вложения
Плагин по доставке Почтой России

Плагин по доставке Почтой России

Рассмотрим особенности работы и настройки плагина Russian Post and EMS for WooCommerce (2,000+). Бесплатная версия Бесплатный версия определяет возможные варианты доставки только по введенному индексу. Можно сделать поле индекса невидимым Читать далее »

/
Настраиваем woocommerce

Настраиваем woocommerce

Настраиваем различные аспекты плагина woocommerce, под текущие задачи. Ваша корзина пуста Шаблон для настроек страницы корзины (когда она пуста) находится в папке woocommerce (локализованная в теме)/cart/cart-empty.php Можно отцентрировать и добавить Читать далее »

/
Отключаем стандартные метабоксы

Отключаем стандартные метабоксы

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

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

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

  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) плагином.

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