Диагностика проблемы с устаревшими отзывами и товарами
В WooCommerce накапливаются отзывы с оценками, которые могут терять актуальность со временем. Особенно это критично для товаров, которые больше не продаются или устарели. Оставлять такие товары на сайте с плохими или устаревшими отзывами небезопасно для репутации магазина и ухудшает пользовательский опыт.
Проблема: как регулярно удалять товары, у которых есть отзывы старше 30 дней, чтобы поддерживать актуальность каталога и облегчить работу с базой данных?
Как проверить наличие товаров с отзывами старше 30 дней
Подключитесь к базе данных через phpMyAdmin или используйте WP-CLI для выборки:
SELECT p.ID, p.post_title, MAX(c.comment_date) AS last_review_date
FROM wp_posts p
JOIN wp_comments c ON c.comment_post_ID = p.ID
WHERE p.post_type = 'product'
AND c.comment_approved = '1'
GROUP BY p.ID
HAVING last_review_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Если запрос вернет товары, значит на сайте есть продукты с отзывами старше 30 дней.
Пошаговое решение: автоматизация удаления товаров с устаревшими отзывами
1. Создаем пользовательскую функцию для удаления
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpdir_delete_products_with_old_reviews() {
global $wpdb;
// Получаем ID товаров с отзывами старше 30 дней
$query = "SELECT p.ID FROM {$wpdb->posts} p
INNER JOIN {$wpdb->comments} c ON c.comment_post_ID = p.ID
WHERE p.post_type = 'product'
AND c.comment_approved = '1'
AND c.comment_date < DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY p.ID";
$product_ids = $wpdb->get_col($query);
if (!empty($product_ids)) {
foreach ($product_ids as $product_id) {
wp_delete_post($product_id, true); // true - удаление без возможности восстановления
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавьте хуки для планировщика:
if (!wp_next_scheduled('wpdir_daily_delete_old_review_products')) {
wp_schedule_event(time(), 'daily', 'wpdir_daily_delete_old_review_products');
}
add_action('wpdir_daily_delete_old_review_products', 'wpdir_delete_products_with_old_reviews');Этот код будет запускать очистку товаров ежедневно.
Проверка результата после внедрения
- Через 24 часа проверьте, что устаревшие товары удалены.
- Снова выполните SQL-запрос из раздела диагностики — таких товаров не должно быть.
- Проверьте логи ошибок и работу сайта после удаления.
Частые ошибки и их исправление
- Функция не запускается: Проверьте, активен ли WP-Cron и нет ли конфликтов с другими плагинами, блокирующими задачи.
- Удаляются лишние товары: Убедитесь, что условие в SQL-запросе корректно — удаляются только товары с отзывами старше 30 дней.
- Ошибка базы данных: Проверьте префиксы таблиц и права доступа к базе.
Практические советы по безопасности и производительности
- Перед удалением товаров сделайте резервную копию базы данных.
- Для больших магазинов используйте пакетную обработку, чтобы избежать таймаутов.
- Добавьте уведомления администраторам о выполнении задачи через email или лог.
Сравнение вариантов автоматического удаления товаров с устаревшими отзывами
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + пользовательская функция | Код для выборки и удаления товаров с отзывами старше 30 дней | Гибко, без сторонних плагинов, полный контроль | Требует навыков, возможны таймауты при большом объеме |
| Плагины очистки базы и товаров | Готовые решения с интерфейсом | Простота использования | Могут быть избыточными, не всегда точные настройки |
| Ручное удаление через админку | Удаление товаров вручную | Простота, полный контроль | Небыстро, не подходит для регулярной очистки |