Диагностика проблемы: зачем удалять просроченные заявки?
В LearnPress при большом потоке регистраций и заявок на курсы нередко накапливаются заявки, которые не были оплачены или подтверждены вовремя. Они засоряют базу данных, замедляют работу сайта и могут создавать путаницу в отчетах. В стандартной поставке LearnPress отсутствует механизм автоматического удаления таких заявок, а ручное удаление занимает время и чревато ошибками.
Если вы заметили, что в разделе заявок появляются записи со статусом pending или failed, которые висят месяцами, стоит настроить автоматическую очистку.
Пошаговое решение: как настроить автоматическое удаление просроченных заявок
1. Определяем критерии просроченных заявок
Чаще всего заявки считаются просроченными, если со дня создания прошло более 7 дней, а статус остался неоплаченным (pending, failed, cancelled). Можно менять этот срок под свои нужды.
2. Создаем пользовательскую функцию для удаления заявок
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function lp_delete_expired_orders() {
global $wpdb;
$expiration_days = 7;
$statuses_to_delete = array('pending', 'failed', 'cancelled');
$cutoff_date = date('Y-m-d H:i:s', strtotime('-' . $expiration_days . ' days'));
// Получаем ID заказов, старше cutoff_date и с нужным статусом
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'lp_order'
AND post_status IN (%s, %s, %s)
AND post_date < %s",
$statuses_to_delete[0], $statuses_to_delete[1], $statuses_to_delete[2], $cutoff_date
));
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}3. Регистрируем задачу по Cron для регулярного запуска
Чтобы функция запускалась автоматически, добавим событие в WP-Cron:
if (!wp_next_scheduled('lp_delete_expired_orders_cron')) {
wp_schedule_event(time(), 'daily', 'lp_delete_expired_orders_cron');
}
add_action('lp_delete_expired_orders_cron', 'lp_delete_expired_orders');4. Очистка при деактивации
Чтобы не оставлять запланированные задачи, добавим очистку при деактивации плагина или темы:
function lp_clear_expired_orders_cron() {
$timestamp = wp_next_scheduled('lp_delete_expired_orders_cron');
if ($timestamp) {
wp_unschedule_event($timestamp, 'lp_delete_expired_orders_cron');
}
}
register_deactivation_hook(__FILE__, 'lp_clear_expired_orders_cron');Проверка результата после внедрения
- Убедитесь, что в базе появляются заявки с нужным статусом и датой более 7 дней назад.
- Запустите cron вручную через WP-CLI для теста:
wp cron event run lp_delete_expired_orders_cron - Проверьте, что заявки удалились из раздела заказов LearnPress.
- Подключите плагин Clearfy Pro для мониторинга и оптимизации базы данных, если часто удаляете заявки.
Частые ошибки и как исправить
- Задача cron не запускается: Проверьте, что WP-Cron работает, и нет блокировок со стороны сервера. Можно настроить системный cron для вызова WP-Cron.
- Неправильные статусы заявок: Убедитесь, что статусы в массиве
$statuses_to_deleteсоответствуют тем, которые используются LearnPress. Иногда статусы кастомизируются в вашей установке. - Удаляются нужные заявки: Проверьте дату и статус перед удалением, добавьте логирование для контроля, например, через
error_log(). - Ошибка доступа к базе данных: Проверьте правильность запроса и права пользователя базы данных.
Практические советы по безопасности и производительности
- Удаляйте записи с помощью
wp_delete_post($order_id, true), чтобы избежать «мягких» удалений и не накапливать мусор. - Добавьте логирование удалений с помощью
error_log()или специализированного плагина, чтобы быстро диагностировать проблемы. - Регулярно очищайте базу через WP-CLI, если у вас большой объем данных, чтобы не нагружать сайт.
- Для оптимизации запросов можно добавить индекс по
post_statusиpost_dateв таблицеwp_posts, если это актуально. - При необходимости расширьте функционал, добавив уведомление администратору о количестве удаленных заявок.
Сравнение вариантов автоматического удаления заявок
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код PHP + WP-Cron (как в статье) | Легко настраивается, не требует плагинов, гибкость | Зависит от WP-Cron, требует базовых знаний PHP | Оптимально для разработчиков с доступом к коду |
| Плагины для очистки базы (например, Clearfy Pro) | Простота использования, дополнительные функции оптимизации | Может быть избыточным, платные опции | Для тех, кто хочет минимизировать кодинг |
| Ручное удаление через админку | Безопасно, контролируемо | Трудоемко, неэффективно при большом количестве заявок | Подходит для малых сайтов |