Проблема: накопление устаревших отзывов в WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость удалять отзывы, которые устарели или потеряли актуальность, например, отзывы старше определённого срока. Ручное удаление большого количества отзывов неудобно и ресурсоёмко. Автоматизация этого процесса позволяет поддерживать актуальность отзывов и оптимизировать базу данных.
Диагностика проблемы
Для проверки наличия устаревших отзывов выполните SQL-запрос в базе данных WordPress:
SELECT comment_ID, comment_date, comment_content FROM wp_comments WHERE comment_type = 'review' AND comment_date < NOW() - INTERVAL 365 DAY;Здесь comment_type = 'review' фильтрует отзывы WooCommerce (если они имеют такой тип, в зависимости от темы/плагинов). Если отзывы обычные комментарии, то можно просто фильтровать по comment_post_ID — ID товара. Убедитесь, что отзывы действительно устарели и подлежат удалению.
Пошаговое решение: автоматическое удаление отзывов старше 1 года
1. Создаём функцию удаления отзывов по дате
function wpset_delete_old_woocommerce_reviews() {
global $wpdb;
// Удаляем отзывы старше 365 дней
$days = 365;
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE c FROM {$wpdb->comments} AS c
INNER JOIN {$wpdb->posts} AS p ON c.comment_post_ID = p.ID
WHERE p.post_type = 'product'
AND c.comment_approved = 1
AND c.comment_date < NOW() - INTERVAL %d DAY",
$days
)
);
if ( false === $deleted ) {
error_log('Ошибка при удалении старых отзывов WooCommerce');
} else {
error_log("Удалено старых отзывов WooCommerce: $deleted");
}
}2. Добавляем регулярный запуск с помощью WP Cron
add_action('wpset_delete_old_reviews_cron_hook', 'wpset_delete_old_woocommerce_reviews');
function wpset_schedule_reviews_cleanup() {
if (! wp_next_scheduled('wpset_delete_old_reviews_cron_hook')) {
wp_schedule_event(time(), 'daily', 'wpset_delete_old_reviews_cron_hook');
}
}
add_action('wp', 'wpset_schedule_reviews_cleanup');3. Опционально: ручной запуск через административную страницу или WP-CLI
// Ручной запуск в админке через кнопку
add_action('admin_post_wpset_manual_delete_reviews', function() {
if (current_user_can('manage_options')) {
wpset_delete_old_woocommerce_reviews();
wp_redirect(admin_url('edit-comments.php?post_type=product&wpset_deleted=1'));
exit;
}
});Проверка результата после внедрения
- Подождите запуск cron-задачи (ежедневно) или вызовите функцию вручную.
- Проверьте количество отзывов в админке WooCommerce → Товары → Отзывы.
- Выполните SQL-запрос из блока диагностики, чтобы убедиться, что старые отзывы удалены.
- Проверьте
debug.log(если включён) на наличие сообщений об удалении или ошибках.
Частые ошибки и причины
- Отсутствие cron-задачи: WP Cron работает при посещении сайта. Если сайт малопосещаемый, запланированное удаление может не сработать вовремя. Используйте внешние cron или WP-CLI.
- Неправильный фильтр отзывов: В некоторых темах отзывы могут иметь другой тип комментариев. Проверьте, что удаляются именно отзывы товаров.
- Проблемы с правами: Функция удаления должна работать под пользователем с правами администратора.
- Ошибки в SQL-запросе: Используйте
$wpdb->prepareдля безопасности и правильной подстановки переменных.
Практические советы по безопасности и производительности
- Резервное копирование: Перед автоматическим удалением создайте резервную копию базы данных.
- Разбивка удаления: Если отзывов много, удаление за один запрос может нагружать базу. Реализуйте пакетную очистку по 100-200 записей.
- Логирование: Включите логирование для контроля работы функции.
- Отключение WP Cron: Если используется системный Cron, выключите WP Cron в
wp-config.phpчерезdefine('DISABLE_WP_CRON', true);
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Применение |
|---|---|---|---|
| WP Cron + SQL-запрос | Автоматизация, простота реализации | Зависит от посещаемости сайта, нагрузка при большом объёме | Средние и крупные магазины с регулярным трафиком |
| WP-CLI скрипт | Полный контроль, можно запускать вручную/по расписанию | Требуется доступ к серверу, технические навыки | Магазины с доступом к серверу и системному cron |
| Плагины автоматической очистки | Простота установки, часто есть интерфейс | Может создавать нагрузку, не всегда гибкие настройки | Небольшие магазины без навыков программирования |