За замовчуванням WooCommerce вимагає обрати спосіб оплати, якщо сума замовлення більша за нуль. Це можна вимкнути за допомогою сніпету коду, щоб покупець просто заповнив дані та оформив замовлення без оплати. Про нюанси цього рішення розповідаємо у статті.
Куди вставляти код
У різних інструкціях в інтернеті ви могли бачити, що сніпет потрібно вставити у файл functions.php. Це спеціальний файл активної теми, через який можна додавати на сайт свої функції та змінювати стандартну поведінку WordPress. Спосіб робочий, але не найзручніший: якщо ви редагуєте звичайну тему безпосередньо, після оновлення файл перезапишеться і ваші сніпети пропадуть.
Уникнути цієї проблеми можна за допомогою дочірньої теми або плагіна типу «Code Snippets». Плагін робить те саме, тільки замість одного довгого файлу на хостингу ви працюєте в окремому розділі в адмінці WordPress. У ньому сніпети відображаються як записи або сторінки: у кожного є назва, опис, налаштування та вимикач, щоб призупинити роботу сніпету без видалення.
Про роботу з плагіном Code Snippets у нас є невелика окрема інструкція. Якщо раніше ви не працювали з такими фрагментами коду, краще спочатку відкрити цю статтю, а потім повернутися до прикладів нижче.
Стаття на тему 👀
Як користуватися плагіном Code Snippets
Варіант 1. Одразу брати замовлення в обробку
Цей варіант вимикає необхідність обирати спосіб оплати під час оформлення замовлення. Покупець просто заповнює свої дані, за необхідності обирає доставку та оформлює замовлення. WooCommerce одразу надає йому статус «В обробці». Для невеликих магазинів, де замовлення обробляються вручну, цього з великою ймовірністю буде достатньо.
Нюанс 👀
Якщо замовлення складається тільки з товарів, які одночасно є віртуальними та завантажуваними, він одразу отримає статус «Виконаний».
Щоб впровадити таку поведінку на сайті, додайте сніпет з двома фільтрами. Перший вимикає необхідність оплати для кошика, другий робить те саме для сторінки з оформленням замовлення.
add_filter( 'woocommerce_cart_needs_payment', '__return_false' );
add_filter( 'woocommerce_order_needs_payment', '__return_false' );
Після активації сніпета покупець більше не побачить способи оплати на сторінці оформлення замовлення. Йому залишиться тільки заповнити необхідні дані та підтвердити замовлення.

Але є один нюанс. У стандартній логіці WooCommerce статус «В обробці» означає, що оплату за замовлення вже отримано. Система записує дату оплати та створює примітку Payment complete . А при наведенні на статус в адмінці відобразиться спливаюче вікно з поясненням, що «оплата отримана, замовлення чекає на виконання».
Якщо оплата проводиться окремо вже після оформлення замовлення та із замовленнями працюєте не тільки ви, обговоріть цей момент зі співробітниками. Щоб не виникло ситуації, що хтось помилково вирішив, що замовлення сплачено.
Ще для замовлень у статусі «В обробці» можуть спрацювати інтеграції, які реагують на успішну оплату. Наприклад, CRM або автоматичні розсилки.
Крім того, WooCommerce дозволяє редагувати товари, доставку, знижки та деякі інші дані лише у замовлень зі статусом «В очікуванні на оплату» або «На утриманні».
Якщо ці обмеження вам заважають, скористайтеся другим варіантом.
Варіант 2. Залишати замовлення на утриманні до надходження оплати
Якщо вам важливо, щоб WooCommerce не вважав замовлення оплаченим, можна використовувати інший, трохи складніший сніпет. Покупець так само зможе оформити замовлення без вибору способу оплати, але замовлення отримає статус «На утриманні».
Цей статус означає, що замовлення прийнято, товар зарезервований, але оплату ще потрібно підтвердити. Він зручний, якщо ви бажаєте окремо відстежувати замовлення, за які покупці ще не заплатили.
Щоб запровадити таку поведінку на сайті, додайте такий код. Він вимикає необхідність обирати спосіб оплати, переводить створене замовлення статус «На утриманні» і не дозволяє WooCommerce зафіксувати успішну оплату такого замовлення.
// Вимикаємо обов'язкову оплату.
add_filter( 'woocommerce_cart_needs_payment', '__return_false' );
add_filter( 'woocommerce_order_needs_payment', '__return_false' );
// Переводимо замовлення без способа оплати у статус On hold.
function hostiq_no_payment_order_on_hold( $order ) {
if ( $order instanceof WC_Order && $order->get_total() > 0 && ! $order->get_payment_method() ) {
$order->update_status( 'on-hold' );
}
}
// Классичне оформлення замовлення.
add_action(
'woocommerce_checkout_order_processed',
function( $order_id, $posted_data, $order ) {
hostiq_no_payment_order_on_hold( $order );
},
10,
3
);
// Блокове оформлення замовлення.
add_action(
'woocommerce_store_api_checkout_order_processed',
'hostiq_no_payment_order_on_hold'
);
// Не відмічаємо таке замовлення як сплачене.
add_filter(
'woocommerce_valid_order_statuses_for_payment_complete',
function( $statuses, $order ) {
if ( ! $order->get_payment_method() ) {
return array_diff( $statuses, array( 'on-hold' ) );
}
return $statuses;
},
10,
2
);
Коли ви отримаєте оплату від покупця, змініть статус замовлення вручну в залежності від свого процесу роботи.
