Диагностика проблемы с неподтверждёнными заказами в WooCommerce
Накопление неподтверждённых заказов (статусы «pending» или «on-hold») может приводить к росту базы данных и замедлению работы сайта. Особенно это заметно при большом трафике и активных продажах. Чтобы понять, есть ли такая проблема, выполните запрос к базе данных через phpMyAdmin или с помощью WP-CLI:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold');Если количество неподтверждённых заказов растёт непропорционально продажам, пора автоматизировать их удаление.
Пошаговое решение: автоматическое удаление неподтверждённых заказов с WP-Cron
1. Создание функции для удаления заказов
Добавьте следующий код в файл functions.php вашей темы или создайте свой плагин для кастомных функций:
function wpma_delete_unconfirmed_orders() {
global $wpdb;
$statuses = ['wc-pending', 'wc-on-hold'];
$interval = 60 * 60 * 24; // 24 часа
$threshold = time() - $interval;
$orders = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN (%s, %s) AND post_date < %s",
$statuses[0], $statuses[1], date('Y-m-d H:i:s', $threshold)
));
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true для полного удаления
}
}2. Регистрация WP-Cron задачи
Добавьте в functions.php или плагин следующий код для запуска задачи раз в сутки:
function wpma_schedule_order_cleanup() {
if (!wp_next_scheduled('wpma_delete_unconfirmed_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wpma_delete_unconfirmed_orders_hook');
}
}
add_action('wp', 'wpma_schedule_order_cleanup');
add_action('wpma_delete_unconfirmed_orders_hook', 'wpma_delete_unconfirmed_orders');3. Очистка при деактивации плагина или темы
Важно убрать задачу WP-Cron при деактивации, чтобы не оставлять мусор:
function wpma_unschedule_order_cleanup() {
$timestamp = wp_next_scheduled('wpma_delete_unconfirmed_orders_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpma_delete_unconfirmed_orders_hook');
}
}
register_deactivation_hook(__FILE__, 'wpma_unschedule_order_cleanup');Проверка результата после внедрения решения
Для проверки работы решения:
- Создайте тестовый заказ в статусе
pending. - Установите время создания заказа более 24 часов назад (через базу или измените период в коде на меньшее время для теста).
- Запустите событие WP-Cron вручную с помощью плагина WP Crontrol или WP-CLI:
wp cron event run wpma_delete_unconfirmed_orders_hookПосле выполнения заказа должен исчезнуть из базы. Проверьте таблицу wp_posts на наличие заказов с указанными статусами старше 24 часов.
Частые ошибки и как их исправить
- Не срабатывает WP-Cron: проверьте, включён ли WP-Cron на сайте, и есть ли вызовы
wp-cron.phpв браузере или через системный cron. Для надёжности настройте системный cron на вызов wp-cron.php. - Неправильные статусы заказов: убедитесь, что используете правильные статусы WooCommerce с префиксом
wc-. Для проверки выполнитеprint_r(wc_get_order_statuses());в отладчике. - Отсутствие прав на удаление: функция
wp_delete_postтребует прав администратора — убедитесь, что код запускается с достаточными правами. - Удаление не того периода: будьте осторожны с временным порогом, лучше протестировать на небольшом интервале, прежде чем ставить 24 часа.
Варианты решения: плагин vs код vs компромисс
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин (например, Clearfy Pro) | Удобный интерфейс, поддержка, обновления, дополнительные функции очистки | Дополнитель нагрузка, стоимость, возможные конфликты | Использовать на крупных сайтах с поддержкой |
| Код через WP-Cron (как в статье) | Полный контроль, нет лишних зависимостей, минимальная нагрузка | Требуется опыт, возможны ошибки при неправильной настройке cron | Использовать на средних и малых сайтах с разработчиком |
| Комбинация: плагин + кастомный код | Использовать плагин для мониторинга, код для кастомных условий | Сложность поддержки, требует тестирования | Оптимально для проектов с уникальными требованиями |
Практические советы по безопасности и производительности
- Перед удалением заказов лучше сделать резервную копию базы, особенно на боевом сайте.
- Настройте системный cron для вызова WP-Cron, чтобы задачи выполнялись надёжно.
- Следите за размерами таблиц
wp_postsиwp_postmeta, чтобы вовремя оптимизировать базу. - Не увеличивайте слишком часто интервал проверки, чтобы не создавать лишнюю нагрузку.
- Если используете плагины кеширования, убедитесь, что кеш не мешает обновлению данных о заказах.