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

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

HIT

27.01.2017

6998

5

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

}

Тэги: ,

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

  • Похожие записи
  • Комментарии
  • Вложения
Выравнивание миниатюр товаров

Выравнивание миниатюр товаров

Идеальная ситуация, когда мы загружаем изображения для товаров (хотя бы для главного изображения) квадратными. т.е. заранее подготовленными, откадрированными. Но бывают случаи, когда на сайт начинают заливаться изображения разных пропорций. Сделаем Читать далее »

/
Иерархия по бренду

Иерархия по бренду

В woocommerce существует иерархия товаров по категории (product_cat), но не всегда этого достаточно. Создадим в woocommerce дополнительную иерархию по бренду. Сортировка по бренду Первым делом создаем атрибут товара Бренд и Читать далее »

Шаг количества товара

Шаг количества товара

Шаг количества товара или кратность в некоторых сферах интернет торговли является важной составляющей. Рассмотрим варианты создания данного функционала. Quantities and Units for WooCommerce Плагин Quantities and Units for WooCommerce (3,000+) Читать далее »

/

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

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

  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.

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