Добавляем поля для шаблона Оформление заказа Woocommerce. Стандартные поля Woocommerce делятся на 3 группы:
- поля оплаты (billing)
- поля доставки (shipping)
- поля аккаунта (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, заказ
Здравствуйте! А как вставить только ТЕКСТ (h3) МЕЖДУ ПОЛЯМИ в Детали оплаты? Мне собственно перед адресом надо вставить ТОЛЬКО текст — «Доставка только по ….» — и необходимо это как-то отдельным полем на всю ширину… остальные поля у меня в два столбца идут…
Спасибо!
Необходимо править шаблон woocommerce (локализованный) cart/cart-shipping.php. !После строки:
Либо делать хук, например к функции woocommerce_review_order_before_shipping
Как вывести результат Радиокнопки в Детали заказа ?