Изменение формы заказа woocommerce

Часто бывает требуется изменить стандартные поля оформления заказа, например убрать поле с индексом или областью для местной доставки. На этой странице вы найдете исчерпывающий рецепт по работе с полями оформления заказа woocommerce.

Весь код нужно добавить в файл functions.php вашей темы (хорошо если это будет дочерняя тема, чтобы изменения не затирались при обновлении).

Первым делом требуется обязательные к заполнению поля сделать необязательными:

add_filter( 'woocommerce_checkout_fields' , 'no_required_checkout_fields' );
function no_required_checkout_fields( $fields ) {
	$fields['billing']['billing_last_name']['required'] = false;  // Фамилия
//	$fields['billing']['billing_first_name']['required'] = false; // Имя
//	$fields['billing']['billing_phone']['required'] = false;      // Телефон
	$fields['billing']['billing_email']['required'] = false;      // Почта
	$fields['billing']['billing_address_1']['required'] = false;  // Адрес строка 2
	$fields['billing']['billing_state']['required'] = false;      // Область
	$fields['billing']['billing_city']['required'] = false;       // Город
	$fields['billing']['billing_country']['required'] = false;    // Страна
	$fields['billing']['billing_postcode']['required'] = false;   // Индекс
	return $fields;
}

Затем отключаем ненужные, а если нужно добавить альтернативные — можем сделать это в этой же функции.

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields', 100 );
function custom_override_checkout_fields( $fields ) {
        /* Добавили нужные поля */
	$fields['billing']['billing_phone_client'] = array(
		'label'     => __('Телефон получателя', 'woocommerce'), 
		'placeholder'   => _x('Введите номер', 'placeholder', 'woocommerce'), 
		'required'  => true, // Обязательно, false - необязательно
		'class'     => array('form-row-wide'), // Какие классы добавить полю
		'clear'     => false,
		'priority'  => 111 // Приоритет - нужный нам порядок
	);
	$fields['billing']['billing_adress_client'] = array(
		'label'     => __('Адрес доставки', 'woocommerce'),
		'placeholder'   => _x('Введите адрес', 'placeholder', 'woocommerce'),
		'required'  => true,
		'class'     => array('form-row-wide'),
		'clear'     => false,
		'priority'  => 112
	);

        /*Убрали ненужные поля*/
	unset($fields['billing']['billing_last_name']); // Фамилия
	unset($fields['billing']['billing_company']); // Компания
//	unset($fields['billing']['billing_first_name']); // Имя
//	unset($fields['billing']['billing_phone']); // Телефон
	unset($fields['billing']['billing_email']); // Почта
	unset($fields['billing']['billing_address_1']); // Адрес строка 1
	unset($fields['billing']['billing_country']); // Страна
	unset($fields['billing']['billing_address_2']); // Адрес строка 2
	unset($fields['billing']['billing_state']); // Область
	unset($fields['billing']['billing_postcode']); // Индекс
	unset($fields['billing']['billing_city']); // Город

	return $fields;
}

Или добавим произвольное текстовое поле перед примечанием:

add_action( 'woocommerce_before_order_notes', 'my_custom_checkout_field2' );

function my_custom_checkout_field2( $checkout ) {

	echo __('Текст для карточки');

	woocommerce_form_field( 'my_card_text', array(
		'type'          => 'textarea',
		'class'         => array('my-card-text form-row-wide'),
//		'label'         => __('Fill in this field'),
		'placeholder'   => __('Введите текст для карточки получателя'),
	), $checkout->get_value( 'my_card_text' ));

}

// Это поле требует сохранения!

add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );

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

Можем изменить другие атрибуты добавленных полей:

add_filter('woocommerce_billing_fields', 'custom_woocommerce_billing_fields');
function custom_woocommerce_billing_fields( $fields ) {
	$fields['billing_first_name']['class'] = array( 'form-row-wide' ); /*Поле адреса шире*/
	$fields['billing_first_name']['label'] = 'Имя заказчика'; /*Поле адреса шире*/
	$fields['billing_phone']['label'] = 'Телефон заказчика'; /*Поле адреса шире*/
	return $fields;
}

Выведем добавленные нами поля в форму редактирования заказа в админке, чтобы нам было видно, что же ввел пользователь:

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

function my_custom_checkout_field_display_admin_order_meta($order){
	echo __('Телефон получателя').': ' . get_post_meta( $order->get_id(), '_billing_phone_client', true );
	echo __('Адрес доставки').': ' . get_post_meta( $order->get_id(), '_billing_adress_client', true );
}

add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta2', 10, 2 );

function my_custom_checkout_field_display_admin_order_meta2($order){
	echo __('Текст для карточки').': ' . get_post_meta( $order->id, 'my_card_text', true );
}

И последнее — иногда может понадобится вывести произвольные данные из полей, которые мы создали, в письмо, отправляемое менеджеру например. Бывает очень полезно, если у менеджера нет доступа в админку (да и не нужен он по большому счету).

Вывод произвольных полей, созданных в предыдущих шагах, в письмо отправляемое админу при поступлении нового заказа:

function action_woocommerce_order_item_meta_start( $order ) {

	echo "Телефон получателя: " . get_post_meta( $order->get_id(), '_billing_phone_client', true );
	echo "Адрес доставки: " . get_post_meta( $order->get_id(), '_billing_adress_client', true );
	echo "Текст для карточки: " . get_post_meta( $order->get_id(), 'my_card_text', true );
};

add_action( 'woocommerce_email_after_order_table', 'action_woocommerce_order_item_meta_start', 10, 1 );

Все хуки страницы оформления заказа в порядке убывания (оригинал):

woocommerce_before_checkout_form
woocommerce_checkout_before_customer_details
woocommerce_before_checkout_billing_form
woocommerce_after_checkout_billing_form
woocommerce_before_checkout_shipping_form
woocommerce_after_checkout_shipping_form
woocommerce_before_order_notes
woocommerce_after_order_notes
woocommerce_checkout_after_customer_details
woocommerce_checkout_before_order_review
woocommerce_review_order_before_cart_contents
woocommerce_review_order_after_cart_contents
woocommerce_review_order_before_shipping
woocommerce_review_order_after_shipping
woocommerce_review_order_before_order_total
woocommerce_review_order_after_order_total
woocommerce_review_order_before_payment
woocommerce_review_order_before_submit
woocommerce_review_order_after_submit
woocommerce_review_order_after_payment
woocommerce_checkout_after_order_review
woocommerce_after_checkout_form

Стандартные хуки страницы оформления заказа (их можно удалить с помощью remove_action):

add_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_login_form', 10 );
add_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
add_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 );
add_action( 'woocommerce_checkout_order_review', 'woocommerce_checkout_payment', 20 );

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

Эту статью можно найти по словосочетаниям: удаление полей страницы заказа woocommerce, изменение полей страницы заказа woocommerce, change checkout fields woocommerce, добавление произвольных данных в письмо о новом заказе woocommerce.