Проблема: необходимость автоматического удаления устаревших товаров в WooCommerce
В интернет-магазинах на WooCommerce часто возникает задача автоматически удалять товары после истечения определенного срока — например, сезонные коллекции, акции или товары с ограниченным сроком годности. Ручное удаление товаров в таких случаях неудобно и может привести к ошибкам или просрочкам.
Диагностика проблемы
Если вы не используете плагин с автоматическим управлением сроками товаров, скорее всего, товары продолжают отображаться в каталоге, даже если их срок действия уже прошел. Это может привести к негативному опыту покупателей и снижению доверия к магазину.
Проверьте, есть ли у товаров пользовательское поле с датой окончания, или используете ли вы стандартные поля WooCommerce для управления сроками.
Пошаговое решение: автоматическое удаление товаров по дате
1. Добавление пользовательского поля с датой окончания
Для хранения даты окончания срока действия товара используйте кастомное поле. Например, добавим мета поле _expiration_date с датой в формате YYYY-MM-DD.
2. Создание WP-Cron задачи для удаления устаревших товаров
Добавьте следующий код в файл functions.php вашей темы или в плагин:
if (!wp_next_scheduled('wc_delete_expired_products_cron')) {
wp_schedule_event(time(), 'daily', 'wc_delete_expired_products_cron');
}
add_action('wc_delete_expired_products_cron', 'wc_delete_expired_products');
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);
if (!empty($expired_products)) {
foreach ($expired_products as $product_id) {
wp_delete_post($product_id, true); // true - удаляет без возможности восстановления
}
}
}3. Как добавить дату окончания при создании/редактировании товара
Добавьте мета-бокс в админку для удобного задания даты окончания товара:
add_action('add_meta_boxes', function() {
add_meta_box('wc_expiration_date', 'Дата окончания товара', function($post) {
$value = get_post_meta($post->ID, '_expiration_date', true);
echo '<input type="date" name="_expiration_date" value="' . esc_attr($value) . '" />';
}, 'product', 'side');
});
add_action('save_post', function($post_id) {
if (isset($_POST['_expiration_date'])) {
update_post_meta($post_id, '_expiration_date', sanitize_text_field($_POST['_expiration_date']));
}
});Проверка результата после внедрения
- Зайдите в админку WooCommerce, откройте товар и установите дату окончания в прошлое.
- Запустите вручную крон задачу с помощью WP-CLI:
wp cron event run wc_delete_expired_products_cron - Проверьте, что товар удалился из базы (проверьте раздел Товары или в админке).
- Если WP-CLI недоступен, дождитесь автоматического запуска задачи (раз в сутки) и проверьте наличие товара.
Частые ошибки и как их исправить
- Отсутствие даты в поле
_expiration_date— товары не попадут в выборку, добавьте проверку или убедитесь, что поле заполнено. - Крон не запускается — проверьте, активен ли WP-Cron на сайте. Для теста используйте плагин WP Crontrol.
- Копии товаров или вариаций не удаляются — если у вас вариативные товары, дополнительно нужно удалять вариации. Добавьте фильтр для удаления потомков.
- Товары не удаляются, а только переводятся в черновики — в функции
wp_delete_postпараметрtrueотвечает за безвозвратное удаление. Проверьте его значение.
Практические советы по безопасности и производительности
- Перед удалением делайте резервные копии базы, особенно если товаров много.
- Для больших магазинов ограничьте количество товаров, обрабатываемых за один крон-запуск, и используйте пагинацию.
- Минимизируйте нагрузку, запускайте крон в ночное время.
- Добавьте логирование удалений в отдельный файл для аудита.
Сравнение подходов к автоматическому удалению товаров
| Метод | Плагин | Код | Компромиссы |
|---|---|---|---|
| Использование плагина Expire WooCommerce Products | Да | Нет | Удобно, но добавляет нагрузку и зависит от обновлений |
| Самописный WP-Cron с мета-полем | Нет | Да | Гибко, требует поддержки и знаний PHP |
| Ручное удаление по расписанию через WP-CLI | Нет | Да | Требует доступ к консоли, не автоматично для всех |