Проблема: накопление устаревших отзывов в WooCommerce и их влияние на производительность
В интернет-магазинах на WooCommerce со временем накапливается большое количество отзывов. Многие из них могут быть нерелевантными, устаревшими или спамом. Это увеличивает нагрузку на базу данных, замедляет загрузку страниц и ухудшает пользовательский опыт. Решение — настроить автоматическое удаление отзывов старше определённого времени с помощью WP-Cron.
Диагностика проблемы: как понять, что отзывы нужно чистить
- Проверьте количество комментариев с типом
review(отзывы WooCommerce) в базе данных. Для этого используйте SQL-запрос в phpMyAdmin:
SELECT COUNT(*) FROM wp_comments WHERE comment_type = 'review';- Если число отзывов превышает несколько тысяч, а магазин не использует их активно для аналитики, это повод для очистки.
- Проанализируйте возраст отзывов — выберите отзывы старше 1 года:
SELECT COUNT(*) FROM wp_comments WHERE comment_type = 'review' AND comment_date < NOW() - INTERVAL 1 YEAR;- Если большая часть — устаревшие отзывы, можно настроить их автоматическое удаление.
Пошаговое решение: настройка WP-Cron для удаления старых отзывов
1. Создаём функцию удаления старых отзывов
Добавьте в файл functions.php вашей дочерней темы или в кастомный плагин следующий код. В примере удаляются отзывы старше 365 дней.
function wplog_delete_old_woocommerce_reviews() {
global $wpdb;
$days = 365; // сколько дней считать "старыми"
$wpdb->query(
$wpdb->prepare(
"DELETE FROM $wpdb->comments WHERE comment_type = 'review' AND comment_date < NOW() - INTERVAL %d DAY",
$days
)
);
}2. Регистрируем событие WP-Cron
Добавьте событие, которое будет запускаться ежедневно:
function wplog_schedule_delete_old_reviews() {
if ( ! wp_next_scheduled( 'wplog_daily_delete_old_reviews' ) ) {
wp_schedule_event( time(), 'daily', 'wplog_daily_delete_old_reviews' );
}
}
add_action( 'wp', 'wplog_schedule_delete_old_reviews' );
add_action( 'wplog_daily_delete_old_reviews', 'wplog_delete_old_woocommerce_reviews' );3. Очистка запланированного события при деактивации
Чтобы избежать дублирования, удалите событие при деактивации плагина или отключении темы:
function wplog_clear_scheduled_delete() {
$timestamp = wp_next_scheduled( 'wplog_daily_delete_old_reviews' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wplog_daily_delete_old_reviews' );
}
}
register_deactivation_hook( __FILE__, 'wplog_clear_scheduled_delete' );Проверка результата после внедрения
- Запустите функцию вручную (для теста) в админке через WP-CLI или временно вызовом из шаблона:
add_action('admin_init', function() {
wplog_delete_old_woocommerce_reviews();
});- Проверьте количество отзывов до и после удаления SQL-запросом из раздела диагностики.
- Просмотрите журнал ошибок сервера и логи WP-Cron (например, с помощью плагина WP Crontrol) на предмет выполнения задачи.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается: WP-Cron зависит от посещений сайта. На малопосещаемых сайтах стоит настроить системный cron, вызывающий wp-cron.php. Например, через crontab:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1- Удаляются не те комментарии: Проверьте, что
comment_type = 'review'— именно так WooCommerce помечает отзывы. Для других типов комментариев используйте соответствующий фильтр. - Удаление занимает слишком много времени: Если отзывов очень много, разбейте удаление на части с помощью LIMIT и запускайте в цикле.
Практические советы по безопасности и производительности
- Перед удалением всегда делайте резервное копирование базы, чтобы избежать потери данных.
- Добавьте логирование в функцию удаления, чтобы отслеживать, сколько записей удалено:
function wplog_delete_old_woocommerce_reviews() {
global $wpdb;
$days = 365;
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $wpdb->comments WHERE comment_type = 'review' AND comment_date < NOW() - INTERVAL %d DAY",
$days
)
);
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log('Удалено отзывов старше '.$days.' дней: ' . $deleted);
}
}- Для магазинов с большим количеством отзывов рассмотрите возможность архивации вместо удаления.
- Для ускорения работы базы создайте индекс по полю
comment_typeв таблицеwp_comments, если его нет.
Сравнение подходов: плагин vs. кастомный код
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин очистки отзывов | Простота настройки, готовый интерфейс | Дополнительная нагрузка, ограниченная гибкость | Использовать при небольшом объёме отзывов |
| Кастомный WP-Cron код | Высокая гибкость, минимальная нагрузка | Требует навыков программирования | Оптимально для крупных магазинов и специфических условий |