Крок один. Додавання форми полів до фрагмента
WooCommerce має таку функціональність фрагментів, ви можете додати до них потрібний html і відобразити в потрібному місці. Отже, додайте фрагмент
Код змінено. Попередній фрагмент буде працювати, але якщо магазин використовує особистий кабінет, то виникнуть проблеми. Оскільки ця форма підключена до файлу checkout / form-billing.php, правильніше використовувати такий код
/**
* Добавляем часть формы к фрагменту
*
* @sourcecode https://wpruse.ru/woocommerce/hiding-fields-on-chosen-delivery/
*
* @param $fragments
*
* @return mixed
*
* @sourcecode https://wpruse.ru/woocommerce/hiding-fields-on-chosen-delivery/
* @author Artem Abramovich
* @testedwith WC 5.5
*/
function awoohc_add_update_form_billing( $fragments ) {
$checkout = WC()->checkout();
parse_str( $_POST['post_data'], $fields_values );
ob_start();
echo '<div class="woocommerce-billing-fields__field-wrapper">';
$fields = $checkout->get_checkout_fields( 'billing' );
foreach ( $fields as $key => $field ) {
$value = $checkout->get_value( $key );
if ( isset( $field['country_field'], $fields[ $field['country_field'] ] ) ) {
$field['country'] = $checkout->get_value( $field['country_field'] );
}
if ( ! $value && ! empty( $fields_values[ $key ] ) ) {
$value = $fields_values[ $key ];
}
woocommerce_form_field( $key, $field, $value );
}
echo '</div>';
$fragments['.woocommerce-billing-fields__field-wrapper'] = ob_get_clean();
return $fragments;
}
add_filter( 'woocommerce_update_order_review_fragments', 'awoohc_add_update_form_billing', 99 );
Крок другий. Видалення непотрібних полів
Передбачається, що способи доставки налаштовані. Наприклад, було створено два методи. Тепер вам потрібно вказати бажаний ідентифікатор способу доставки. Найпростіший спосіб – заглянути у вихідний код
Вибрані рядки є ідентифікаторами. Тепер достатньо зробити чек, і якщо ми отримаємо бажаний спосіб доставки, видаліть зайві поля
/**
* Скрываем поля для бесплатного способа доставки
*
* @param $fields
*
* @return mixed
*
* @sourcecode https://wpruse.ru/woocommerce/hiding-fields-on-chosen-delivery/
* @author Artem Abramovich
* @testedwith WC 5.5
*/
function awoohc_override_checkout_fields( $fields ) {
// получаем выбранные методы доставки.
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
// проверяем текущий метод и убираем не ненужные поля.
if ( false !== strpos( $chosen_methods[0], 'free_shipping' ) ) {
unset(
$fields['billing']['billing_company'],
$fields['billing']['billing_address_1'],
$fields['billing']['billing_address_2'],
$fields['billing']['billing_city'],
$fields['billing']['billing_postcode'],
$fields['billing']['billing_state'],
$fields['billing']['billing_phone'],
$fields['billing']['billing_email']
);
}
return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'awoohc_override_checkout_fields' );
Крок третій. Оновлення сторінки
Все працює, окрім оновлення сторінки. Додамо деяку магію ajax, оскільки вся обробка полів на сторінці Checkout здійснюється за допомогою ajax.
/**
* Прелоад при переключении доставки
*
* @sourcecode https://wpruse.ru/woocommerce/hiding-fields-on-chosen-delivery/
* @author Artem Abramovich
* @testedwith WC 5.5
*/
function awoohc_add_script_update_shipping_method() {
if ( is_checkout() ) {
?>
<!--Скроем поле Страна. Если успользуется поле Страна, то следцет убрать скрытие-->
<style>
#billing_country_field {
display: none !important;
}
</style>
<!--Выполняем обновление полей при переключении доставки-->
<script>
jQuery( document ).ready( function( $ ) {
$( document.body ).on( 'updated_checkout updated_shipping_method', function( event, xhr, data ) {
$( 'input[name^="shipping_method"]' ).on( 'change', function() {
$( '.woocommerce-billing-fields__field-wrapper' ).block( {
message: null,
overlayCSS: {
background: '#fff',
'z-index': 1000000,
opacity: 0.3
}
} );
} );
} );
} );
</script>
<?php
}
}
add_action( 'wp_footer', 'awoohc_add_script_update_shipping_method' );
Код підключається до гачка wp_footer, при бажанні його можна помістити в окремий файл. Код був перевірений на стандартну тему StoreFront. Все повинно працювати коректно.
І оновлення полів також робиться не після оновлення способів доставки, а паралельно з цим оновленням