Часто бывает требуется изменить стандартные поля оформления заказа, например убрать поле с индексом или областью для местной доставки. На этой странице вы найдете исчерпывающий рецепт по работе с полями оформления заказа 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.