Диагностика проблемы: зачем и когда нужно удалять отзывы после покупки
В WooCommerce отзывы играют важную роль, но иногда возникает необходимость автоматически удалить отзывы после того, как заказ завершён или спустя определённое время. Это может быть полезно в случаях, когда отзывы оставляются только для подтверждения покупки, но затем требуют обновления или удаления из-за изменений в товаре, политике магазина или по юридическим причинам.
Типичные сценарии:
- Автоматическое удаление отзывов, оставленных к заказам со статусом "завершён" после 30 дней.
- Удаление отзывов по определённым товарам или категориям спустя период.
- Очистка отзывов без использования плагинов, чтобы избежать нагрузки на сайт и сохранить контроль над процессом.
Как проверить, что отзывы удаляются автоматически
Для диагностики нужно понять, как отзывы связаны с заказами. WooCommerce использует стандартные комментарии WordPress для хранения отзывов. Для удаления отзывов связанной с заказом, необходимо:
- Определить ID товаров из заказа.
- Найти комментарии (отзывы) для этих товаров.
- Удалить комментарии программно.
Проверка результата:
- В административной панели WordPress в разделе Отзывы должны отсутствовать удалённые отзывы.
- На странице товара отзывы должны исчезнуть.
Пошаговое решение: автоматическое удаление отзывов после покупки
1. Добавляем плановое событие (cron) для удаления отзывов
Для автоматизации используем WP-Cron и пишем функцию, которая будет очищать отзывы по условию.
if (!wp_next_scheduled('wpdir_delete_old_reviews')) {
wp_schedule_event(time(), 'daily', 'wpdir_delete_old_reviews');
}
2. Функция удаления отзывов, старше 30 дней, для завершённых заказов
function wpdir_delete_reviews_after_purchase() {
global $wpdb;
$days = 30; // количество дней после завершения заказа
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов со статусом completed, завершённых раньше указанной даты
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < %s",
$date_threshold
));
if (empty($order_ids)) {
return;
}
// Получаем ID товаров из этих заказов
$order_items = $wpdb->get_col("SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id IN (" . implode(',', array_map('absint', $order_ids)) . ") AND order_item_type = 'line_item'");
if (empty($order_items)) {
return;
}
// Получаем product_id из order item meta
$product_ids = $wpdb->get_col("SELECT meta_value FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE order_item_id IN (" . implode(',', array_map('absint', $order_items)) . ") AND meta_key = '_product_id'");
if (empty($product_ids)) {
return;
}
// Удаляем отзывы (комментарии) для товаров
foreach ($product_ids as $product_id) {
$comments = get_comments(array(
'post_id' => $product_id,
'status' => 'approve',
'type' => 'review',
));
foreach ($comments as $comment) {
wp_delete_comment($comment->comment_ID, true); // true - удаляем без возможности восстановления
}
}
}
add_action('wpdir_delete_old_reviews', 'wpdir_delete_reviews_after_purchase');
3. Регистрация и очистка крон-события при деактивации темы или плагина
function wpdir_deactivate() {
wp_clear_scheduled_hook('wpdir_delete_old_reviews');
}
register_deactivation_hook(__FILE__, 'wpdir_deactivate');
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce и поставьте статус "completed".
- Оставьте отзыв к товару из этого заказа.
- Измените дату заказа на более раннюю (более 30 дней назад) через phpMyAdmin или SQL.
- Принудительно запустите крон-событие:
do_action('wpdir_delete_old_reviews');в functions.php или через WP-CLI. - Проверьте, что отзыв удалён в админке и на странице товара.
Частые ошибки и как их исправить
- Отзывы не удаляются: Проверьте, что крон-событие действительно запускается. Включите WP_DEBUG и посмотрите логи.
- ID товаров или заказов не получаются: Убедитесь, что таблицы WooCommerce актуальны, и запросы работают. Можно временно вывести результат
var_dump()для отладки. - Удаляются не те отзывы: Проверьте, что в функции
get_comments()правильно указан тип комментариев 'review'. В WooCommerce отзывы – это тип комментариев сcomment_type = 'review'. - Крон не срабатывает на хостинге: Используйте WP-CLI или внешние сервисы для запуска wp-cron.
Практические советы по безопасности и производительности
- Запросы к базе данных делайте с фильтрацией и использованием
prepare()для защиты от SQL-инъекций. - Удаление отзывов массовое – делайте это планово, чтобы не нагружать сервер.
- Для крупных магазинов лучше разбивать удаление на партии по 50-100 отзывов.
- Храните резервные копии базы перед массовыми удалениями.
- Используйте транзиенты или кеширование для оптимизации повторных запросов (если добавите логику фильтрации).
Сравнение подходов: плагин vs код vs компромисс
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| Плагин | Простота установки, готовый интерфейс, поддержка | Могут нагружать сайт, ограничения по настройкам | Для пользователей без навыков программирования |
| Код (как в статье) | Контроль, отсутствие лишних нагрузок, гибкость | Требует знаний программирования, возможны ошибки | Опытные разработчики, кастомные задачи |
| Компромисс | Плагин с возможностью кастомизации через код | Может усложнить поддержку | Когда нужна гибкость и удобство |