Диагностика проблемы с отзывами и рейтингами в WooCommerce
При активном интернет-магазине на WooCommerce количество отзывов и оценок может существенно увеличиваться. Со временем это приводит к замедлению работы сайта, особенно при большом числе постов и комментариев. Отзывы — это по сути комментарии с метаданными и рейтингами, которые хранятся в базе данных WordPress. Иногда возникает необходимость автоматически удалять старые отзывы (например, старше 1 года), чтобы очистить базу и поддерживать производительность.
Основные признаки, что пора очищать отзывы:
- Замедление загрузки страниц товаров и админки;
- Резкое увеличение размера таблиц
wp_commentsиwp_commentmeta; - Высокое потребление ресурсов сервера при выполнении запроса отзывов.
Как определить отзывы к удалению: выборка по дате и типу комментария
Отзывы WooCommerce — это комментарии с типом comment_type = 'review' или пустым значением (зависит от версии WooCommerce). Рейтинг хранится в commentmeta с ключом rating.
Чтобы выбрать отзывы старше определённой даты, используйте дату создания комментария comment_date. Пример выборки для комментариев старше года:
SELECT comment_ID FROM wp_comments WHERE comment_type = 'review' AND comment_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);Пошаговое решение: автоматическое удаление старых отзывов через WP-Cron
Для автоматизации удаления старых отзывов реализуем функцию в файле functions.php вашей темы или в кастомном плагине.
1. Создайте функцию для удаления отзывов
function wc_delete_old_reviews() {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime('-1 year'));
// Получаем ID старых отзывов
$old_reviews = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = 'review' AND comment_date < %s",
$date_limit
));
if (!empty($old_reviews)) {
foreach ($old_reviews as $comment_id) {
wp_delete_comment($comment_id, true); // принудительное удаление
}
}
}2. Создайте WP-Cron задачу для ежемесячного запуска
add_action('wc_delete_old_reviews_event', 'wc_delete_old_reviews');
if (!wp_next_scheduled('wc_delete_old_reviews_event')) {
wp_schedule_event(time(), 'monthly', 'wc_delete_old_reviews_event');
}3. Добавьте отмену задачи при деактивации плагина (если используете плагин)
function wc_delete_old_reviews_deactivate() {
$timestamp = wp_next_scheduled('wc_delete_old_reviews_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_delete_old_reviews_event');
}
}
register_deactivation_hook(__FILE__, 'wc_delete_old_reviews_deactivate');Проверка результата после внедрения
Чтобы убедиться, что функция работает:
- Выполните вручную
wc_delete_old_reviews()через консоль WP-CLI или временно вызовите функцию вfunctions.phpи обновите сайт. - Проверьте таблицы
wp_commentsиwp_commentmeta, убедитесь, что записи с отзывами старше года удалены. - В админке WooCommerce откройте отзывы — старые должны исчезнуть.
- Для WP-Cron убедитесь, что задача запланирована:
wp cron event list(через WP-CLI).
Частые ошибки и как их исправить
- Отзывы не удаляются: Проверьте, что
comment_typeдействительно равен 'review' на вашем сайте. Иногда WooCommerce использует пустое значение или 'comment'. Можно уточнить запрос. - Отзыв удаляется, но рейтинг остаётся: Используйте
wp_delete_comment($comment_id, true);для удаления комментария с метаданными. - WP-Cron не срабатывает: Убедитесь, что на сайте есть посещения (WP-Cron запускается по триггерам посещений) или настройте системный cron для вызова
wp cron event run --due-now. - Ошибка в базе данных: Проверьте префиксы таблиц и корректность SQL-запроса.
Практические советы по безопасности и производительности
- Не удаляйте отзывы в пиковое время нагрузки, лучше ставить задачу на ночное время.
- Для больших магазинов с тысячами отзывов добавьте пакетное удаление (например, по 100 отзывов за раз), чтобы не перегрузить сервер.
- Включите резервное копирование базы перед автоматическим удалением.
- Используйте транзакции или проверяйте целостность базы после массовых операций.
Пример пакетного удаления отзывов по 100 штук
function wc_delete_old_reviews_batch($batch_size = 100) {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime('-1 year'));
$old_reviews = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = 'review' AND comment_date < %s LIMIT %d",
$date_limit, $batch_size
));
if (!empty($old_reviews)) {
foreach ($old_reviews as $comment_id) {
wp_delete_comment($comment_id, true);
}
return true; // Есть ещё для удаления
}
return false; // Удалено всё
}Сравнение способов удаления старых отзывов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление через SQL | Быстро, без нагрузки на WP | Риск нарушить целостность, сложно учитывать метаданные | Маленькие магазины с админским доступом к БД |
| WP-функции + WP-Cron (код) | Безопасно, учитывает все связи, автоматизация | Нагрузка при большом объёме, требует настройки cron | Средние и крупные магазины |
| Плагины очистки базы | Простота, дополнительные функции оптимизации | Могут быть платными, лишний софт | Для неразработчиков и быстрого решения |