Проблема: Накопление неактивных вариаций товаров в WooCommerce
На крупных магазинах WooCommerce с вариативными товарами часто возникают ситуации, когда множество вариаций становятся неактивными (например, сняты с производства, неактуальны по параметрам), но остаются в базе. Это увеличивает размер базы, замедляет загрузку страниц и усложняет администрирование.
Как диагностировать наличие неактивных вариаций
- Перейдите в админку WooCommerce → Товары → выберите вариативный товар.
- Посмотрите список вариаций – неактивные отмечены как отключённые (статус «нет в наличии» или «черновик»).
- Выполните SQL-запрос для подсчёта неактивных вариаций:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_status != 'publish';Если число большое, стоит рассмотреть автоматизацию их удаления.
Пошаговое решение: автоматическое удаление неактивных вариаций с помощью кода
1. Создание WP-CLI команды для удаления
WP-CLI позволяет удобно выполнять задачи через командную строку. Ниже пример команды для удаления вариаций с статусом draft или private (неактивные):
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::add_command( 'wc-remove-inactive-variations', function() {
global $wpdb;
$statuses = ['draft', 'private'];
$placeholders = implode( ',', array_fill( 0, count( $statuses ), '%s' ) );
$query = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_status IN ($placeholders)",
...$statuses
);
$ids = $wpdb->get_col( $query );
$count = 0;
foreach ( $ids as $id ) {
wp_delete_post( $id, true );
$count++;
}
WP_CLI::success( "Удалено {$count} неактивных вариаций товаров" );
} );
}2. Добавление периодической задачи для автоматизации
Чтобы регулярно чистить базу, добавим cron-задачу, которая будет выполнять очистку раз в неделю:
function schedule_remove_inactive_variations() {
if ( ! wp_next_scheduled( 'remove_inactive_variations_hook' ) ) {
wp_schedule_event( time(), 'weekly', 'remove_inactive_variations_hook' );
}
}
add_action( 'wp', 'schedule_remove_inactive_variations' );
add_action( 'remove_inactive_variations_hook', function() {
$args = [
'post_type' => 'product_variation',
'post_status' => ['draft', 'private'],
'numberposts' => -1,
'fields' => 'ids',
];
$variations = get_posts( $args );
foreach ( $variations as $variation_id ) {
wp_delete_post( $variation_id, true );
}
});Проверка результата
- Запустите команду WP-CLI:
wp wc-remove-inactive-variations. В консоли должно отобразиться количество удалённых вариаций. - В админке WooCommerce проверьте, что неактивные вариации исчезли из товаров.
- Запустите SQL-запрос из раздела диагностики повторно – количество неактивных вариаций должно уменьшиться.
Частые ошибки и как их исправить
- Ошибка: WP-CLI команда не регистрируется.
Причина: Код добавлен в файл, который загружается до инициализации WP-CLI.
Решение: Поместите код вfunctions.phpили в отдельный плагин с проверкойdefined('WP_CLI') && WP_CLI. - Ошибка: Вариации не удаляются.
Причина: Неправильный статус вариаций или вариации защищены другими плагинами.
Решение: Проверьте статусы в базе, убедитесь что запрос ищет правильные статусы. Отключите временно плагины, которые могут блокировать удаление. - Ошибка: Cron-задача не запускается.
Причина: Сайт не получает посещений, WP-Cron не срабатывает.
Решение: Настройте системный cron для запускаwp-cron.phpили используйте плагин для контроля cron.
Практические советы по безопасности и производительности
- Удаляйте вариации только с проверенными статусами, чтобы не потерять активные данные.
- Перед массовым удалением сделайте резервную копию базы данных.
- Для больших сайтов запускайте WP-CLI команду в off-peak время, чтобы снизить нагрузку.
- При добавлении cron-задачи убедитесь, что она не запускается чаще, чем нужно (например, раз в неделю, а не каждый час).
Сравнение методов удаления неактивных вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудозатратно при большом количестве вариаций |
| WP-CLI команда | Автоматизация, быстрое выполнение, подходит для больших сайтов | Требует доступа к серверу и знаний WP-CLI |
| Cron-задача с кодом | Полная автоматизация без участия админа | Зависит от корректной работы WP-Cron, возможны ошибки при неправильной настройке |