Что значит «неиспользуемые варианты товаров» в WooCommerce и зачем их отключать?
В WooCommerce товары с вариациями (например, разные цвета или размеры) могут иметь варианты, которые временно или постоянно не используются — например, закончились на складе или устарели. Если таких вариантов много, они создают путаницу в админке, замедляют загрузку страниц и ухудшают пользовательский опыт. Автоматическое отключение таких вариантов помогает поддерживать каталог в актуальном состоянии без постоянного ручного контроля.
Диагностика проблемы: как понять, что варианты нужно отключать
Проверьте наличие вариантов с нулевым запасом и статусом «опубликовано». Для этого достаточно SQL-запроса или использования WP-CLI:
wp db query "SELECT p.ID, pm.meta_value as stock_status FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock';"Если таких вариантов много и они мешают работе — пора автоматизировать их отключение.
Пошаговое решение: как автоматически отключать неиспользуемые варианты товаров
1. Добавляем функцию в functions.php или собственный плагин
Функция проверяет варианты с запасом 0 и статусом "в наличии", и меняет их статус на "черновик" или "отключено".
function disable_unused_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
'post_status' => 'publish',
];
$variations = get_posts($args);
foreach ($variations as $variation) {
// Меняем статус вариации на черновик
wp_update_post([
'ID' => $variation->ID,
'post_status' => 'draft',
]);
}
}
// Запускаем функцию по крону или вручную
add_action('wp_loaded', 'disable_unused_variations');2. Автоматизация с помощью WP-Cron
Чтобы запускать функцию регулярно, добавим хук WP-Cron. Например, раз в сутки:
function schedule_disable_variations() {
if (!wp_next_scheduled('disable_unused_variations_daily')) {
wp_schedule_event(time(), 'daily', 'disable_unused_variations_daily');
}
}
add_action('wp', 'schedule_disable_variations');
add_action('disable_unused_variations_daily', 'disable_unused_variations');3. Проверка и отмена расписания при необходимости
function unschedule_disable_variations() {
$timestamp = wp_next_scheduled('disable_unused_variations_daily');
if ($timestamp) {
wp_unschedule_event($timestamp, 'disable_unused_variations_daily');
}
}Проверка результата после внедрения
- Зайдите в админку WooCommerce → Товары → Вариации, фильтруйте по статусу "Опубликовано" и "Черновик".
- Убедитесь, что варианты с нулевым запасом теперь в статусе "черновик" и не отображаются в каталоге.
- Проверьте на сайте, что такие варианты не доступны для выбора покупателями.
- Для дополнительной проверки выполните SQL-запрос из раздела диагностики и убедитесь, что нет опубликованных вариантов с "outofstock".
Частые ошибки и их исправление
- Функция не срабатывает при запуске WP-Cron: проверьте, включен ли WP-Cron (опция DISABLE_WP_CRON не должна быть true), убедитесь, что вызов хука совпадает с зарегистрированным.
- Варианты не меняют статус: проверьте права пользователя, от имени которого выполняется функция, и нет ли ошибок в wp_update_post (например, неверный ID).
- Варианты с наличием остаются в статусе "черновик": убедитесь, что метаполе _stock_status корректно отражает наличие товара.
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами вариантов используйте пагинацию в запросах, чтобы не перегружать сервер:
$paged = 1;
do {
$args['paged'] = $paged;
$variations = get_posts($args);
// обработка вариаций
$paged++;
} while (!empty($variations));- Включите логирование ошибок в функцию, чтобы отслеживать сбои.
- Ограничьте запуск функции на время низкой нагрузки сайта.
- Для контроля используйте Clearfy Pro от WPShop для оптимизации и мониторинга базы данных.
Сравнение вариантов реализации автоматического отключения
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Быстрая реализация, контроль в коде | Риск при обновлении темы, требует навыков |
| Отдельный плагин | Легко деактивировать, переносимость | Нужно писать плагин, обновлять |
| Плагины сторонних разработчиков | Готовое решение, поддержка | Могут быть избыточными, нагрузка |