Диагностика проблемы: зачем и когда нужно удалять отзывы автоматически
В интернет-магазинах на WooCommerce отзывы играют важную роль, но иногда требуется их автоматическое удаление. Причины могут быть разные: устаревшие отзывы, которые не отражают текущую ситуацию, спам, или необходимость очистки базы данных для оптимизации. Встроенных средств для автоматического удаления отзывов с определённым возрастом WooCommerce не предлагает, поэтому приходится применять кастомные решения.
Пошаговое решение задачи автоматического удаления отзывов
1. Создание WP-Cron задачи для регулярной проверки и удаления
Используем WP-Cron для запуска функции удаления отзывов, которым больше заданного количества дней (например, 180 дней).
function wpunit_schedule_delete_old_reviews() {
if ( ! wp_next_scheduled( 'wpunit_delete_old_reviews_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpunit_delete_old_reviews_hook' );
}
}
add_action( 'wp', 'wpunit_schedule_delete_old_reviews' );2. Реализация функции удаления отзывов WooCommerce
Отзывы в WooCommerce хранятся как комментарии с типом review. Удаляем их, если их дата создания старше 180 дней.
function wpunit_delete_old_reviews() {
global $wpdb;
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
$reviews = $wpdb->get_col( $wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = 'review' AND comment_date < %s",
$date_threshold
) );
if ( ! empty( $reviews ) ) {
foreach ( $reviews as $review_id ) {
wp_delete_comment( $review_id, true );
}
}
}
add_action( 'wpunit_delete_old_reviews_hook', 'wpunit_delete_old_reviews' );Как проверить, что автоматическое удаление отзывов сработало
- Проверить дату последних отзывов в админке WooCommerce → Отзывы (Комментарии).
- Запустить вручную функцию
wpunit_delete_old_reviews()черезWP-CLIили временно через вызов в шаблоне. - Включить логирование: добавить запись в файл лога при удалении каждого отзыва.
function wpunit_delete_old_reviews() {
global $wpdb;
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
$reviews = $wpdb->get_col( $wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = 'review' AND comment_date < %s",
$date_threshold
) );
if ( ! empty( $reviews ) ) {
foreach ( $reviews as $review_id ) {
wp_delete_comment( $review_id, true );
error_log("Deleted review ID: " . $review_id);
}
}
}Частые ошибки и как их исправить
- WP-Cron не запускается регулярно: По умолчанию WP-Cron запускается при посещении сайта, если трафик низкий, задачи могут не выполняться. Решение – настроить системный cron на сервере или использовать плагины, например WP Crontrol.
- Удаляются не только отзывы: Проверьте, что в запросе указано
comment_type = 'review', чтобы не затронуть другие комментарии. - Отзывы не удаляются из-за прав доступа: Функция
wp_delete_commentтребует прав администратора, убедитесь, что код выполняется с необходимыми правами.
Практические советы по безопасности и производительности
- Не удаляйте отзывы сразу, если есть сомнения — лучше сначала переносить их в черновик или помечать меткой для последующего анализа.
- Добавьте ограничение на количество удаляемых отзывов за один запуск, чтобы не перегружать базу данных.
- Регулярно создавайте резервные копии базы данных перед автоматическим удалением.
Таблица сравнения вариантов удаления отзывов WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление в админке | Удаление через раздел комментариев | Просто, без кода | Трудоёмко при большом количестве |
| Плагин очистки базы | Использование готовых плагинов | Удобно, настройки | Зависимость от стороннего кода, нагрузка |
| WP-Cron + кастомный код | Автоматизация удаления с помощью WP-Cron | Контроль, гибкость, без плагинов | Необходимы навыки разработки |