Диагностика проблемы: зачем удалять старые вариативные товары
В магазинах на WooCommerce с большим ассортиментом нередко накапливаются вариативные товары, которые давно не продаются или устарели. Они занимают место в базе данных, замедляют работу сайта и усложняют работу с каталогом. Автоматизация удаления таких товаров помогает поддерживать базу в порядке без ручной проверки.
Как определить, какие вариативные товары можно удалить
- Товары без заказов за последние 12 месяцев;
- Товары со статусом "черновик" или "в ожидании" более 6 месяцев;
- Вариации товара, которые не используются в заказах или неактивны;
- Товары, помеченные меткой "устаревший" или с кастомным полем, указывающим на устаревание.
Пошаговое решение: скрипт для автоматического удаления старых вариативных товаров
Для реализации решения используем WP-CLI или создание PHP-скрипта с использованием WP Cron для регулярного запуска.
1. Подключение и подготовка
Создайте в папке темы или плагина файл delete-old-variable-products.php. В нем опишите функцию для поиска и удаления товаров.
2. Код для поиска и удаления старых вариативных товаров
<?php
function wpguest_delete_old_variable_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => ['publish', 'draft', 'pending'],
'tax_query' => [[
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
]],
'date_query' => [[
'column' => 'post_date',
'before' => '1 year ago',
]],
'fields' => 'ids',
];
$old_products = get_posts($args);
foreach ($old_products as $product_id) {
// Проверяем, есть ли у товара заказы
$orders = wc_get_orders([
'limit' => 1,
'status' => ['completed', 'processing', 'on-hold'],
'product_id' => $product_id,
]);
if (empty($orders)) {
// Удаляем вариации
$product = wc_get_product($product_id);
if ($product && $product->is_type('variable')) {
$variations = $product->get_children();
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true);
}
}
// Удаляем сам товар
wp_delete_post($product_id, true);
}
}
}
// Запуск функции через WP-Cron (например, раз в неделю)
add_action('wpguest_weekly_cleanup_hook', 'wpguest_delete_old_variable_products');
if (!wp_next_scheduled('wpguest_weekly_cleanup_hook')) {
wp_schedule_event(time(), 'weekly', 'wpguest_weekly_cleanup_hook');
}
?>3. Добавление в functions.php или плагин
Этот код можно добавить в functions.php вашей темы или создать отдельный мини-плагин для удобства.
Проверка результата после внедрения
- Запустите функцию вручную через WP-CLI:
wp eval 'wpguest_delete_old_variable_products();' - Проверьте, что товары, отвечающие критериям, отсутствуют в списке продуктов WooCommerce.
- Проверьте базу данных — таблица
wp_postsне содержит удалённых товаров и вариаций. - Убедитесь, что на сайте не появляются ошибки и отсутствуют ссылки на удалённые товары.
Частые ошибки и как их исправить
- Удаление товаров с активными заказами: Проверьте корректность фильтра по заказам — функция
wc_get_ordersдолжна возвращать пустой массив для удаления. - Вариации не удаляются: Убедитесь, что используете метод
get_children()для получения вариаций и вызываетеwp_delete_postдля каждой. - Функция не запускается по расписанию: Проверьте, что события WP-Cron активны, и нет конфликтов с плагинами, блокирующими WP-Cron.
- Перегрузка сервера при большом количестве товаров: Разбейте удаление на порции, например, по 50 товаров за один запуск.
Практические советы по безопасности и производительности
- Используйте
wp_delete_postс параметромtrueдля полного удаления, включая метаданные. - Перед удалением сделайте резервную копию базы.
- Для больших магазинов ограничьте количество удаляемых товаров за один запуск, используя параметр
posts_per_pageи WP Cron с коротким интервалом. - Добавьте логирование удалённых товаров для контроля.
- Не удаляйте товары, если вы не уверены в отсутствии заказов — используйте дополнительные проверки по метаданным и заказам.
Сравнение способов автоматизации удаления
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админ-панель | Простота, контроль | Трудозатратно, риск ошибок при большом объёме |
| Плагин для очистки товаров (например, Bulk Delete) | Интерфейс, фильтры | Может быть платным, нагрузка на сайт |
| Код на PHP с WP-Cron (описанный способ) | Автоматизация, гибкость, кастомизация | Требует навыков, настройка WP-Cron |