Диагностика задачи: зачем и когда нужно удалять товары после отрицательных отзывов
В интернет-магазинах на WooCommerce иногда возникает потребность автоматически удалять товары, получившие отрицательные оценки или отзывы. Это может быть актуально для магазинов с большим ассортиментом, где товары с низким рейтингом снижают общий уровень доверия, либо в случаях, когда негативные отзывы сигнализируют о проблемах с качеством продукта.
Основная задача — реализовать автоматический механизм удаления товара после того, как его рейтинг опустится ниже заданного порога. При этом важно сохранять контроль над процессом, чтобы избежать удаления товаров по ошибке.
Как определить отрицательную оценку в WooCommerce
WooCommerce использует стандартную систему отзывов WordPress. Оценка — это значение от 1 до 5, связанное с комментарием к товару.
Для анализа рейтинга товара нам нужно получить все отзывы с оценками и вычислить среднее.
Пример функции для получения среднего рейтинга товара
function get_average_product_rating( $product_id ) {
global $wpdb;
$query = $wpdb->prepare(
"SELECT AVG(meta_value+0) FROM {$wpdb->commentmeta} cm
INNER JOIN {$wpdb->comments} c ON cm.comment_id = c.comment_ID
WHERE cm.meta_key = 'rating' AND c.comment_post_ID = %d AND c.comment_approved = 1",
$product_id
);
return (float) $wpdb->get_var($query);
}Пошаговое решение: автоматическое удаление товаров с рейтингом ниже порога
1. Создаем функцию удаления
function delete_product_if_low_rating( $product_id, $threshold = 2.0 ) {
$average_rating = get_average_product_rating( $product_id );
if ( $average_rating > 0 && $average_rating < $threshold ) {
wp_delete_post( $product_id, true ); // true - принудительное удаление без корзины
return true;
}
return false;
}2. Автоматизация проверки после добавления отзыва
Используем хук comment_post, который срабатывает после сохранения отзыва. Проверяем, если это отзыв к товару и если есть рейтинг, запускаем проверку рейтинга.
add_action( 'comment_post', 'check_and_delete_product_after_review', 10, 3 );
function check_and_delete_product_after_review( $comment_ID, $comment_approved, $commentdata ) {
if ( $comment_approved != 1 ) return; // Только одобренные отзывы
$product_id = $commentdata['comment_post_ID'];
if ( 'product' !== get_post_type( $product_id ) ) return; // Только товары
$rating = intval( get_comment_meta( $comment_ID, 'rating', true ) );
if ( $rating === 0 ) return; // Если рейтинг не указан
// Порог рейтинга для удаления
$threshold = 2.0;
delete_product_if_low_rating( $product_id, $threshold );
}3. Добавляем CRON-задачу для периодической проверки
Чтобы избежать пропуска товаров с низким рейтингом, проверяем все товары раз в день.
if ( ! wp_next_scheduled( 'daily_check_low_rating_products' ) ) {
wp_schedule_event( time(), 'daily', 'daily_check_low_rating_products' );
}
add_action( 'daily_check_low_rating_products', 'daily_check_and_delete_products' );
function daily_check_and_delete_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids',
];
$products = get_posts( $args );
foreach ( $products as $product_id ) {
delete_product_if_low_rating( $product_id, 2.0 );
}
}Проверка результата после внедрения
- Добавьте отрицательный отзыв с рейтингом ниже 2 для любого товара. Проверьте, что товар удалён сразу после публикации отзыва.
- Проверьте, что товары с рейтингом выше порога не удаляются.
- Запустите вручную функцию
daily_check_and_delete_products()через админ-панель или WP-CLI и убедитесь, что товары с низким рейтингом удаляются.
Частые ошибки и как их исправить
- Удаление не тех товаров: проверьте, что проверяется тип поста именно
product. - Рейтинг не учитывается: убедитесь, что отзывы имеют метаполе
rating, и оно корректно сохраняется. - Удаление не происходит сразу: проверьте статус комментариев — функция работает только для одобренных.
- CRON задача не запускается: проверьте, что WordPress CRON активен или настройте системный cron вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Используйте
wp_delete_postс параметромtrueдля полного удаления, чтобы избежать накопления мусорных записей. - Ограничьте количество товаров, проверяемых за один запуск CRON, при большом каталоге, чтобы не нагружать сервер.
- Создайте резервную копию базы данных перед внедрением автоматического удаления.
- Добавьте логирование удалений в отдельный файл для аудита и восстановления ошибок.
Сравнение вариантов реализации удаления товаров по рейтингу
| Вариант | Преимущества | Недостатки |
|---|---|---|
Удаление после каждого отзыва (хук comment_post) | Мгновенная реакция, минимальный задержка | Риск удаления при единичном негативном отзыве, нагрузка при массовых отзывах |
| Периодическая проверка CRON | Контроль, анализ среднего рейтинга, меньше ложных удалений | Задержка в удалении, нагрузка при большом количестве товаров |
| Ручной запуск проверки | Полный контроль, отсутствие автоматических ошибок | Требуется время администратора, может быть забыто |