Как скрыть поля на странице оплаты для виртуальных товаров в WooCommerce

Часто на форумах, посвященных WooCommerce, встречается вопрос, как убрать определенные поля на странице заказа в случае, когда в корзине находится только виртуальный (загружаемый) товар. По-умолчанию, если корзина содержит только виртуальные товары, то поля доставки автоматически убираются, то некоторым пользователям необходимо убрать и поля реквизитов оплаты. Это понятно, потому как нет смысла запрашивать адрес оплаты или же индекс в большинстве случаев. Сниппет ниже проверит количество товаров в корзине, и сравнит результат с количеством виртуальных товаров в ней же. Если все товары являются виртуальными, то поля на странице оплаты уберутся. Если же в корзине будет лежать один виртуальный товар и хотя бы один физический, то все поля останутся на месте. Логично, не так ли?

Код ниже содержит функцию под названием woo_cart_has_virtual_product(). Именно она и проверяет наличие виртуальных товаров в корзине. Она возвращает значение true, если все товары в корзине являются виртуальными, или же false, если ни один из них таковым не является либо же в корзине есть хотя бы один не виртуальный товар. Вторая функция, woo_remove_billing_checkout_fields(), перехватывает woocommerce_checkout_fields и удаляет ненужные поля на странице.

Вот так будет выглядеть результат, когда ваша корзина содержит только виртуальные товары:

woocommerce-virtual-products-checkout-fields[1]

Код добавляем в файл functions.php вашей темы или в плагин для сайта WordPress:

<?php
add_filter( 'woocommerce_checkout_fields' , 'woo_remove_billing_checkout_fields' );
/**
* Убираем ненужные поля на странице оформления заказа
*
* @return $fields array
*/
function woo_remove_billing_checkout_fields( $fields ) {
if( woo_cart_has_virtual_product() == true ) {
unset($fields['billing']['billing_company']); // убираем опцию указания компании
unset($fields['billing']['billing_address_1']); // убираем первую строку адреса
unset($fields['billing']['billing_address_2']); // убираем вторую строку адреса
unset($fields['billing']['billing_city']); // убираем город
unset($fields['billing']['billing_postcode']); // убираем поле индекса
unset($fields['billing']['billing_country']); // убираем страну
unset($fields['billing']['billing_state']); // убираем штат/область
unset($fields['billing']['billing_phone']); // убираем опцию указания номера телефона
unset($fields['order']['order_comments']); // убираем поле примечания/комментариев к заказу
unset($fields['billing']['billing_address_2']);
unset($fields['billing']['billing_postcode']);
unset($fields['billing']['billing_company']);
unset($fields['billing']['billing_city']);
}
return $fields;
}
/**
* Проверяем, содержит ли корзина виртуальные товары
*
* @return bool
*/
function woo_cart_has_virtual_product() {
global $woocommerce;
// По-умолчанию, виртуальных товаров нет
$has_virtual_products = false;
// Значение по-умолчанию количества виртуальных товаров
$virtual_products = 0;
// Получаем все товары в корзине
$products = $woocommerce->cart->get_cart();
// Проходимся по всем товаров в корзине
foreach( $products as $product ) {
// Получаем ID товара и '_virtual' post meta
$product_id = $product['product_id'];
$is_virtual = get_post_meta( $product_id, '_virtual', true );
// Обновляем $has_virtual_product если товар является виртуальным
if( $is_virtual == 'yes' )
$virtual_products += 1;
}
if( count($products) == $virtual_products )
$has_virtual_products = true;
return $has_virtual_products;
}

Если же вам понадобится убрать бОльшее количество полей, то можно воспользоваться одной или несколькими строками ниже, добавив их к перечню, указанному в предыдущем сниппете.

unset($fields['billing']['billing_first_name']); // убираем имя покупателя для реквизитов оплаты
unset($fields['billing']['billing_last_name']); // убираем фамилию покупателя для реквизитов оплаты
unset($fields['billing']['billing_email']); // убираем email адрес - учтите, что покупатель может не получить сам товар по почте
unset($fields['billing']['billing_phone']); // убираем опцию указания номера телефона для реквизитов оплаты
unset($fields['shipping']['shipping_first_name']);
unset($fields['shipping']['shipping_last_name']);
unset($fields['shipping']['shipping_company']);
unset($fields['shipping']['shipping_address_1']);
unset($fields['shipping']['shipping_address_2']);
unset($fields['shipping']['shipping_city']);
unset($fields['shipping']['shipping_postcode']);
unset($fields['shipping']['shipping_country']);
unset($fields['shipping']['shipping_state']);
unset($fields['account']['account_username']); // если убрать это поле и два поля ниже, то ваши покупатели не смогут создать себе аккаунт
unset($fields['account']['account_password']);
unset($fields['account']['account_password-2']);

Мы надеемся, что эта статья помогла вам скрыть поля на странице оплаты для виртуальных товаров в WooCommerce.

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

По всем вопросам и отзывам просьба писать в комментарии ниже.

Не забывайте, по возможности, оценивать понравившиеся записи количеством звездочек на ваше усмотрение.

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)

Об авторе ADv

Занимаюсь разработкой сайтов и магазинов на WordPress. Оказываю платные помощь и консультации. Skype: advokat_b
  • Gheorghe Verdes

    Добрый день!
    Пробовал добавлять код в файл functions.php но ничего не меняется
    При сохранение вирт товара белая страница

    в чем может быть проблема

    • ADv

      2.3.х

  • http://izgoba.com/ Игорь

    Здравствуйте!
    А обязательно ли указание < ?рhр в первой строчке? Вроде бы эти символы указываются в начале всего файла и в funcktions.php они уже есть?

    • ADv

      Нет, не обязательно

  • pushkagun

    Вопрос аналогичный статье — как следует изменить скрипт для функции, чтобы при выборе доставки «самовывоз» скрывались поля адреса доставки?

  • http://izgoba.com/ Игорь

    Здравствуйте,
    Спасибо за лайфхак, всё получилось. У меня только один момент остался неразрешенным: после того как убрал поле «примечание к заказу», остается заголовок к этому полю «Добавить примечание». Выглядит это всё, конечно, пипец — поля все убраны и в конце текст ни к селу ник городу «Добавить примечание». Как его убрать, не подскажите?

Scroll To Top