Проблема: избыточное количество устаревших или неактуальных отзывов в WooCommerce
В интернет-магазинах на WooCommerce отзывы играют важную роль, но со временем часть из них может устаревать, терять актуальность или содержать спам. Ручное удаление таких отзывов неудобно и требует времени. Поэтому задача автоматического удаления отзывов по определённым критериям и расписанию становится практичной.
Диагностика проблемы
Чтобы понять, насколько актуальна задача, проверьте количество отзывов, которые старше определённого времени (например, года), или имеют статус «на модерации» длительное время.
SELECT COUNT(*) FROM wp_comments WHERE comment_type = 'review' AND comment_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);Если результат большой, стоит подумать об автоматизации очистки.
Решение: автоматическое удаление отзывов по расписанию с WP-Cron
Используем встроенный WP-Cron для создания задания, которое ежедневно будет удалять отзывы старше 1 года.
1. Создание функции удаления
function wpmy_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); // true — удаление без возможности восстановления
}
}
}2. Регистрация WP-Cron задачи
function wpmy_schedule_review_cleanup() {
if (!wp_next_scheduled('wpmy_daily_review_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpmy_daily_review_cleanup');
}
}
add_action('wp', 'wpmy_schedule_review_cleanup');
add_action('wpmy_daily_review_cleanup', 'wpmy_delete_old_reviews');3. Очистка расписания при деактивации плагина или темы
function wpmy_clear_review_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpmy_daily_review_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmy_daily_review_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpmy_clear_review_cleanup_schedule');Проверка результата после внедрения
- Запустите функцию вручную, вызвав
wpmy_delete_old_reviews()через консоль WP-CLI или временно подключив вызов в коде, и проверьте, что отзывы старше года удалились. - Проверьте в базе данных таблицу
wp_comments, что старые отзывы отсутствуют. - Убедитесь, что WP-Cron срабатывает: в логах сервера или через плагин для мониторинга Cron-задач.
Частые ошибки и как их исправить
- Отзывы не удаляются: Проверьте правильность
comment_type = 'review'. В WooCommerce отзывы могут иметь типcomment_type = ''(пустая строка), если отзывы используются как стандартные комментарии. В таком случае замените условие наcomment_type = ''или уберите фильтр. - WP-Cron не срабатывает: Убедитесь, что на сайте есть трафик (WP-Cron запускается по посещениям). Для теста запустите Cron вручную через WP-CLI:
wp cron event run wpmy_daily_review_cleanup. - Удаление отзывов вызывает ошибки: Проверьте права пользователя, под которым выполняется код, и наличие резервной копии перед массовым удалением.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных, чтобы избежать потери важных данных.
- Для сайтов с большим количеством отзывов используйте пакетное удаление (например, по 100 отзывов за раз), чтобы не перегружать сервер.
- Добавьте логирование удалённых отзывов в файл или в кастомную таблицу для последующего аудита.
- Если отзывы используются в SEO, учитывайте, что удаление может повлиять на позиции сайта.
Расширение: удаление отзывов с определённым статусом
Если нужно удалять не только старые отзывы, но и отзывы «на модерации» старше 30 дней:
function wpmy_delete_pending_reviews() {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));
$pending_reviews = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments}
WHERE comment_approved = '0' AND comment_type = 'review' AND comment_date < %s",
$date_limit
));
foreach ($pending_reviews as $comment_id) {
wp_delete_comment($comment_id, true);
}
}
add_action('wpmy_daily_review_cleanup', 'wpmy_delete_pending_reviews');Сравнение подходов к удалению отзывов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление | Простота, контроль | Трудоёмко, риск забыть |
| WP-Cron с кастомным кодом | Автоматизация, гибкость, контроль | Зависимость от Cron, требует тестирования |
| Плагины очистки | Удобство, готовые функции | Могут влиять на производительность, ограниченная кастомизация |