Диагностика проблемы: зачем удалять товары автоматически
В интернет-магазинах на WooCommerce часто возникает потребность автоматически удалять товары, срок актуальности которых истек: сезонные предложения, ограниченные серии, товары с истекающим сроком годности и т.д. Ручное удаление при большом ассортименте — затратное по времени и ошибкоопасное занятие.
Проверить, нужна ли автоматизация, можно, проанализировав каталог и частоту устаревания товаров. Если в вашем магазине есть товары с метками срока действия (например, метаполя с датой окончания), автоматизация существенно упростит управление каталогом.
Настройка хранения срока жизни товара в WooCommerce
Для начала убедитесь, что у каждого товара есть поле с датой истечения срока. Обычно это делается через пользовательское метаполе, например _expiration_date. Если такого поля нет, создайте его вручную или с помощью плагина Advanced Custom Fields.
Добавление метаполя вручную при сохранении товара:
add_action('save_post_product', 'save_product_expiration_date');
function save_product_expiration_date($post_id) {
if (isset($_POST['expiration_date'])) {
update_post_meta($post_id, '_expiration_date', sanitize_text_field($_POST['expiration_date']));
}
}В админке WooCommerce добавьте поле для ввода даты (например, через хук woocommerce_product_options_general_product_data).
Пошаговое решение: скрипт для автоматического удаления устаревших товаров
Создадим WP-Cron задачу, которая каждый день будет проверять товары и удалять те, у которых дата истечения меньше текущей.
1. Добавляем функцию проверки и удаления
function wc_delete_expired_products() {
$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);
foreach ($expired_products as $product_id) {
wp_trash_post($product_id); // поместить в корзину
// или wp_delete_post($product_id, true); // удалить безвозвратно
}
}2. Регистрируем ежедневное событие WP-Cron
if (!wp_next_scheduled('wc_daily_expired_products_cleanup')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'wc_daily_expired_products_cleanup');
}
add_action('wc_daily_expired_products_cleanup', 'wc_delete_expired_products');3. Проверка работы задачи
Для отладки можно вызвать функцию вручную:
add_action('admin_init', function() {
if (current_user_can('manage_options') && isset($_GET['run_expired_cleanup'])) {
wc_delete_expired_products();
echo 'Expired products cleanup done.';
exit;
}
});В админке перейти по адресу https://your-site.com/wp-admin/?run_expired_cleanup=1. После выполнения проверьте корзину или удалённые записи.
Проверка результата после внедрения
- Убедитесь, что в товарах есть корректное поле
_expiration_dateс датой в форматеYYYY-MM-DD. - Запустите функцию вручную (см. отладку выше) и проверьте, что просроченные товары удалились.
- Проверьте, что WP-Cron работает: в консоли WP или с помощью плагина WP Crontrol убедитесь, что событие
wc_daily_expired_products_cleanupзапланировано и выполняется. - Проверьте логи сервера на предмет ошибок во время выполнения задачи.
Частые ошибки и как их исправить
- Неправильный формат даты в поле
_expiration_date
Решение: убедитесь, что дата хранится в форматеYYYY-MM-DD. Переопределите сохранение даты с помощьюsanitize_text_fieldи проверяйте формат перед сохранением. - WP-Cron не срабатывает из-за отсутствия трафика
Решение: для надежной работы WP-Cron используйте системный cron на сервере, вызывающийwp-cron.phpкаждые 5-15 минут. - Удаление товаров вызывает ошибки из-за связанных данных (заказы, отзывы)
Решение: используйтеwp_trash_post()вместо непосредственного удаления, чтобы сохранить данные и иметь возможность восстановить товар. - Задача слишком ресурсоёмкая при большом каталоге
Решение: разбейте запрос на части с пагинацией или используйте WP CLI для пакетного удаления.
Практические советы по безопасности и производительности
- Всегда используйте
wp_trash_post()вместо жесткого удаления, чтобы избежать потери данных и ошибок. - Добавьте проверку прав пользователя при ручном запуске очистки (как в примере с
admin_init). - Для больших магазинов лучше запускать очистку в ночное время с низкой нагрузкой на сервер.
- Регулярно делайте резервные копии базы данных перед автоматическим удалением товаров.
- В таблице ниже сравнение вариантов удаления:
| Метод удаления | Преимущества | Недостатки |
|---|---|---|
| wp_trash_post() | Безопасно, можно восстановить товар | Занимает место в базе, требует очистки корзины вручную или дополнительно |
| wp_delete_post($id, true) | Удаляет полностью, экономит место | Риск потери данных, связанных с товаром (заказы, отзывы) |
| WP-CLI скрипт | Быстро для больших каталогов, можно запускать вручную | Требует доступа к серверу и навыков работы с консолью |