Проблема: накапливаются неактивные отзывы со статусом «На модерации»
В интернет-магазинах WooCommerce отзывы часто требуют модерации, и если администратор не успевает их обработать, очередь «на модерации» растёт, забивая базу данных. Это замедляет работу сайта и усложняет администрирование. Автоматическое удаление таких отзывов через определённый срок решит проблему.
Диагностика проблемы
Чтобы проверить, сколько отзывов находятся в статусе «на модерации», выполните SQL-запрос к базе данных WordPress:
SELECT COUNT(*) FROM wp_comments WHERE comment_approved = '0' AND comment_type = 'review';Здесь comment_approved = '0' означает, что отзыв не одобрен (в ожидании модерации), а comment_type = 'review' фильтрует именно отзывы WooCommerce.
Если число отзывов на модерации велико (например, более 100), это повод настроить автоматическое удаление.
Пошаговое решение: автоматическое удаление старых отзывов на модерации
1. Создаём функцию для удаления отзывов старше N дней
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpmoney_delete_old_pending_reviews() {
global $wpdb;
$days = 30; // количество дней для хранения отзывов на модерации
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID отзывов на модерации старше $days
$comments_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments}
WHERE comment_approved = '0'
AND comment_type = 'review'
AND comment_date < %s",
$date_threshold
));
if (!empty($comments_to_delete)) {
foreach ($comments_to_delete as $comment_id) {
wp_delete_comment($comment_id, true); // true — без возможности восстановления
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавьте код для планирования задачи ежесуточно:
// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('wpmoney_daily_delete_pending_reviews')) {
wp_schedule_event(time(), 'daily', 'wpmoney_daily_delete_pending_reviews');
}
// Хук для выполнения удаления
add_action('wpmoney_daily_delete_pending_reviews', 'wpmoney_delete_old_pending_reviews');
// Удаляем событие при деактивации плагина или темы
function wpmoney_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wpmoney_daily_delete_pending_reviews');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmoney_daily_delete_pending_reviews');
}
}
// Зарегистрируйте вызов wpmoney_deactivate_cleanup() при деактивации плагина или темыПроверка результата
- Выполните SQL-запрос из раздела диагностики до и после запуска задачи, чтобы убедиться, что старые отзывы удалены.
- Проверьте логи WP-Cron (например, с помощью плагина WP Crontrol) на факт выполнения задачи.
- Проверьте, что новые отзывы с статусом «на модерации» создаются и не удаляются раньше срока.
Частые ошибки и как их исправить
- Функция wp_schedule_event не запускается: убедитесь, что ваш сайт посещают пользователи — WP-Cron запускается при заходе на сайт. Для теста можно вызвать функцию вручную.
- Удаляются все отзывы, включая одобренные: проверьте условие
comment_approved = '0'иcomment_type = 'review', чтобы фильтровать только нужные комментарии. - Проблемы с правами доступа к базе данных: используйте объект
$wpdbдля корректных запросов и убедитесь, что пользователь базы данных имеет права SELECT и DELETE.
Практические советы по производительности и безопасности
- Раз в месяц проверяйте размер таблицы
wp_commentsи оптимизируйте её с помощьюOPTIMIZE TABLE wp_comments. - Не устанавливайте слишком короткий срок хранения отзывов на модерации, чтобы не потерять новые отзывы из-за задержек в модерации.
- Для безопасности используйте
wp_delete_commentвместо прямого SQL DELETE — это удалит все связанные метаданные и обеспечит целостность данных. - Если у вас большой трафик, рассмотрите запуск задачи через системный cron, отключив WP-Cron и настроив внешнее расписание для более стабильного выполнения.
Сравнение методов удаления отзывов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + wp_delete_comment (код) | Гибкость, безопасность, интеграция с WordPress | Зависит от трафика, требует знаний PHP |
| SQL DELETE напрямую | Быстрая массовая очистка | Риск повреждения данных, не удаляет метаданные |
| Плагины очистки базы | Удобство, готовые интерфейсы | Дополнительная нагрузка, возможны конфликты |