Диагностика задачи: зачем нужно автоматическое удаление товаров в WooCommerce
В магазинах на WooCommerce часто возникают ситуации, когда товары имеют ограниченный срок действия или распродажи, после чего их нужно удалить или скрыть. Ручное удаление — трудоемкий процесс, особенно при большом количестве товаров. Автоматизация этого процесса позволит не допустить продажи устаревших товаров и поддерживать каталог в актуальном состоянии.
Как определить товары с истекшими сроками действия
Первый шаг — задать условие, по которому товар считается устаревшим. Чаще всего для этого используют:
- Кастомное поле с датой окончания действия товара;
- Дата окончания акции или скидки;
- Дата публикации товара с заданным сроком актуальности.
Для примера рассмотрим, что у товара есть кастомное поле expiration_date с датой в формате YYYY-MM-DD. Именно по нему и будем фильтровать товары.
Пошаговое решение: удаление товаров с истекшей датой
1. Добавление кастомного поля expiration_date (если еще не добавлено)
Можно добавить поле через админку или программно, например, с помощью metabox:
add_action('add_meta_boxes', function() {
add_meta_box('expiration_date_box', 'Срок действия товара', function($post) {
$value = get_post_meta($post->ID, 'expiration_date', true);
echo '<label for="expiration_date">Дата окончания (ГГГГ-ММ-ДД):</label>';
echo '<input type="date" id="expiration_date" name="expiration_date" value="' . esc_attr($value) . '" />';
}, 'product', 'side', 'default');
});
add_action('save_post_product', function($post_id) {
if (isset($_POST['expiration_date'])) {
update_post_meta($post_id, 'expiration_date', sanitize_text_field($_POST['expiration_date']));
}
});2. Скрипт для удаления устаревших товаров
Создаем функцию, которая будет находить все товары с датой expiration_date меньше сегодняшней и удалять их.
function 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',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - удаление без перемещения в корзину
}
}
}3. Автоматизация через WP-Cron
Чтобы удаление происходило автоматически, зарегистрируем задачу в планировщике WP-Cron:
if (!wp_next_scheduled('delete_expired_products_daily')) {
wp_schedule_event(time(), 'daily', 'delete_expired_products_daily');
}
add_action('delete_expired_products_daily', 'delete_expired_products');Проверка результата после внедрения
1. Создайте тестовый товар с полем expiration_date, выставленным на дату, которая уже прошла.
2. Запустите функцию вручную из админки (или через WP CLI):
delete_expired_products();3. Проверьте, что товар удалился из каталога.
4. Убедитесь, что cron-задача срабатывает (можно установить плагин WP Crontrol для просмотра и управления задачами WP-Cron).
Частые ошибки и как их исправить
- Неправильный формат даты в meta поле. Убедитесь, что дата хранится в формате
YYYY-MM-DD. Иначе сравнение вmeta_queryне сработает. - Отсутствие cron-задачи. WP-Cron работает при посещении сайта, если сайт малопосещаемый, cron может не запускаться. Для надежности настройте системный cron или запускайте вручную.
- Товары не удаляются, а только в корзину. В
wp_delete_postвторой параметрtrueудаляет сразу. Проверьте, что стоит именноtrue. - Удаление происходит слишком часто. Используйте расписание
dailyили другое подходящее, чтобы не нагружать базу.
Практические советы по безопасности и производительности
- Перед удалением товаров делайте резервное копирование базы.
- Если каталог очень большой, разбивайте удаление на порции, чтобы не перегружать сервер.
- Для массовых операций используйте WP-CLI:
wp post delete $(wp post list --post_type=product --meta_key=expiration_date --meta_value_date='2024-01-01' --meta_compare='<') --force - Вместо удаления можно сначала переводить товары в статус
draftдля дополнительной проверки.
Сравнение способов реализации автоматического удаления товаров
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron с PHP функцией | Легко настроить, не требует внешних сервисов | Зависит от посещаемости сайта, возможны задержки |
| Системный cron + WP-CLI | Надежно и быстро, подходит для больших сайтов | Требует доступа к серверу и навыков администрирования |
| Плагины для управления истекшими товарами | Готовое решение с удобным интерфейсом | Могут нагружать сайт, не всегда бесплатно |