Проблема: необходимость удаления товара после негативного отзыва
В интернет-магазинах на WooCommerce иногда возникает задача: автоматически удалить или скрыть товар из каталога, если он получает слишком много отрицательных отзывов. Это помогает поддерживать качество ассортимента и улучшать репутацию магазина.
Диагностика сценария
Для начала нужно понять, как именно WooCommerce хранит отзывы и оценки товаров. Отзывы — это комментарии с метаданными по оценке (звезды). Средний рейтинг товара рассчитывается динамически.
- Проверяем, что в комментариях для товаров есть мета
rating. - Проверяем, что средний рейтинг рассчитывается корректно — функция
wc_get_rating_html()иget_average_rating(). - Убедитесь, что в базе есть товары с низким рейтингом.
Пошаговое решение: удаление товара при среднем рейтинге ниже порога
Реализуем проверку рейтинга и удаление товара с помощью планировщика WP-Cron. Такой подход позволит регулярно сканировать товары и удалять те, что не соответствуют критериям.
1. Создаем функцию для проверки и удаления
function yelly_remove_low_rated_products() {
$threshold = 2.5; // Пороговое значение рейтинга
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
);
$products = get_posts($args);
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
if (!$product) continue;
$avg_rating = floatval($product->get_average_rating());
if ($avg_rating > 0 && $avg_rating < $threshold) {
// Удаляем товар навсегда
wp_delete_post($product->get_id(), true);
}
}
}2. Добавляем событие в WP-Cron
function yelly_schedule_low_rating_check() {
if (!wp_next_scheduled('yelly_check_low_rating_hook')) {
wp_schedule_event(time(), 'daily', 'yelly_check_low_rating_hook');
}
}
add_action('wp', 'yelly_schedule_low_rating_check');
add_action('yelly_check_low_rating_hook', 'yelly_remove_low_rated_products');3. Очистка при деактивации плагина или темы
function yelly_clear_low_rating_cron() {
$timestamp = wp_next_scheduled('yelly_check_low_rating_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'yelly_check_low_rating_hook');
}
}
register_deactivation_hook(__FILE__, 'yelly_clear_low_rating_cron');Проверка результата
- Добавьте несколько отзывов с оценками ниже 3 для тестового товара.
- Запустите вручную функцию
yelly_remove_low_rated_products()через WP-CLI или вызовите ее в админке. - Проверьте, удалился ли товар из списка товаров и сайта.
- Через 24 часа убедитесь, что WP-Cron запустил задачу автоматически (можно использовать плагин WP Crontrol).
Частые ошибки и как их исправить
- Низкий рейтинг не учитывается: проверьте, что отзывы действительно имеют мета
ratingи что средний рейтинг считается правильно. - Товар не удаляется: убедитесь, что функция
wp_delete_post()вызывается с правильным ID и вторым параметромtrueдля безвозвратного удаления. - WP-Cron не срабатывает: настройте внешние вызовы cron, если посещаемость сайта низкая, или используйте системный cron для wp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением товара лучше сначала переводить его статус в
draftилиprivate— чтобы избежать потери данных и иметь возможность восстановить. - Для больших магазинов ограничьте количество товаров, проверяемых за один запуск, чтобы избежать таймаутов:
$args['posts_per_page'] = 50;
$args['paged'] = $paged; // реализуйте пагинацию- Резервное копирование — обязательно перед автоматическими удалениями.
- Для уведомления администраторов о действиях используйте отправку email или логи.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин для модерации отзывов | Готовое решение, UI для управления | Может быть тяжелым, платным |
| Код через WP-Cron (наш вариант) | Легкий, кастомный, интегрируемый | Требует знаний, настройка cron |
| Ручная проверка и удаление | Полный контроль | Затратно по времени |