Диагностика проблемы с отзывами в WooCommerce
На больших интернет-магазинах на WooCommerce отзывы клиентов могут накапливаться годами. Старые отзывы иногда теряют актуальность, особенно если товар обновлялся или изменился. Из-за большого количества комментариев база данных растет, а страницы товара загружаются дольше. Вопрос: как автоматически удалять отзывы старше заданного срока (например, 1 год) без ручной очистки?
Почему стандартных инструментов недостаточно
WooCommerce использует стандартную систему комментариев WordPress для отзывов. В админке WordPress нет фильтрации по дате комментариев с возможностью массового удаления. Плагины для управления комментариями редко имеют функцию удаления по дате с автоматизацией. Поэтому лучший подход — создать автоматизированный процесс на PHP с WP-Cron.
Пошаговое решение: автоматическое удаление старых отзывов
1. Создаем функцию удаления отзывов старше N дней
function wpassist_delete_old_reviews() {
global $wpdb;
$days = 365; // количество дней для хранения отзывов
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
// Получаем ID комментариев-отзывов старше порога
$old_reviews = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM $wpdb->comments
WHERE comment_type = 'review'
AND comment_date < %s",
$date_threshold
));
if (!empty($old_reviews)) {
foreach ($old_reviews as $comment_id) {
wp_delete_comment($comment_id, true); // принудительное удаление
}
}
}2. Регистрируем событие WP-Cron для регулярного запуска
if (!wp_next_scheduled('wpassist_cron_delete_old_reviews')) {
wp_schedule_event(time(), 'daily', 'wpassist_cron_delete_old_reviews');
}
add_action('wpassist_cron_delete_old_reviews', 'wpassist_delete_old_reviews');3. Добавляем возможность запуска вручную для проверки
add_action('admin_post_wpassist_delete_reviews_now', 'wpassist_delete_old_reviews');Теперь, если перейти по ссылке wp-admin/admin-post.php?action=wpassist_delete_reviews_now, функция запустится вручную.
Проверка результата после внедрения
- В админке WordPress перейдите в раздел Отзывы и отсортируйте их по дате: отзывы старше указанного срока должны исчезнуть.
- Выполните ручной запуск по ссылке выше и обновите страницу отзывов — убедитесь, что старые отзывы удалились.
- Для проверки WP-Cron можно использовать плагин
WP Crontrol— там должно отображаться событиеwpassist_cron_delete_old_reviewsс ежедневным запуском.
Частые ошибки и способы их исправления
- Отзывы не удаляются: Проверьте, что комментарии имеют
comment_type = 'review'. Если тема или плагин используют другой тип, замените в SQL-запросе. - WP-Cron не срабатывает: Убедитесь, что на сайте есть посещения, которые запускают cron. Для теста используйте плагин
WP Crontrolили настройте системный cron на сервере. - Удаление слишком агрессивное: Измените переменную
$daysна большее число, например 730 для двух лет.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед автоматическим удалением данных.
- Для больших сайтов с сотнями тысяч отзывов делайте удаление частями, чтобы не превышать лимиты памяти и времени выполнения. Например, добавьте лимит в SQL-запрос и выполняйте удаление по шагам.
- Используйте транзакции базы данных, если доступно, или логируйте удаленные комментарии для возможности восстановления.
- Проверяйте совместимость с плагинами кеширования и оптимизации, чтобы избежать конфликтов.
Сравнение вариантов реализации удаления старых отзывов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление из админки | Просто, без кода | Много времени, не автоматично | Подходит для небольших сайтов |
| Плагин удаления комментариев | Удобный интерфейс | Может не иметь фильтра по дате | Использовать с дополнительным планировщиком |
| Кастомный WP-Cron скрипт (как в статье) | Полный контроль, автоматизация | Требует навыков PHP и понимания WP-Cron | Лучший выбор для крупных проектов |