Часто на форумах, посвященных WooCommerce, встречается вопрос, как убрать определенные поля на странице заказа в случае, когда в корзине находится только виртуальный (загружаемый) товар. По-умолчанию, если корзина содержит только виртуальные товары, то поля доставки автоматически убираются, то некоторым пользователям необходимо убрать и поля реквизитов оплаты. Это понятно, потому как нет смысла запрашивать адрес оплаты или же индекс в большинстве случаев. Сниппет ниже проверит количество товаров в корзине, и сравнит результат с количеством виртуальных товаров в ней же. Если все товары являются виртуальными, то поля на странице оплаты уберутся. Если же в корзине будет лежать один виртуальный товар и хотя бы один физический, то все поля останутся на месте. Логично, не так ли?
Код ниже содержит функцию под названием woo_cart_has_virtual_product(). Именно она и проверяет наличие виртуальных товаров в корзине. Она возвращает значение true, если все товары в корзине являются виртуальными, или же false, если ни один из них таковым не является либо же в корзине есть хотя бы один не виртуальный товар. Вторая функция, woo_remove_billing_checkout_fields(), перехватывает woocommerce_checkout_fields и удаляет ненужные поля на странице.
Вот так будет выглядеть результат, когда ваша корзина содержит только виртуальные товары:
Код добавляем в файл 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, где мы публикуем материалы специально по тематике магазинов на этой платформе.
По всем вопросам и отзывам просьба писать в комментарии ниже.
Не забывайте, по возможности, оценивать понравившиеся записи количеством звездочек на ваше усмотрение.