Диагностика проблемы: зачем и когда нужно удалять отзывы автоматически
В WooCommerce отзывы играют важную роль, но иногда требуется автоматическое удаление устаревших или неподходящих отзывов по определённым критериям: например, по статусу заказа (отзыв оставить можно только после доставки), по времени (удалять отзывы старше 1 года), или если отзыв признан спамом. Ручное управление отзывами при большом объеме заказов и отзывов становится трудоемким и неточным.
Как реализовать автоматическое удаление отзывов по статусу заказа и времени
Общее решение через WP-Cron и пользовательскую функцию
Для автоматизации создадим кастомную функцию, которая будет запускаться по расписанию через WP-Cron и удалять отзывы, связанные с заказами в нужном статусе или по дате публикации.
function wpin_delete_reviews_by_status_and_time() {
global $wpdb;
// Получаем ID комментариев-отзывов, связанных с заказами в статусе 'cancelled' старше 30 дней
$date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));
$reviews_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT c.comment_ID FROM {$wpdb->comments} c
JOIN {$wpdb->posts} p ON c.comment_post_ID = p.ID
JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
JOIN {$wpdb->prefix}posts o ON o.ID = oi.order_id
WHERE c.comment_type = 'review'
AND o.post_status = %s
AND c.comment_date < %s",
'wc-cancelled',
$date_limit
));
if (!empty($reviews_to_delete)) {
foreach ($reviews_to_delete as $comment_id) {
wp_delete_comment($comment_id, true); // принудительное удаление
}
}
}
// Планируем запуск 1 раз в сутки
if (!wp_next_scheduled('wpin_daily_review_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpin_daily_review_cleanup');
}
add_action('wpin_daily_review_cleanup', 'wpin_delete_reviews_by_status_and_time');Объяснение кода
- Через SQL-запрос выбираются комментарии с типом
review, связанные с заказами в статусеwc-cancelled, и дата комментария старше 30 дней. - Для каждого такого комментария вызывается
wp_delete_commentс параметромtrueдля безвозвратного удаления. - Запуск происходит ежедневно через WP-Cron.
Проверка результата после внедрения
Чтобы убедиться, что автоматическое удаление работает:
- Создайте тестовый заказ, измените его статус на «Отменённый» (
wc-cancelled), оставьте отзыв к товару, подождите 1 день (или измените дату отзыва вручную в базе на старше 30 дней). - Запустите вручную крон-задачу:
do_action('wpin_daily_review_cleanup');- Проверьте наличие отзыва в панели администратора: он должен исчезнуть.
- Проверяйте логи ошибок и базу — комментарий должен быть удалён.
Частые ошибки и как их исправить
- Неправильные статусы заказов: Проверьте, что статус заказа в запросе указан верно, например,
wc-cancelled, а не простоcancelled. - Отсутствие комментариев с типом
review: Убедитесь, что отзывы WooCommerce действительно имеют этот тип, иначе запрос не найдёт нужных комментариев. - WP-Cron не работает: На некоторых серверах WP-Cron требует внешнего вызова или настройки реального cron-задачи.
- Права пользователя: Функция удаления должна выполняться с правами администратора, иначе
wp_delete_commentможет не сработать.
Практические советы по безопасности и производительности
- Добавьте проверку nonce и capability, если функция будет запускаться вручную через админку.
- При большом количестве отзывов разбивайте удаление на партии по 50-100 комментариев, чтобы избежать таймаутов.
- Логируйте удалённые отзывы в отдельный файл или таблицу для аудита.
- Настраивайте WP-Cron через системный cron на сервере для надёжности.
Альтернативные методы удаления: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
| Кастомный код (WP-Cron + SQL) | Полный контроль, гибкость, нет лишних плагинов | Требует навыков, возможны ошибки при запросах |
| Плагин для управления отзывами | Удобный интерфейс, готовые настройки удаления | Может нагружать сайт, ограниченные сценарии |