Диагностика проблемы: зачем и когда нужно удалять товары по срокам
В интернет-магазинах на WooCommerce часто возникает задача автоматического удаления товаров, которые устарели или перестали быть актуальными: например, сезонные предложения, товары с истекшим сроком годности или временные акции. Ручное удаление — рутинный и ошибкоопасный процесс, особенно при большом каталоге.
Проверить необходимость автоматизации можно, посмотрев на следующие признаки:
- Большое количество товаров с ограниченным сроком актуальности.
- Регулярные обновления каталога, требующие удаления устаревших товаров.
- Проблемы с производительностью базы данных из-за большого количества неактуальных товаров.
Как реализовать автоматическое удаление товаров по срокам в WooCommerce
1. Добавляем дату истечения срока действия товара
Для начала необходимо иметь у товаров мета-поле с датой окончания актуальности. Можно использовать собственное поле _expiry_date в формате YYYY-MM-DD. Добавим это поле вручную или через кастомные поля.
2. Пишем функцию для удаления просроченных товаров
В functions.php темы или в собственном плагине создаём функцию, которая будет искать товары с датой окончания меньше текущей и удалять их.
<?php
function wc_delete_expired_products() {
$today = date('Y-m-d');
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_expiry_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE',
),
),
'fields' => 'ids',
);
$expired_products = get_posts($args);
if (!empty($expired_products)) {
foreach ($expired_products as $product_id) {
wp_delete_post($product_id, true); // true - удаление без корзины
}
}
}
?>3. Настраиваем автоматический запуск через WP-Cron
Чтобы функция запускалась регулярно, добавим задачу в расписание WP-Cron, например, раз в сутки.
<?php
// Регистрируем событие при активации темы или плагина
function wc_schedule_expired_products_deletion() {
if (!wp_next_scheduled('wc_daily_expired_products_deletion')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'wc_daily_expired_products_deletion');
}
}
add_action('wp', 'wc_schedule_expired_products_deletion');
// Обработчик события
add_action('wc_daily_expired_products_deletion', 'wc_delete_expired_products');
// Очистка расписания при деактивации
function wc_clear_expired_products_deletion_schedule() {
$timestamp = wp_next_scheduled('wc_daily_expired_products_deletion');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_daily_expired_products_deletion');
}
}
register_deactivation_hook(__FILE__, 'wc_clear_expired_products_deletion_schedule');
?>Проверка результата после внедрения
Для проверки работоспособности:
- Добавьте тестовый продукт с
_expiry_dateв прошлую дату. - Запустите функцию вручную, вызвав
wc_delete_expired_products();через админ-панель (например, временно черезadd_action('admin_init', 'wc_delete_expired_products');). - Проверьте, что товар удалён без остатка (нет в админке и в базе данных).
- Убедитесь, что WP-Cron запланировал задачу (плагин WP Crontrol поможет).
Частые ошибки и как их исправить
- Ошибка: Функция не удаляет товары.
Причина: Неправильный ключ мета-поля или формат даты.
Решение: Проверьте, что_expiry_dateдействительно есть у товаров и записан в форматеYYYY-MM-DD. - Ошибка: WP-Cron не срабатывает.
Причина: WP-Cron запускается только при посещениях сайта.
Решение: Настройте системный cron на сервере или используйте плагин для имитации cron, например WP Crontrol. - Ошибка: Необходимо не удалять, а менять статус товара.
Решение: Заменитеwp_delete_post($product_id, true);наwp_update_post(array('ID' => $product_id, 'post_status' => 'draft'));.
Практические советы по безопасности и производительности
- Используйте
wp_delete_postс параметромtrueдля полного удаления без корзины, чтобы не засорять базу. - Если товаров много, добавьте пагинацию в запрос
get_posts, чтобы не превышать лимит памяти. - Ограничьте права пользователя, который может запускать удаление, чтобы избежать случайных удалений.
- Регулярно делайте бэкапы базы данных, особенно перед автоматическими удалениями.
Сравнение вариантов реализации удаления товаров по срокам
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Кастомный код с WP-Cron | Автоматическое удаление через WP-Cron и функцию в functions.php | Полный контроль, нет зависимости от плагинов, гибкость | Необходимы навыки программирования, возможны проблемы с WP-Cron |
| Плагины для автоматизации | Использование плагинов для управления сроками товаров | Простота настройки, готовый функционал | Нагрузка на сайт, зависимость от стороннего кода, ограниченная кастомизация |
| Ручное удаление | Админка WooCommerce — фильтры и удаление вручную | Простота без программирования | Ручной труд, риск ошибок, неэффективно для большого каталога |