Как удалить отзывы WooCommerce по статусу и дате через код

Диагностика проблемы: когда нужно массово удалить отзывы

В интернет-магазинах на 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Безопасно, подходит для ручного управленияНе подходит для сложных фильтровМелкие операции
Как использовать хуки в WordPress для настройки темы: практические примеры
20.11.2025
Как отключить AJAX в WooCommerce для ускорения загрузки страниц
16.05.2026
Как установить Redis кэш в WordPress и настроить его правильно
03.02.2026
Как удалить или отключить комментарии на отдельных страницах WordPress
16.07.2026
Как создать собственный шорткод в WordPress
08.11.2025