Диагностика проблемы: почему нужно удалять просроченные товары
В WooCommerce нередко возникает задача автоматически удалять товары, у которых истек срок годности, закончился период акции или подошла дата устаревания. Это важно для поддержания актуальности каталога и избежания продаж просроченных или неактуальных товаров.
Проверить наличие устаревших товаров можно, если вы храните дату окончания срока в пользовательском поле (метаполе) товара, например, _expiration_date. Для диагностики выполните следующий запрос в базе данных или с помощью WP-CLI:
SELECT ID, post_title, meta_value FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_postmeta.meta_key = '_expiration_date'
AND wp_postmeta.meta_value < CURDATE();Если запрос вернул товары с датой меньше текущей, значит, есть просроченные позиции.
Настройка автоматического удаления просроченных товаров
1. Добавление метаполя с датой окончания
Убедитесь, что у каждого товара есть метаполе _expiration_date с датой в формате YYYY-MM-DD. Можно использовать Advanced Custom Fields (ACF) или записывать дату вручную через админку.
2. Создание WP-Cron задачи для удаления
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин. Он проверяет товары с датой окончания меньше текущей и удаляет их.
function wpco_delete_expired_products() {
// Получаем сегодняшнюю дату в формате Y-m-d
$today = date('Y-m-d');
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_expiration_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); // полный удаление
}
}
}
// Регистрируем событие, если его нет
if (!wp_next_scheduled('wpco_delete_expired_products_event')) {
wp_schedule_event(time(), 'daily', 'wpco_delete_expired_products_event');
}
add_action('wpco_delete_expired_products_event', 'wpco_delete_expired_products');3. Очистка cron при деактивации плагина или темы
function wpco_clear_expired_products_cron() {
$timestamp = wp_next_scheduled('wpco_delete_expired_products_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpco_delete_expired_products_event');
}
}
register_deactivation_hook(__FILE__, 'wpco_clear_expired_products_cron');Проверка результата после внедрения
Чтобы убедиться, что удаление работает, сделайте следующее:
- Создайте тестовый товар с датой
_expiration_dateна вчерашний день. - Запустите задачу вручную с помощью WP-CLI:
wp cron event run wpco_delete_expired_products_event - Проверьте, удалился ли товар в админке WooCommerce.
- Просмотрите логи ошибок и журнал cron-событий (если настроен).
Частые ошибки и как их исправить
- Нет метаполя с датой или неправильный формат даты. Убедитесь, что дата хранится в формате
YYYY-MM-DDи метаполе_expiration_dateдействительно существует. - WP-Cron не запускается. Проверьте, что WP-Cron включён и работают планировщики. Для теста вызовите
wpco_delete_expired_products()напрямую. - Товары не удаляются, т.к. они в статусе черновика или запланированы. В запросе можно добавить параметр
'post_status' => array('publish', 'private'), если хотите удалять только опубликованные товары. - Удаление не полное из-за кэширования. Очистите кэш сайта и проверьте повторно.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($id, true)для полного удаления (без перемещения в корзину). Если хотите сохранить возможность восстановления, заменитеtrueнаfalse. - Для сайтов с большим каталогом товаров добавьте пагинацию в запрос с параметром
posts_per_pageи делайте удаление пачками. - Добавьте логирование удаляемых товаров, чтобы отслеживать процесс и ошибки.
- Убедитесь, что ваш хостинг поддерживает WP-Cron или настройте системный cron для wp-cron.php.
Сравнение способов автоматического удаления просроченных товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + пользовательский код | Автоматическое удаление через крон-задачу и метаполя | Гибкость, без сторонних плагинов, легко кастомизировать | Зависит от работы WP-Cron, требует знаний PHP |
| Плагины управления сроками | Готовые решения для управления сроками и удалением | Простота установки, поддержка интерфейса | Могут быть тяжелыми, не всегда подходят под кастомные задачи |
| Ручное удаление | Удаление через админку или SQL-запросы | Простота, без кода | Не автоматизировано, требует ручного контроля |