Диагностика проблемы: зачем удалять товар после отрицательной оценки
В WooCommerce для интернет-магазинов негативные отзывы могут существенно повлиять на репутацию и продажи. В некоторых случаях владельцам магазинов нужно автоматизировать процесс удаления товаров с низким рейтингом, чтобы оперативно управлять ассортиментом и поддерживать качество каталога. Задача — автоматически удалять товар, если его средняя оценка опускается ниже определённого порога (например, 2 звезды).
Пошаговое решение: как реализовать автоматическое удаление товара
1. Определяем событие изменения рейтинга
WooCommerce хранит отзывы и оценки как комментарии с метаданными. Чтобы отследить обновление рейтинга, можно использовать хук comment_post и edit_comment, которые вызываются при добавлении или редактировании отзыва.
2. Вычисляем средний рейтинг товара
При каждом новом или обновлённом отзыве нужно пересчитать среднюю оценку товара. Для этого получаем все рейтинги, связанные с товаром, и вычисляем среднее значение.
function get_product_average_rating( $product_id ) {
$args = [
'post_id' => $product_id,
'status' => 'approve',
'meta_key' => 'rating'
];
$comments = get_comments( $args );
if ( empty( $comments ) ) {
return 0;
}
$total = 0;
$count = 0;
foreach ( $comments as $comment ) {
$rating = intval( get_comment_meta( $comment->comment_ID, 'rating', true ) );
if ( $rating > 0 ) {
$total += $rating;
$count++;
}
}
return ($count === 0) ? 0 : round( $total / $count, 2 );
}3. Удаляем товар при низком рейтинге
Если средний рейтинг ниже порога (например, 2), удаляем товар программно с помощью функции wp_trash_post. В WooCommerce товар — это тип записи product.
function auto_delete_product_on_low_rating( $comment_id, $comment_approved ) {
if ( 1 !== $comment_approved ) {
return; // Игнорируем не одобренные комментарии
}
$comment = get_comment( $comment_id );
$product_id = $comment->comment_post_ID;
$average_rating = get_product_average_rating( $product_id );
if ( $average_rating > 0 && $average_rating < 2 ) { // Порог 2 звезды
wp_trash_post( $product_id );
}
}
add_action( 'comment_post', 'auto_delete_product_on_low_rating', 10, 2 );
add_action( 'edit_comment', function( $comment_id ) {
$comment = get_comment( $comment_id );
if ( $comment ) {
auto_delete_product_on_low_rating( $comment_id, 1 );
}
} );Проверка результата после внедрения
- Добавьте несколько отзывов с рейтингами ниже 2 для одного из товаров.
- Проверьте, что после добавления или редактирования отзыва товар автоматически перемещается в корзину (trash).
- Проверьте раздел «Товары» в админке WooCommerce — товар должен быть в корзине.
- Добавьте отзыв с рейтингом выше порога и убедитесь, что товар остаётся в каталоге.
Частые ошибки и как исправить
- Товар не удаляется после низкой оценки: проверьте, что хук
comment_postиedit_commentкорректно срабатывают. Возможно, отзывы добавляются через сторонний плагин, который не использует стандартные комментарии WordPress. - Удаляется не тот товар: убедитесь, что
comment_post_IDдействительно относится к товару, а не к другому типу записи. - Товар удалён преждевременно: добавьте логирование среднего рейтинга перед удалением, чтобы убедиться в правильности вычислений.
Практические советы по безопасности и производительности
- Кэширование рейтингов: при большом количестве отзывов пересчёт среднего рейтинга при каждом комментарии может замедлить сайт. Рассмотрите кеширование результата с помощью
transientили записей в метаполе товара. - Резервное удаление: используйте
wp_trash_postвместоwp_delete_postдля возможности восстановления товара. - Логирование: для отладки добавьте запись в лог при удалении товара, чтобы отслеживать автоматические действия.
- Оповещение админа: можно отправлять email уведомления при удалении товара, чтобы не пропустить важные события.
Сравнение подходов для автоматического удаления товара
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Хуки комментариев (comment_post, edit_comment) | Реагирует на добавление и изменение отзывов моментально | Зависит от стандартного механизма комментариев | Пример из статьи |
| Крон-задача с периодической проверкой рейтинга | Не зависит от событий, подходит для сложных вычислений | Задержка реакции, сложнее в настройке | WP-Cron с пользовательской функцией |
| Использование плагина-автоматизатора | Простота настройки, готовый функционал | Может быть избыточным, нагрузка от плагина | Плагины типа AutomateWoo |