Диагностика проблемы: зачем автоматически удалять отзывы в WooCommerce
В интернет-магазинах на WooCommerce отзывы покупателей играют важную роль. Однако с течением времени часть отзывов может стать неактуальной: например, устаревшие, с низким рейтингом или содержащие спам. Такие отзывы снижают доверие к магазину и качество пользовательского опыта. Ручное удаление отзывов — трудоемкий процесс, особенно при большом объеме. Поэтому целесообразно настроить автоматическое удаление неактуальных отзывов с помощью WP-Cron.
Как работает WP-Cron и почему он подходит для задачи
WP-Cron — встроенная в WordPress система планировщика событий, позволяющая запускать задачи по расписанию без доступа к системному cron на сервере. Это удобно для автоматизации рутинных процессов, например, очистки базы данных от устаревших отзывов WooCommerce.
Преимущества использования WP-Cron:
- Не требует доступа к серверному cron;
- Легко настраивается через код и хуки;
- Работает в рамках WordPress, учитывая загрузку сайта;
- Можно легко модифицировать логику удаления.
Пошаговое решение: реализация автоматического удаления отзывов
1. Создаем функцию для удаления неактуальных отзывов
В WooCommerce отзывы — это комментарии к продуктам с типом комментария "review". Допустим, мы хотим удалять отзывы старше 1 года с рейтингом ниже 3.
function delete_old_low_rating_reviews() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));
// Получаем ID отзывов старше года с рейтингом ниже 3
$reviews = $wpdb->get_col(
$wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} c
INNER JOIN {$wpdb->commentmeta} cm ON c.comment_ID = cm.comment_id
WHERE c.comment_type = 'review'
AND c.comment_date < %s
AND cm.meta_key = 'rating'
AND CAST(cm.meta_value AS UNSIGNED) < 3",
$date_threshold
)
);
if (!empty($reviews)) {
foreach ($reviews as $review_id) {
wp_delete_comment($review_id, true); // Полное удаление
}
}
}2. Регистрируем событие WP-Cron
Добавляем планировщик, который будет запускать функцию ежедневно.
function schedule_delete_reviews_cron() {
if (!wp_next_scheduled('delete_old_low_rating_reviews_event')) {
wp_schedule_event(time(), 'daily', 'delete_old_low_rating_reviews_event');
}
}
add_action('wp', 'schedule_delete_reviews_cron');
add_action('delete_old_low_rating_reviews_event', 'delete_old_low_rating_reviews');3. Удаляем событие при деактивации темы или плагина
function unschedule_delete_reviews_cron() {
$timestamp = wp_next_scheduled('delete_old_low_rating_reviews_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'delete_old_low_rating_reviews_event');
}
}
register_deactivation_hook(__FILE__, 'unschedule_delete_reviews_cron');Проверка результата после внедрения
Чтобы убедиться, что WP-Cron сработал и отзывы удаляются:
- Проверьте наличие отзывов старше года с рейтингом ниже 3 — они должны исчезнуть после запуска задачи.
- Для ручного запуска WP-Cron используйте плагин
Cron Managerили WP-CLI команду:wp cron event run delete_old_low_rating_reviews_event. - Включите логирование в функцию удаления для отслеживания ID удаленных отзывов:
function delete_old_low_rating_reviews() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));
$reviews = $wpdb->get_col($wpdb->prepare("...", $date_threshold));
if (!empty($reviews)) {
foreach ($reviews as $review_id) {
wp_delete_comment($review_id, true);
error_log("Удален отзыв ID: " . $review_id);
}
}
}Частые ошибки и как их исправить
- WP-Cron не срабатывает — проверьте, что на сайте есть трафик, так как WP-Cron запускается при загрузке страниц. Для теста используйте WP-CLI.
- Отзывы не удаляются — проверьте правильность запроса и наличие мета-ключа
rating. Возможно, рейтинг хранится под другим ключом или в другом формате. - Удаляются не те отзывы — уточните условия фильтрации в SQL-запросе, проверьте временную зону сайта и формат даты.
- Производительность падает при удалении — используйте пакетную обработку, удаляйте отзывы частями, чтобы не перегружать БД.
Практические советы по безопасности и производительности
- Используйте транзакции или batch-удаление по 50-100 отзывов за раз, чтобы избежать длительных блокировок базы данных.
- Проверьте права пользователя, под которым выполняется WP-Cron, чтобы избежать ошибок доступа.
- Для увеличения надежности запуска используйте системный cron, если есть доступ, и вызывайте wp-cron.php.
- Если WooCommerce хранит отзывы в сторонних таблицах (редко), учтите это при построении запроса.
Сравнение вариантов реализации очистки отзывов WooCommerce
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + SQL-запрос | Автоматизация удаления отзывов по заданным условиям | Гибкость, не требует внешних плагинов | Зависит от трафика сайта, возможна нагрузка на БД |
| Плагины антиспама и модерации отзывов | Фильтрация и удаление спам-отзывов | Простота установки, готовые решения | Меньше контроля, могут удалять нужные отзывы |
| Ручное удаление через админку WooCommerce | Удаление отзывов вручную | Полный контроль | Трудозатратно при большом количестве |