Диагностика задачи: зачем нужен отложенный платёж в WooCommerce
Отложенный платёж — это сценарий, когда покупатель оформляет заказ, но оплата поступает позднее, например, после проверки, согласования или вручную. WooCommerce по умолчанию не предлагает готовых решений для отложенной оплаты без использования сторонних плагинов, что создаёт проблему для магазинов с нестандартными бизнес-процессами. Нужно реализовать возможность создавать заказы с «отложенным» статусом и затем принимать платеж отдельно.
Как реализовать отложенный платёж через кастомный статус заказа
1. Добавляем новый статус заказа
Для начала регистрируем статус on-hold-custom — это будет наш отложенный статус:
add_action('init', 'register_custom_order_status');
function register_custom_order_status() {
register_post_status('wc-on-hold-custom', array(
'label' => 'Отложенный платёж',
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Отложенный платёж <span class="count">(%s)</span>', 'Отложенные платежи <span class="count">(%s)</span>')
));
}
add_filter('wc_order_statuses', 'add_custom_order_status_to_list');
function add_custom_order_status_to_list($order_statuses) {
$new_statuses = array();
foreach ($order_statuses as $key => $status) {
$new_statuses[$key] = $status;
if ('wc-on-hold' === $key) {
$new_statuses['wc-on-hold-custom'] = 'Отложенный платёж';
}
}
return $new_statuses;
}2. Устанавливаем заказ в новый статус при оформлении
Чтобы заказ при создании сразу попадал в отложенный статус, используем хук woocommerce_thankyou или woocommerce_checkout_order_processed:
add_action('woocommerce_checkout_order_processed', 'set_order_to_on_hold_custom', 10, 1);
function set_order_to_on_hold_custom($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
// Можно добавить условие, кому устанавливать отложенный платёж
$order->update_status('on-hold-custom', 'Заказ переведен в отложенный платёж');
}3. Обработка оплаты и смена статуса
После того, как платёж подтверждён (например, вручную или через админку), нужно сменить статус заказа на processing или completed. В админке это делается вручную, но можно реализовать кнопку или крон-задачу для массового изменения.
Проверка результата
- Создайте заказ на сайте и убедитесь, что его статус после оформления — Отложенный платёж.
- В админке WooCommerce на странице заказов статус должен отображаться с новой меткой.
- После оплаты вручную измените статус на
processingи проверьте, что клиент получает уведомление (если включены стандартные уведомления WooCommerce).
Частые ошибки и как их исправить
- Статус не отображается в списке заказов: Проверьте, что функции
register_post_statusи фильтрwc_order_statusesкорректно добавляют статус и что код подключён в functions.php или плагине. - Заказ не меняет статус при оформлении: Убедитесь, что хук
woocommerce_checkout_order_processedсрабатывает и что функция получает ID заказа. - Уведомления не уходят: Для кастомных статусов уведомления WooCommerce не настроены по умолчанию. Нужно вручную подключать их через хуки
woocommerce_order_status_on-hold-custom_to_processing_notificationи др.
Практические советы по безопасности и производительности
- Не меняйте статус заказа без проверки прав пользователя, если реализуете смену через фронтенд или AJAX.
- Для массовых операций со статусами используйте WP-CLI или wp cron, чтобы не нагружать сервер во время пиков посещаемости.
- Создайте резервную копию базы перед внедрением кастомных статусов, чтобы избежать потери данных.
Резюме: чек-лист для внедрения отложенного платежа
- Добавить кастомный статус заказа через
register_post_statusиwc_order_statuses. - Установить статус в отложенный при создании заказа через
woocommerce_checkout_order_processed. - Обеспечить смену статуса после оплаты вручную или автоматически.
- Настроить уведомления для новых статусов (при необходимости).
- Проверить в админке и на фронтенде корректность отображения статусов.
- Обеспечить безопасность смены статусов (проверка прав).
Сравнение вариантов реализации отложенного платежа
| Вариант | Плюсы | Минусы |
|---|---|---|
| Кастомный статус + код | Лёгкая кастомизация, нет зависимости от плагинов, полный контроль | Требует базовых знаний PHP, нужно настраивать уведомления вручную |
| Готовый плагин (например, WooCommerce Deposits) | Быстрое решение, готовый функционал, поддержка платежных шлюзов | Дополнительная нагрузка, часто платные, зависит от стороннего кода |
| Использование купонов и правил скидок для "отложенного платежа" | Простая реализация без кода, подходит для частных случаев | Не универсально, не учитывает реальные статусы оплаты |