Проблема: зависимые отзывы WooCommerce остаются после удаления товара
В WooCommerce отзывы о товарах сохраняются как комментарии с типом review. При удалении товара отзывы к нему остаются в базе данных, что приводит к "мертвым" отзывам на сайте или в админке, а также увеличивает размер базы.
Почему это происходит?
Стандартный функционал WordPress и WooCommerce не удаляет связанные комментарии автоматически при удалении товара (поста типа product). Это сделано для сохранения данных, но зачастую нежелательно.
Диагностика проблемы
Чтобы проверить наличие отзывов, связанных с удалёнными товарами, выполните SQL-запрос к базе данных WordPress:
SELECT comment_ID FROM wp_comments AS c
LEFT JOIN wp_posts AS p ON c.comment_post_ID = p.ID
WHERE p.ID IS NULL AND c.comment_type = 'review';Если запрос возвращает строки, значит в базе есть отзывы, у которых нет связанного товара.
Пошаговое решение: удаление зависимых отзывов через код
Реализуем функцию, которая удалит комментарии типа review, у которых отсутствует связанный товар.
function wpdream_delete_orphan_woocommerce_reviews() {
global $wpdb;
$table_comments = $wpdb->comments;
$table_posts = $wpdb->posts;
$query = "DELETE c FROM {$table_comments} c
LEFT JOIN {$table_posts} p ON c.comment_post_ID = p.ID
WHERE p.ID IS NULL AND c.comment_type = 'review'";
$deleted = $wpdb->query($query);
return $deleted;
}
// Запускаем функцию при активации темы или вручную через админ-панель
add_action('init', function () {
if (current_user_can('manage_options') && isset($_GET['delete_orphan_reviews'])) {
$deleted = wpdream_delete_orphan_woocommerce_reviews();
echo 'Удалено отзывов: ' . intval($deleted);
exit;
}
});Чтобы выполнить удаление, перейдите в админ-панели по адресу https://ваш-сайт.ru/wp-admin/?delete_orphan_reviews=1 под пользователем с правами администратора.
Автоматизация процесса
Для регулярной очистки можно запланировать задачу через WP-Cron:
function wpdream_schedule_orphan_reviews_cleanup() {
if (!wp_next_scheduled('wpdream_cleanup_orphan_reviews')) {
wp_schedule_event(time(), 'weekly', 'wpdream_cleanup_orphan_reviews');
}
}
add_action('wp', 'wpdream_schedule_orphan_reviews_cleanup');
add_action('wpdream_cleanup_orphan_reviews', 'wpdream_delete_orphan_woocommerce_reviews');Проверка результата
После выполнения удаления проверьте наличие отзывов без товара SQL-запросом из раздела диагностики. Также проверьте на сайте виджеты отзывов и страницы с отзывами, чтобы убедиться, что "мертвых" отзывов нет.
Частые ошибки и как их исправить
- Ошибка: Нет прав для выполнения удаления.
Решение: Убедитесь, что вы вошли как администратор. - Ошибка: Отзывы не удаляются, потому что комментарии имеют другой
comment_type.
Решение: Проверьте через phpMyAdmin, какой тип у ваших отзывов, и скорректируйте условие WHERE в запросе. - Ошибка: Функция не срабатывает при вызове из админки.
Решение: Проверьте, что код находится в файле темы или плагина, который активен, и в хукеinit.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Выполняйте удаление в период наименьшей нагрузки сайта, особенно если отзывов много.
- Регулярно оптимизируйте базу данных, чтобы избежать избыточных данных.
- Для больших сайтов с тысячами отзывов используйте WP CLI для пакетной очистки, чтобы избежать таймаутов.
Сравнение вариантов удаления отзывов
| Метод | Плюсы | Минусы |
|---|---|---|
| SQL-запрос напрямую | Быстро и эффективно | Риск повредить данные при ошибке, требует доступа к базе |
| PHP-функция с WP_Query и wp_delete_comment() | Безопасно, использует API WordPress | Медленнее, нагрузка на сервер |
| Плагины очистки базы | Удобно, не требует кода | Могут быть избыточными, не всегда точны |
В большинстве случаев рекомендуется комбинировать автоматизацию через WP Cron с контролем и резервным копированием.