В чем проблема с отключёнными вариантами товаров в WooCommerce?
В интернет-магазинах на WooCommerce часто накапливаются отключённые варианты товаров (вариации), которые больше не используются или временно скрыты. Они занимают место в базе данных, замедляют загрузку страниц и могут влиять на корректность работы фильтров и поиска. В некоторых случаях устаревшие вариации создают путаницу для администраторов.
Ручное удаление таких вариантов через админку неудобно и долго, особенно если их тысячи. Поэтому важно организовать автоматическую очистку базы данных от отключённых вариантов.
Диагностика: как проверить наличие отключённых вариантов и их влияние
- В базе данных выполнить SQL-запрос для подсчёта отключённых вариантов:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_status = 'trash'; - Проверить количество вариантов с пост-статусом
draftилиprivate, которые могут быть скрыты:SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_status IN ('draft', 'private'); - Использовать плагин Query Monitor или аналог для выявления замедленных запросов, связанных с вариациями.
- На странице редактирования товара проверить вручную список вариантов и их статусы.
Пошаговое решение: скрипт для автоматического удаления отключённых вариантов товаров
Реализуем WP-CLI команду и функцию для удаления вариантов с пост-статусом trash или draft у товаров. Код помещается в файл functions.php темы или в отдельный плагин.
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc-clean-variations', function() {
global $wpdb;
$statuses = [ 'trash', 'draft', 'private' ];
$placeholders = implode(',', array_fill(0, count($statuses), '%s'));
$query = "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_status IN ($placeholders)";
$ids = $wpdb->get_col($wpdb->prepare($query, ...$statuses));
if (empty($ids)) {
WP_CLI::success('Нет отключённых вариантов для удаления.');
return;
}
foreach ($ids as $id) {
wp_delete_post($id, true);
}
WP_CLI::success(count($ids) . ' отключённых вариантов товаров удалены полностью.');
});
}
Запустить команду в терминале на сервере в каталоге сайта:
wp wc-clean-variationsЕсли WP-CLI недоступен, можно использовать аналогичный функционал через AJAX или CRON, но WP-CLI предпочтительнее для разовой очистки.
Альтернативный код для удаления отключённых вариантов без WP-CLI
function wc_delete_disabled_variations() {
global $wpdb;
$statuses = [ 'trash', 'draft', 'private' ];
$placeholders = implode(',', array_fill(0, count($statuses), '%s'));
$query = "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_status IN ($placeholders)";
$ids = $wpdb->get_col($wpdb->prepare($query, ...$statuses));
if (empty($ids)) {
return 'Нет отключённых вариантов для удаления.';
}
foreach ($ids as $id) {
wp_delete_post($id, true);
}
return count($ids) . ' отключённых вариантов товаров удалены.';
}
// Для запуска вызовите wc_delete_disabled_variations() один раз вручную или через WP-CLI shell.
Проверка результата после внедрения
- Повторите SQL-запросы из блока диагностики — количество отключённых вариантов должно быть равно нулю.
- В админке WooCommerce убедитесь, что в списке вариантов товара исчезли отключённые.
- Проверьте работу фильтров и поиска вариантов — они должны работать быстрее и корректнее.
- Просмотрите логи ошибок и нагрузку на базу данных, чтобы убедиться в отсутствии новых проблем.
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, что функция вызывается и у пользователя есть права на удаление постов.
- Вариации не удаляются из базы, а только переводятся в корзину: обязательно используйте
wp_delete_post($id, true)для полного удаления. - Удаляются нужные варианты: уточните список статусов, которые считаются отключёнными. Иногда нужно расширить или сузить условия выборки.
- Ошибки базы данных: проверьте префикс таблиц и используйте глобальную переменную
$wpdbдля запросов.
Практические советы по безопасности и производительности
- Перед запуском любых массовых удалений сделайте резервную копию базы данных.
- Не запускайте удаление на пиковых нагрузках сайта — лучше в ночное время.
- Если на сайте много вариантов, разбейте удаление на пакеты по 100-200 штук, чтобы не перегружать сервер.
- Используйте WP-CLI, чтобы избежать тайм-аутов PHP и сокращать время выполнения.
- Регулярно оптимизируйте таблицы базы данных с помощью
OPTIMIZE TABLE wp_postsпосле удаления.
Сравнение вариантов реализации удаления отключённых вариантов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| WP-CLI команда | Быстро, без нагрузки на сайт, удобство автоматизации | Требует доступа к серверу и WP-CLI | Лучший вариант для разовых и регулярных очисток |
| Функция PHP в теме/плагине | Можно запускать из админки, не нужен доступ к серверу | Может вызвать тайм-ауты, нагрузку | Использовать с осторожностью, лучше на малых сайтах |
| Плагины очистки базы | Простота использования, графический интерфейс | Могут удалять лишнее, не всегда гибкие | Рекомендуется для новичков, но с проверкой |