Диагностика проблемы отсутствующих вариаций в WooCommerce
В интернет-магазинах на WooCommerce часто появляются товары с вариациями, которые по разным причинам становятся недоступными (отсутствуют на складе, сняты с производства и т.п.). Если все вариации товара отсутствуют, такой товар теряет смысл и мешает покупателям. Ручное удаление таких товаров неудобно при большом каталоге. Поэтому нужна автоматизация удаления товаров, у которых нет доступных вариаций.
Как определить, что у товара нет доступных вариаций?
Каждый вариативный товар в WooCommerce хранит вариации как дочерние посты с типом product_variation. У вариаций может быть мета-ключ _stock_status со значением instock или outofstock. Если у всех вариаций статус outofstock, товар считается отсутствующим.
Пошаговое решение: удаление товаров без доступных вариаций
Для автоматизации процесса напишем кастомный скрипт, который можно запускать вручную или через WP-Cron. Он просматривает все вариативные товары, проверяет статус вариаций и удаляет товары без доступных вариаций.
1. Функция для проверки вариаций и удаления товаров
function delete_variation_products_without_stock() {
// Получаем все вариативные товары
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
],
],
'fields' => 'ids',
];
$product_ids = get_posts($args);
foreach ($product_ids as $product_id) {
$variations = new WP_Query([
'post_type' => 'product_variation',
'post_parent' => $product_id,
'posts_per_page' => -1,
'fields' => 'ids',
]);
$has_instock = false;
foreach ($variations->posts as $variation_id) {
$stock_status = get_post_meta($variation_id, '_stock_status', true);
if ($stock_status === 'instock') {
$has_instock = true;
break;
}
}
if (!$has_instock) {
// Удаляем товар без доступных вариаций
wp_delete_post($product_id, true); // true для полного удаления
}
}
}2. Запуск функции по расписанию с WP-Cron
Чтобы автоматизировать удаление, регистрируем событие в WP-Cron, например, раз в сутки:
if (!wp_next_scheduled('daily_delete_outofstock_variable_products')) {
wp_schedule_event(time(), 'daily', 'daily_delete_outofstock_variable_products');
}
add_action('daily_delete_outofstock_variable_products', 'delete_variation_products_without_stock');Проверка результата после внедрения
- Запустите функцию вручную из темы или плагина, например, добавив вызов
delete_variation_products_without_stock();в файлfunctions.phpи обновив сайт. - Проверьте, что товары с вариациями, все из которых имеют
_stock_status=outofstock, удалены из админки WooCommerce. - В базе данных таблице
wp_postsэти товары теперь отсутствуют. - Убедитесь, что товары с хотя бы одной вариацией в наличии не удалены.
Частые ошибки и способы исправления
- Ошибка: Функция не удаляет товары.
Причина: Вариации не имеют корректного мета-ключа_stock_statusили статус хранится в другом месте.
Решение: Проверьте метаполя вариаций через phpMyAdmin или плагин Debug Info. Убедитесь, что_stock_statusиспользуется и содержит 'instock' или 'outofstock'. - Ошибка: Функция удаляет товары с доступными вариациями.
Причина: Некорректная логика проверки статуса.
Решение: Проверьте циклы и условиеif ($stock_status === 'instock')— оно должно прерывать проверку и не удалять товар. - Ошибка: WP-Cron не запускается.
Причина: На сервере отключены внешние запросы или нет посещений сайта.
Решение: Настройте системный cron для запуска wp-cron.php или запускайте функцию вручную.
Практические советы по безопасности и производительности
- Удаление товаров — необратимая операция. Рекомендуется сначала делать резервные копии базы данных.
- Запуск функции на больших магазинах может нагрузить сервер. Оптимизируйте запросы, например, обрабатывайте товары пакетно.
- Добавьте журналирование удалённых товаров для аудита, например, через
error_log()или запись в отдельную таблицу. - Для более гибкой автоматизации можно расширить скрипт, учитывая даты последнего обновления товара или другие параметры.
Сравнение подходов: плагин vs кастомный код
| Критерий | Плагин | Кастомный код | Компромисс |
|---|---|---|---|
| Гибкость | Ограничена настройками | Максимальная | Использовать плагин с возможностью добавления своих фильтров |
| Производительность | Может потреблять ресурсы | Оптимизирован под задачу | Код с кешированием и пакетной обработкой |
| Безопасность | Зависит от разработчика | Зависит от качества кода | Регулярные обновления и код-ревью |
| Автоматизация | Часто встроена | Нужно настраивать самостоятельно | Добавление WP-Cron |