Диагностика проблемы отсутствующих вариантов товаров в WooCommerce
В WooCommerce часто возникают ситуации, когда у товаров с вариациями отсутствуют все варианты — например, после импорта данных или массового редактирования. Такие товары становятся «пустыми» с точки зрения покупателя: они отображаются в каталоге, но не имеют доступных для выбора вариантов, что ухудшает UX и может снизить конверсию.
Чтобы убедиться, что у товара действительно отсутствуют варианты, можно проверить их количество программно:
global $product;
if ( $product->is_type('variable') ) {
$available_variations = $product->get_available_variations();
if ( empty($available_variations) ) {
// Вариантов нет
}
}
Если таких товаров много, ручное удаление неудобно и требует автоматизации.
Пошаговое решение: автоматическое удаление товаров без вариантов
1. Создание WP-CLI команды для поиска и удаления товаров без доступных вариантов
WP-CLI позволяет выполнять задачи администрирования из командной строки, что удобно для массовых операций.
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc-remove-empty-variables', function() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_product_type',
'value' => 'variable'
]
]
];
$query = new WP_Query($args);
$deleted = 0;
foreach ($query->posts as $post) {
$product = wc_get_product($post->ID);
if ( $product->is_type('variable') ) {
$variations = $product->get_available_variations();
if ( empty($variations) ) {
wp_delete_post($post->ID, true);
$deleted++;
}
}
}
WP_CLI::success("Удалено товаров без вариантов: $deleted");
});
}
Сохраните этот код в файле плагина или в functions.php темы (рекомендуется использовать плагин). Запуск команды:
wp wc-remove-empty-variables
2. Автоматизация удаления через WP-Cron
Для регулярного удаления можно добавить задачу в WP-Cron:
function wc_schedule_remove_empty_variable_products() {
if ( ! wp_next_scheduled( 'wc_remove_empty_variable_products_event' ) ) {
wp_schedule_event( time(), 'daily', 'wc_remove_empty_variable_products_event' );
}
}
add_action( 'wp', 'wc_schedule_remove_empty_variable_products' );
add_action( 'wc_remove_empty_variable_products_event', function() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_product_type',
'value' => 'variable'
]
]
];
$query = new WP_Query($args);
foreach ( $query->posts as $post ) {
$product = wc_get_product($post->ID);
if ( $product->is_type('variable') && empty($product->get_available_variations()) ) {
wp_delete_post($post->ID, true);
}
}
});
Такое решение позволит автоматически поддерживать базу товаров в чистоте без ручного вмешательства.
Проверка результата после внедрения
- Запустите WP-CLI команду вручную и убедитесь, что в ответе указано количество удалённых товаров.
- Откройте админку WooCommerce, проверьте, что товары без вариантов исчезли из списка.
- На фронтенде убедитесь, что в каталоге не отображаются товары с отсутствующими вариантами.
- Для WP-Cron проверьте, что задача в расписании имеется:
wp cron event list.
Частые ошибки и как их исправить
- Ошибка: Команда WP-CLI не срабатывает.
Причина: WP-CLI не установлен или код не загружается.
Решение: Проверьте наличие WP-CLI, загрузку плагина с командой и используйтеwp plugin list. - Ошибка: Товары не удаляются, хотя у них нет вариантов.
Причина: Неверный способ проверки вариаций.
Решение: Убедитесь, что вызывается$product->get_available_variations()и возвращается пустой массив. - Ошибка: Удаление не происходит при запуске WP-Cron.
Причина: WP-Cron отключён или событие не запланировано.
Решение: Проверьте наличие события черезwp cron event listи включите WP-Cron.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Используйте
wp_delete_post($post_id, true), чтобы удалить товар без помещения в корзину, экономя место. - Для больших магазинов с тысячами товаров добавьте пагинацию в WP_Query, чтобы избежать превышения лимита памяти.
- Внедрите логирование удалений в отдельный файл для аудита.
- Ограничьте запуск WP-Cron с помощью
DISABLE_WP_CRONи настройте системный cron для стабильности.
Сравнение способов удаления товаров без вариантов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, без кода | Медленно, не для массовых операций |
| WP-CLI команда | Быстро, удобно для разработчиков | Требует доступа к серверу и знания WP-CLI |
| WP-Cron автоматизация | Автоматически поддерживает базу чистой | Зависит от корректной работы WP-Cron |