Диагностика проблемы: зачем удалять отзывы автоматически
В интернет-магазинах на WooCommerce иногда накапливается большое количество отзывов, которые могут быть спамом, устаревшими или нерелевантными. Ручное удаление отзывов — трудоёмкий и ошибкоопасный процесс. Автоматизация с помощью WP-Cron позволяет периодически очищать базу от ненужных отзывов без участия администратора.
Как работает WP-Cron в WordPress и WooCommerce
WP-Cron — внутренний планировщик задач WordPress, который запускает запланированные события при посещении сайта. За счёт этого можно создавать задачи, которые будут периодически выполняться, например, запускать функцию удаления отзывов.
Важно понимать, что WP-Cron не работает как системный cron на сервере, а зависит от трафика. Для критичных задач лучше настроить системный cron, но для удаления отзывов WP-Cron подходит.
Пошаговое решение: автоматическое удаление отзывов WooCommerce
1. Создаём функцию для удаления отзывов
Удалять будем отзывы, которые помечены как спам и старше 30 дней. Это распространённый сценарий очистки.
function wpunit_delete_old_spam_reviews() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
// Получаем ID комментариев (отзывов), которые в статусе 'spam' и старше 30 дней
$comments_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} WHERE comment_approved = 'spam' AND comment_date < %s",
$date_threshold
));
if (!empty($comments_to_delete)) {
foreach ($comments_to_delete as $comment_id) {
wp_delete_comment($comment_id, true); // true — удалять полностью
}
}
}2. Регистрируем крон-задачу при инициализации
Добавим событие, если оно ещё не создано:
function wpunit_schedule_delete_reviews_event() {
if (!wp_next_scheduled('wpunit_delete_reviews_cron')) {
wp_schedule_event(time(), 'daily', 'wpunit_delete_reviews_cron');
}
}
add_action('wp', 'wpunit_schedule_delete_reviews_event');3. Привязываем функцию к событию WP-Cron
add_action('wpunit_delete_reviews_cron', 'wpunit_delete_old_spam_reviews');Как проверить, что удаление работает
- Проверьте в базе данных наличие отзывов с
comment_approved = 'spam'и датой старше 30 дней. - Запустите функцию вручную для теста, вызвав
wpunit_delete_old_spam_reviews()из консоли WP-CLI или временно через admin_init. - Отследите логи, можно добавить запись в debug.log внутри функции удаления, например,
error_log('Удалено отзывов: ' . count($comments_to_delete));. - Наблюдайте, что спустя сутки (или после повторных визитов на сайт) устаревшие спам-отзывы удаляются.
Частые ошибки и как их исправить
- Крон-событие не запускается: WP-Cron зависит от посещений сайта. Для проверки используйте WP-CLI команду
wp cron event listили настройте системный cron на вызовwget -q -O - https://example.com/wp-cron.php?doing_wp_cron. - Удаляются не те отзывы: убедитесь, что условие
comment_approved = 'spam'подходит именно для спам-отзывов, а не для всех отзывов. Возможно, нужно изменить условие или проверить кастомные статусы. - Большая нагрузка при удалении: удаляйте отзывы порциями, если их много, чтобы избежать тайм-аутов. Добавьте лимит в SQL-запрос и повторяйте удаление несколько раз.
- Отсутствие прав на удаление: функция
wp_delete_comment()требует прав администратора. Запускайте функцию в контексте администратора.
Практические советы по безопасности и производительности
- Не удаляйте отзывы без резервного копирования базы данных.
- Добавьте логирование действий для аудита.
- Для больших магазинов с тысячами отзывов лучше использовать системный cron и делить удаление на пакеты.
- Проверяйте, что удаление не нарушает связи в WooCommerce и комментариях.
Сравнение вариантов удаления отзывов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Простота, контроль | Трудоёмко, риск пропустить спам |
| WP-Cron с кастомной функцией | Автоматизация, гибкость, бесплатность | Зависит от трафика, может быть нагрузка при большом объёме |
| Системный cron + WP-CLI | Надёжность, подходит для больших сайтов | Сложнее в настройке, требует доступа к серверу |
| Плагины для очистки отзывов | Удобство, готовые настройки | Дополнительная нагрузка, возможны конфликты |