Диагностика проблемы: зачем нужно автоматическое удаление устаревших товаров и контента
В интернет-магазинах на WooCommerce часто возникает задача удалить товары и связанный с ними контент, которые устарели, неактивны или имеют "срок годности" — например, сезонные предложения, товары с истекшим сроком годности, или устаревшие акции. Ручное удаление неэффективно при большом каталоге, а оставление таких товаров ухудшает пользовательский опыт и SEO.
Признаки необходимости автоматизации удаления:
- Большой каталог с регулярно устаревающими товарами
- Наличие метаполей с датами истечения (срок годности)
- Падение конверсии или рост числа неактуальных товаров
Как настроить автоматическое удаление товаров в WooCommerce по дате
Добавление метаполя с датой истечения товара
Для начала нужно убедиться, что у товаров есть пользовательское поле с датой истечения. Например, метаполе _expiration_date, хранящее дату в формате Y-m-d.
Добавление метаполя можно реализовать через ACF или вручную, например, в админке:
add_action('woocommerce_product_options_general_product_data', function() {
woocommerce_wp_text_input([
'id' => '_expiration_date',
'label' => __('Дата истечения', 'woocommerce'),
'placeholder' => 'YYYY-MM-DD',
'desc_tip' => 'true',
'description' => __('Дата, после которой товар считается устаревшим и будет автоматически удалён.', 'woocommerce'),
'type' => 'date'
]);
});
add_action('woocommerce_process_product_meta', function($post_id) {
if (isset($_POST['_expiration_date'])) {
update_post_meta($post_id, '_expiration_date', sanitize_text_field($_POST['_expiration_date']));
}
});Реализация функции очистки товаров по сроку годности
Создадим функцию, которая будет находить и удалять все товары, у которых текущая дата больше даты в метаполе _expiration_date. Для запуска используем WP-Cron или системный cron, если есть доступ.
function wptemp_delete_expired_products() {
$today = date('Y-m-d');
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_expiration_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE'
]
],
'fields' => 'ids',
'post_status' => 'publish'
];
$expired_products = get_posts($args);
if (empty($expired_products)) {
return;
}
foreach ($expired_products as $product_id) {
wp_delete_post($product_id, true); // true - удалить без корзины
}
}
// Регистрация ежедневного задания
add_action('wptemp_daily_expired_products_cleanup', 'wptemp_delete_expired_products');
if (!wp_next_scheduled('wptemp_daily_expired_products_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptemp_daily_expired_products_cleanup');
}Пошаговое руководство по внедрению
- Добавьте метаполе
_expiration_dateк товарам через функцию или плагин ACF. - Заполните даты истечения для товаров, которые планируете удалять автоматом.
- Скопируйте и вставьте код функции очистки в файл
functions.phpвашей дочерней темы или создайте мини-плагин. - Убедитесь, что WP-Cron работает, или настройте системный cron для вызова
wp cron event run --due-now. - Проверьте логи и базу после первого запуска, чтобы убедиться, что товары удаляются корректно.
Проверка результатов после внедрения
Для проверки работы системы:
- Создайте тестовый товар с датой истечения, например, вчерашней.
- Запустите вручную функцию
wptemp_delete_expired_products();через WP-CLI (wp eval 'wptemp_delete_expired_products();') или временно вызовите в админке. - Проверьте, что товар удалился из каталога и базы (таблица
wp_posts). - Проверьте отсутствие ошибок в логах сервера и WP.
Частые ошибки и способы их исправления
- Нет удаления товаров: Проверьте, что метаполе
_expiration_dateзаполнено корректно и в формате YYYY-MM-DD. - Функция не запускается: Убедитесь, что WP-Cron активен (проверьте
wp-cron.php), либо настройте системный cron. - Удаление не происходит, потому что товары в черновиках или другом статусе: В запросе указано
post_status => 'publish', если хотите удалять и другие статусы, добавьте их в массив. - Потеря данных: Используйте
wp_delete_post($id, true)с осторожностью — это безвозвратно удаляет товар.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных, особенно если удаляете много товаров.
- Не запускайте удаление на больших каталогах без ограничения по числу удаляемых товаров за один раз — разбивайте на партии с помощью
posts_per_pageиoffset. - Используйте транзакции базы данных, если планируете сложные операции с зависимыми данными (например, связи с заказами).
- Для повышения производительности используйте индексацию по метаполям даты в базе данных.
- Если хотите повысить контроль, вместо удаления можно переводить товары в статус черновика или в отдельную категорию «устаревшие».
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление через WP-Cron и код | Полный контроль, без сторонних плагинов, легко кастомизируется | Требуется навыки, возможно нагрузка на БД при больших каталогах |
| Плагины автоматического удаления | Простота использования, готовые интерфейсы | Зависимость от плагина, ограниченная гибкость, возможные конфликты |
| Ручное удаление через админку | Простота, нет технических требований | Трудозатратно, невозможно масштабировать |