Диагностика проблемы: зачем удалять просроченные заявки в LearnPress
В LearnPress заявки на регистрацию или оплату курсов могут оставаться в базе долгое время, особенно если пользователь не завершил оплату. Это приводит к засорению базы данных, замедлению работы сайта и усложняет управление пользователями. Автоматическое удаление таких просроченных заявок решает данные проблемы и позволяет поддерживать чистоту данных.
Пошаговое решение автоматического удаления просроченных заявок
1. Определяем критерии просрочки
Стандартно заявки в LearnPress имеют статус pending или failed, если оплата не прошла. Обычно срок просрочки — 24 часа с момента создания заявки.
2. Создаем функцию очистки в functions.php вашей темы
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function lp_delete_expired_orders() {
global $wpdb;
$expiration_hours = 24; // Время просрочки в часах
$expiration_date = date('Y-m-d H:i:s', strtotime("-{$expiration_hours} hours"));
// Получаем ID заказов со статусом pending или failed старше expiration_date
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'lp_order' AND post_status IN ('pending', 'failed') AND post_date < %s",
$expiration_date
));
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}
// Регистрируем cron задачу
add_action('lp_delete_expired_orders_hook', 'lp_delete_expired_orders');
// Запускаем cron при инициализации
if (!wp_next_scheduled('lp_delete_expired_orders_hook')) {
wp_schedule_event(time(), 'hourly', 'lp_delete_expired_orders_hook');
}3. Альтернативный вариант: запуск через WP-CLI
Если на вашем сервере есть доступ к WP-CLI, можно запускать скрипт удаления вручную или по cron сервера:
wp eval '
global $wpdb;
$expiration_hours = 24;
$expiration_date = date("Y-m-d H:i:s", strtotime("-{$expiration_hours} hours"));
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'lp_order' AND post_status IN ('pending', 'failed') AND post_date < %s",
$expiration_date
));
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
'Как проверить, что автоматическое удаление работает
- Создайте тестовую заявку с датой создания старше 24 часов (можно вручную изменить дату в базе данных).
- Запустите функцию вручную через
do_action('lp_delete_expired_orders_hook');или дождитесь срабатывания cron. - Проверьте через админку WordPress или напрямую в базе данных, что заявка удалена.
- Для дополнительной проверки можно подключить логирование, добавив
error_log()внутри цикла удаления.
Частые ошибки и как их исправить
- Функция не запускается по cron: Проверьте, что WordPress cron работает, и что нет конфликтов с другими плагинами. Можно запустить вручную
do_action('lp_delete_expired_orders_hook');для теста. - Заявки не удаляются: Убедитесь, что статусы заявок действительно
pendingилиfailed. Возможно, у вас используются кастомные статусы — их нужно добавить в запрос. - Удаление заявок влияет на связанные данные: Если есть связи с другими таблицами (например, мета заказы), убедитесь, что
wp_delete_postудаляет все связанные данные, или добавьте дополнительный код очистки. - Ошибка в SQL запросе: Используйте
$wpdb->prepare()для безопасности и правильного формирования запроса.
Практические советы по безопасности и производительности
- Запускайте удаление не чаще раза в час, чтобы не нагружать сервер.
- Добавьте логирование для мониторинга работы скрипта (например, в отдельный файл через
error_logили с использованием плагина для логов). - Перед удалением создайте резервную копию базы, особенно если используете принудительное полное удаление.
- Проверьте совместимость с плагинами кеширования и оптимизации базы, чтобы избежать конфликтов.
Сравнение вариантов реализации очистки просроченных заявок
| Метод | Плюсы | Минусы |
|---|---|---|
| WP Cron (код в functions.php) | Автоматизация, не требует внешнего доступа | Зависит от трафика сайта, возможны задержки |
| WP-CLI скрипт | Точный запуск по расписанию сервера, быстро | Требует доступа к серверу и навыков работы с WP-CLI |
| Плагины для очистки базы | Готовые решения с интерфейсом | Могут быть избыточными, влиять на производительность |