Диагностика проблемы: когда нужно массово удалить отзывы
В интернет-магазинах на WooCommerce отзывы покупателей играют важную роль. Однако иногда возникает необходимость массово удалить отзывы, например, если появляются спамные комментарии или отзывы с некорректным содержанием, особенно если они привязаны к определённым статусам заказов или датам. В стандартной админке WordPress нет удобного инструмента для массового удаления отзывов по критериям, поэтому понадобится кастомный PHP-код.
Пошаговое решение: удаление отзывов WooCommerce по статусу и дате
1. Понимание связи отзывов и заказов
Отзывы в WooCommerce — это комментарии к продуктам (post_type = product), а информация о заказах хранится в отдельном post_type "shop_order". Связь отзыва с заказом напрямую не хранится. Однако можно расширить функционал, например, добавив метаполя к отзыву с ID заказа при создании отзыва, или ориентироваться на дату отзыва и статус заказа, если известно, что отзыв оставлен в определённый период.
2. Пример кода для удаления отзывов по дате
Если задача — удалить отзывы, оставленные до определённой даты, используйте следующий код. Добавьте его в functions.php вашей темы или в отдельный плагин для однократного запуска:
function wpdev_delete_reviews_before_date( $date ) {
global $wpdb;
$date = esc_sql( $date );
// Получаем ID комментариев (отзывов) до даты
$comments = $wpdb->get_col( "
SELECT comment_ID FROM {$wpdb->comments}
WHERE comment_date < '{$date}' AND comment_approved = '1' AND comment_type = 'review'
" );
if ( empty( $comments ) ) {
return 0;
}
foreach ( $comments as $comment_id ) {
wp_delete_comment( $comment_id, true );
}
return count( $comments );
}
// Пример вызова: удалить все отзывы до 2023-01-01
add_action( 'init', function() {
if ( ! current_user_can( 'manage_options' ) ) return;
$deleted_count = wpdev_delete_reviews_before_date( '2023-01-01 00:00:00' );
if ( $deleted_count ) {
error_log( "Удалено отзывов: {$deleted_count}" );
}
} );Обратите внимание, что в WooCommerce отзывы по умолчанию имеют тип review в комментариях. Если у вас другая реализация, измените фильтр comment_type.
3. Удаление отзывов по статусу заказа
Для удаления отзывов, связанных с заказами определённого статуса, понадобится более сложная логика. Если вы на этапе сбора отзывов сохраняете ID заказа в метаполе комментария, то можно фильтровать по этому метаполю. Пример ниже:
function wpdev_delete_reviews_by_order_status( $order_status ) {
global $wpdb;
$order_status = esc_sql( $order_status );
// Получаем ID комментариев, где метаполе _order_id связано с заказом нужного статуса
$comments = $wpdb->get_col( "
SELECT c.comment_ID FROM {$wpdb->comments} c
INNER JOIN {$wpdb->commentmeta} cm ON c.comment_ID = cm.comment_id
INNER JOIN {$wpdb->posts} p ON p.ID = cm.meta_value
WHERE cm.meta_key = '_order_id'
AND p.post_type = 'shop_order'
AND p.post_status = 'wc-{$order_status}'
AND c.comment_type = 'review'
" );
if ( empty( $comments ) ) {
return 0;
}
foreach ( $comments as $comment_id ) {
wp_delete_comment( $comment_id, true );
}
return count( $comments );
}
// Пример вызова: удалить отзывы, связанные с отменёнными заказами
add_action( 'init', function() {
if ( ! current_user_can( 'manage_options' ) ) return;
$deleted_count = wpdev_delete_reviews_by_order_status( 'cancelled' );
if ( $deleted_count ) {
error_log( "Удалено отзывов по статусу заказа: {$deleted_count}" );
}
} );Если у вас нет метаполя _order_id в комментариях, нужно его добавить при создании отзыва. Это потребует доработки процесса сбора отзывов.
Проверка результата после внедрения
- Перейдите в раздел Отзывы в админке WordPress и убедитесь, что отзывы по заданным критериям удалены.
- Проверьте логи ошибок (error_log) для сообщений о количестве удалённых отзывов.
- Для дополнительной проверки выполните запросы через phpMyAdmin или WP CLI:
wp comment list --comment_type=review --date_query_before=2023-01-01(если доступен WP CLI).
Частые ошибки и как их исправить
- Отзывы не удаляются: Проверьте правильность
comment_type— в WooCommerce отзывы чаще всего имеют типreviewили пустую строку. Попробуйтеcomment_type = ''. - Нет метаполя с ID заказа: Для удаления по статусу заказа метаполе
_order_idдолжно быть добавлено при сохранении отзыва. - Права доступа: Убедитесь, что код запускается только для пользователей с правами администратора, чтобы избежать случайного удаления.
- Кэширование: Если вы используете кеширование комментариев, после удаления отчистите кэш плагина и браузера.
Практические советы по безопасности и производительности
- Не запускайте массовое удаление отзывов на живом сайте без резервной копии базы данных.
- Для больших сайтов используйте WP CLI для удаления отзывов партиями, чтобы избежать таймаута скрипта.
- Добавляйте логи в error_log для мониторинга процесса удаления.
- При необходимости используйте транзакции базы данных, если поддерживается, для безопасного удаления.
- Если отзывы собираются через кастомную форму, расширьте их метаданные, чтобы облегчить последующую фильтрацию и управление.
Сравнение подходов удаления отзывов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Удаление по дате через SQL-запрос | Простота реализации, быстро | Не привязан к заказам, может удалить лишние отзывы | Очистка старых отзывов |
| Удаление через метаполе с ID заказа | Точная фильтрация по заказам и статусам | Требует доработки сбора отзывов | Удаление отзывов по статусам заказов |
| Массовое удаление через админку или WP CLI | Безопасно, подходит для ручного управления | Не подходит для сложных фильтров | Мелкие операции |