Диагностика задачи: зачем удалять отзывы автоматически
В интернет-магазинах на WooCommerce отзывы играют важную роль, но иногда появляется необходимость удалять устаревшие или нерелевантные отзывы автоматически. Например, для товаров с сезонным спросом или акциями, где старые отзывы могут вводить в заблуждение покупателей. В стандартном функционале WooCommerce и WordPress нет автоматического удаления отзывов по времени, это нужно реализовывать вручную либо через кастомный код.
Пошаговое решение: удаление отзывов WooCommerce по времени публикации
1. Определяем, что такое отзыв в WooCommerce
Отзывы в WooCommerce — это комментарии к типу записи product с определённым мета-данным, содержащим рейтинг. Поэтому работать будем с комментариями WordPress, отфильтрованными по типу записи.
2. Пишем функцию для удаления старых отзывов
Ниже пример функции, которая удаляет отзывы старше заданного количества дней (например, 90):
function wpreboot_delete_old_woocommerce_reviews() {
global $wpdb;
$days = 90; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$comments_to_delete = $wpdb->get_col(
$wpdb->prepare(
"SELECT c.comment_ID FROM {$wpdb->comments} c
INNER JOIN {$wpdb->posts} p ON c.comment_post_ID = p.ID
WHERE p.post_type = 'product'
AND c.comment_date < %s
AND c.comment_approved = 1
AND c.comment_type = ''",
$date_threshold
)
);
if (!empty($comments_to_delete)) {
foreach ($comments_to_delete as $comment_id) {
wp_delete_comment($comment_id, true); // true — принудительное удаление
}
}
}
3. Запускаем функцию автоматически по расписанию (WP-Cron)
Лучше запускать её раз в сутки, чтобы не нагружать сервер. Добавим хук и расписание:
add_action('wpreboot_daily_delete_reviews', 'wpreboot_delete_old_woocommerce_reviews');
if (!wp_next_scheduled('wpreboot_daily_delete_reviews')) {
wp_schedule_event(time(), 'daily', 'wpreboot_daily_delete_reviews');
}
4. Отключение задачи при удалении плагина или темы
Чтобы избежать мусора, добавим отмену cron при деактивации (например, в плагине):
function wpreboot_deactivate_cron() {
$timestamp = wp_next_scheduled('wpreboot_daily_delete_reviews');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpreboot_daily_delete_reviews');
}
}
register_deactivation_hook(__FILE__, 'wpreboot_deactivate_cron');
Как проверить, что автоматическое удаление отзывов работает
- Создайте тестовый отзыв на товар с датой старше 90 дней (можно через базу или вручную изменить дату).
- Запустите функцию вручную, вызвав
wpreboot_delete_old_woocommerce_reviews()через wp-cli или временно черезadd_action('init', 'wpreboot_delete_old_woocommerce_reviews'). - Проверьте, что старый отзыв удалился (в админке или базе).
- Убедитесь, что новые отзывы (младше 90 дней) остались.
Частые ошибки и их исправление
- Не удаляются отзывы: проверьте правильность даты, используйте
var_dump($comments_to_delete)для отладки. - Удаляются не только отзывы, но и комментарии других типов: убедитесь, что фильтр по
post_type = 'product'иcomment_type = ''корректен. - Функция не запускается по расписанию: проверьте работу WP-Cron на сайте, можно использовать плагин WP Crontrol.
- Высокая нагрузка при большом количестве отзывов: добавьте лимит выборки и удаляйте пачками.
Практические советы по безопасности и производительности
- Запускайте удаление отзывов в off-peak время, чтобы не влиять на производительность сайта.
- Используйте транзакции базы данных при массовом удалении (если позволяет база) для предотвращения частичного удаления.
- Регулярно делайте резервные копии базы данных перед автоматическими удалениями.
- Для контроля и логирования добавьте запись в лог или email уведомление о количестве удалённых отзывов.
Сравнение вариантов реализации удаления отзывов
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, неавтоматично | Подойдёт для магазинов с небольшим количеством отзывов |
| Плагин с автоматическим удалением | Автоматизация, простота настройки | Может иметь лишние функции, нагрузка | Выбирать лёгкие и проверенные плагины |
| Кастомный код с WP-Cron | Гибкость, нет лишних зависимостей | Требует навыков, поддержка кода | Оптимален для разработчиков и крупных проектов |