Диагностика проблемы: зачем и когда нужно удалять старые товары
В интернет-магазинах на WooCommerce со временем накапливаются устаревшие товары, которые уже не продаются или устарели по срокам. Их хранение занимает место в базе данных, замедляет работу сайта и усложняет администрирование. Особенно актуально это для магазинов с сезонными товарами, ограниченными коллекциями или товарами с датой годности.
Основная задача — автоматически удалять или архивировать такие товары по заданным срокам без ручного поиска и удаления.
Как определить «старый» товар в WooCommerce
Обычно критерии отбора товаров для удаления:
- Дата создания товара (post_date) старше заданного периода
- Пользовательские мета-поля с датой окончания продажи (например, _expiration_date)
- Статус товара (например, только опубликованные)
В WooCommerce товары — это тип записи product, поэтому с ними можно работать как с обычными постами.
Пошаговое решение: удаление товаров по дате создания
1. Создание функции для удаления старых товаров
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код. Он удалит товары, созданные более 180 дней назад:
function delete_old_woocommerce_products() {
$days_old = 180; // количество дней
$date_query = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date_query,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$old_products = get_posts($args);
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true); // true — принудительное удаление, минуя корзину
}
}2. Запуск функции вручную или через WP-CLI
Для однократного запуска можете вызвать функцию из консоли WP-CLI:
wp eval 'delete_old_woocommerce_products();'Или временно добавить вызов в functions.php, например, при загрузке админки:
add_action('admin_init', 'delete_old_woocommerce_products');После успешного запуска удалите этот хук, чтобы не удалять товары при каждом заходе в админку.
Удаление товаров по пользовательскому мета-полю (например, дате окончания продажи)
Если в товарах есть мета-поле _expiration_date со значением в формате YYYY-MM-DD, можно удалить устаревшие товары так:
function delete_expired_products() {
$today = date('Y-m-d');
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => '_expiration_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$expired_products = get_posts($args);
foreach ($expired_products as $product_id) {
wp_delete_post($product_id, true);
}
}Проверка результата после внедрения
- В админке WooCommerce перейдите в список товаров — удалённые товары должны исчезнуть.
- Проверьте базу данных в таблице
wp_posts, чтобы убедиться, что записи типаproductс датами старше заданных отсутствуют. - Если вы используете кэширование, очистите кэш сайта и браузера.
- Можно добавить логирование удаления, например, записывать ID удалённых товаров в файл или опцию, чтобы убедиться в работе скрипта.
Частые ошибки и как их исправить
- Ничего не удаляется: проверьте формат даты и параметры
date_query. Убедитесь, что товары действительно старше указанного срока. - Удаляются не те товары: проверьте правильность условий в
meta_queryиdate_query, возможно, стоит добавить дополнительные фильтры. - Сайт падает при выполнении: если товаров очень много, удаление в одном запросе может перегрузить сервер. Разбейте удаление на партии по 50-100 товаров.
- Удаление не происходит сразу: если используется кеширование или CDN, обновите кеш.
Практические советы по безопасности и производительности
- Запускать удаление лучше через WP-CLI или по cron с разбивкой на небольшие партии.
- Перед удалением делайте резервную копию базы данных.
- Если нужно не удалять, а скрывать устаревшие товары — меняйте статус поста на
draftилиprivate. - Для больших магазинов используйте WP_Query с пагинацией и удаляйте товары по частям, чтобы избежать таймаута.
- Добавьте логирование: например, через
error_logили запись в отдельную таблицу для аудита.
Сравнение подходов удаления товаров
| Метод | Код | Плагин | Преимущества | Недостатки |
|---|---|---|---|---|
| Удаление по дате создания | Простой код на PHP | Нет | Быстро реализуется, не требует установки плагинов | Не подходит, если критерии сложнее |
| Удаление по мета-полю | Код с meta_query | Нет | Гибко для кастомных условий | Требует правильного заполнения мета-полей |
| Плагины для очистки WooCommerce | — | Например, WP Bulk Delete | Удобный интерфейс, дополнительные функции | Может быть избыточным, нагрузка на сайт |