Диагностика проблемы: зачем удалять товары с отрицательными отзывами
В интернет-магазинах на WooCommerce часто возникают ситуации, когда товары получают большое количество негативных отзывов. Это может негативно влиять на репутацию магазина и снижать конверсию. Ручное отслеживание и удаление таких товаров занимает много времени, особенно при большом ассортименте. Автоматизация этого процесса позволяет быстро реагировать и поддерживать качество каталога.
Как определить товары с отрицательными отзывами
Отрицательные отзывы обычно имеют низкий рейтинг (1 или 2 звезды). Чтобы автоматически удалять такие товары, нужно:
- Выбрать товары, средний рейтинг которых ниже заданного порога;
- Или товары, у которых определённое количество отзывов с низкой оценкой.
WooCommerce хранит отзывы как комментарии с типом review и мета-данными рейтинга в commentmeta. Для выборки таких товаров нужно использовать WP_Query и WP_Comment_Query.
Пошаговое решение: код для автоматического удаления товаров с плохими отзывами
1. Запланировать задачу WP-Cron
Добавим еженедельный крон-задачу для проверки товаров:
if ( ! wp_next_scheduled( 'wpbit_delete_bad_review_products' ) ) {
wp_schedule_event( time(), 'weekly', 'wpbit_delete_bad_review_products' );
}2. Функция для выборки и удаления товаров
Порог — товары со средним рейтингом ниже 2.0 и минимум 3 отзыва.
function wpbit_delete_bad_review_products() {
global $wpdb;
// Получаем ID товаров с плохими отзывами
$query = "
SELECT comment_post_ID, AVG(meta_rating.meta_value) as avg_rating, COUNT(*) as review_count
FROM {$wpdb->comments} AS comments
INNER JOIN {$wpdb->commentmeta} AS meta_rating ON comments.comment_ID = meta_rating.comment_id AND meta_rating.meta_key = 'rating'
WHERE comments.comment_approved = 1 AND comments.comment_type = 'review'
GROUP BY comment_post_ID
HAVING avg_rating < 2 AND review_count >= 3
";
$results = $wpdb->get_results( $query );
if ( empty( $results ) ) {
return; // Нет товаров для удаления
}
foreach ( $results as $row ) {
$product_id = intval( $row->comment_post_ID );
// Удаляем товар
wp_delete_post( $product_id, true );
}
}
add_action( 'wpbit_delete_bad_review_products', 'wpbit_delete_bad_review_products' );Как проверить, что решение работает
- Запустите задачу вручную:
do_action('wpbit_delete_bad_review_products');в functions.php или через WP CLI:wp eval 'do_action("wpbit_delete_bad_review_products");'. - Проверьте, что товары с низким рейтингом удалились из админки WooCommerce.
- В базе данных в таблице
wp_postsпроверьте, что записи с ID этих товаров отсутствуют. - Посмотрите лог ошибок и событий (если есть).
Частые ошибки и как их исправить
- WP-Cron не выполняется автоматически: убедитесь, что на сервере настроен реальный cron или используйте плагин WP Crontrol для проверки и запуска задач вручную.
- Функция не удаляет товары: проверьте правильность SQL-запроса, наличие комментариев с рейтингом, права пользователя (код должен запускаться с правами администратора).
- Удаляются не те товары: возможно, где-то неправильная логика в HAVING. Для отладки выводите результаты запроса через
error_log(print_r($results, true));. - Удаление товаров мешает другие хуки: проверьте, что нет конфликтов с плагинами, которые блокируют удаление (например, плагины безопасности или кастомные фильтры).
Практические советы по безопасности и производительности
- Перед удалением товаров делайте резервную копию базы данных.
- Добавьте логирование удаленных товаров для аудита.
- Используйте
wp_delete_post( $product_id, true )с параметромtrueдля полного удаления, иначе товар будет помещён в корзину. - Если у вас большой магазин, выполните удаление партиями, чтобы не перегружать базу данных.
- Отключите эту автоматизацию на время массовых акций или импортов, чтобы избежать нежелательных удалений.
Таблица сравнения вариантов реализации
| Метод | Плюсы | Минусы | Ресурсы |
|---|---|---|---|
| WP-Cron с SQL-запросом | Полный контроль, без плагинов, быстро | Нужно писать SQL, возможны ошибки, требует знаний | Средние |
| Плагин для управления отзывами и удалением | Простота настройки, GUI | Ограниченная кастомизация, нагрузка, платные функции | Зависит от плагина |
| Ручное удаление | Точность и контроль | Трудозатратно, риск забыть | Высокие трудозатраты |