Проблема: как автоматически удалять устаревшие отзывы в WooCommerce
В интернет-магазинах на WooCommerce с большим количеством товаров отзывы накапливаются быстро. Некоторые отзывы со временем теряют актуальность, например, для сезонных товаров или временных акций. Ручное удаление каждого отзыва — неэффективно, нужен автоматический способ очистки старых отзывов по дате.
Диагностика проблемы
Для начала проверьте, сколько отзывов у вас на сайте и как давно они были оставлены. Это поможет понять, какие отзывы нужно удалять. Отзывы в WooCommerce — это комментарии с типом comment_type = 'review'.
SELECT COUNT(*) FROM wp_comments WHERE comment_type = 'review';
SELECT MIN(comment_date) FROM wp_comments WHERE comment_type = 'review';
SELECT MAX(comment_date) FROM wp_comments WHERE comment_type = 'review';Если вы видите, что есть отзывы старше, например, 1 года, и хотите их удалять автоматически — можно настроить WP-Cron задачу.
Пошаговое решение: создание автозадачи для удаления отзывов старше N дней
1. Добавим функцию для удаления отзывов старше заданного периода.
function wpassist_delete_old_woocommerce_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); // true — принудительное удаление
}
}
}2. Зарегистрируем CRON задачу, которая будет запускаться, например, раз в неделю.
add_action('wpassist_weekly_review_cleanup', 'wpassist_delete_old_woocommerce_reviews');
function wpassist_schedule_review_cleanup() {
if (!wp_next_scheduled('wpassist_weekly_review_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpassist_weekly_review_cleanup');
}
}
add_action('wp', 'wpassist_schedule_review_cleanup');3. Чтобы отменить задачу (например, при деактивации плагина), используйте:
function wpassist_clear_scheduled_review_cleanup() {
$timestamp = wp_next_scheduled('wpassist_weekly_review_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpassist_weekly_review_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpassist_clear_scheduled_review_cleanup');Как проверить, что удаление отзывов сработало
- Зайдите в админку WordPress > Комментарии и отфильтруйте отзывы по дате — старые отзывы должны исчезнуть.
- Запустите задачу вручную, вызвав функцию
wpassist_delete_old_woocommerce_reviews()через WP-CLI или временно добавив вызов в шаблон. - Проверьте базу данных — в таблице
wp_commentsс типомreviewне должно быть отзывов старше заданного периода.
Частые ошибки и как их исправить
- Отзывы не удаляются: Проверьте, что используется правильный
comment_type— в WooCommerce этоreview, а неcomment. - CRON задача не запускается: Убедитесь, что на вашем хостинге работает WP-Cron, или настройте системный cron для вызова
wp-cron.php. - Удаляются не те отзывы: Проверьте условие в SQL-запросе, чтобы оно корректно фильтровало по дате и типу комментария.
- Перфоманс замедляется при удалении большого числа отзывов: удаляйте отзывы партиями, например, по 50 штук за раз, чтобы не нагружать сервер.
Практические советы по безопасности и производительности
- Не используйте удаление отзывов без резервного копирования базы данных — на всякий случай.
- Для сайтов с большим количеством отзывов разбивайте удаление на части с помощью
LIMITв SQL. - Следите за временем выполнения CRON задачи, чтобы не превышать лимиты хостинга.
- Добавьте проверку прав пользователя, если хотите запускать удаление через админку.
Пример удаления отзывов частями
function wpassist_delete_old_reviews_in_batches() {
global $wpdb;
$days = 365;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$batch_size = 50;
$old_reviews = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = 'review' AND comment_date < %s LIMIT %d",
$date_threshold, $batch_size
));
if (empty($old_reviews)) {
return false; // Нет старых отзывов
}
foreach ($old_reviews as $comment_id) {
wp_delete_comment($comment_id, true);
}
return true; // Есть что удалять
}Используйте эту функцию в CRON с повторным запуском, пока не удалятся все старые отзывы.
Таблица сравнения способов удаления старых отзывов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление через админку | Простота, полный контроль | Трудоемко, не для большого объема | Малые сайты, единичные случаи |
| SQL-запросы напрямую | Быстро, без нагрузки PHP | Риск ошибок, требуется доступ к БД | Опытные админы, разовые операции |
| Автоматизация через WP-Cron + PHP | Автоматически, гибко, безопасно | Нагрузка при большом объеме, зависит от WP-Cron | Средние и крупные сайты |