Диагностика проблемы с устаревшими товарами в WooCommerce
В интернет-магазинах на WooCommerce часто возникает задача автоматически удалять товары, которые устарели или имеют ограниченный срок действия (например, промоакции, сезонные товары или цифровой контент с датой окончания). Без автоматизации администраторы вынуждены контролировать и удалять такие товары вручную, что приводит к ошибкам и замедляет работу.
Чтобы убедиться, что вы сталкиваетесь именно с этой проблемой, проверьте следующие моменты:
- Есть ли у товаров метаполе с датой окончания (expiration date)?
- Отсутствует ли автоматический механизм очистки товаров по этой дате?
- Товары, срок действия которых прошёл, все ещё отображаются в каталоге и доступны для покупки?
Как автоматически удалять товары по истечении срока действия — пошаговое решение
1. Добавление поля с датой окончания товара
Для начала убедитесь, что у товаров есть метаполе с датой окончания. Можно использовать Advanced Custom Fields (ACF) или добавить поле вручную через add_meta_box. Ниже пример добавления кастомного метаполя даты окончания:
function add_expiration_date_metabox() {
add_meta_box(
'expiration_date',
'Дата окончания товара',
'render_expiration_date_metabox',
'product',
'side'
);
}
add_action('add_meta_boxes', 'add_expiration_date_metabox');
function render_expiration_date_metabox($post) {
$value = get_post_meta($post->ID, '_expiration_date', true);
echo '<input type="date" name="_expiration_date" value="' . esc_attr($value) . '" />';
}
function save_expiration_date_meta($post_id) {
if (isset($_POST['_expiration_date'])) {
update_post_meta($post_id, '_expiration_date', sanitize_text_field($_POST['_expiration_date']));
}
}
add_action('save_post_product', 'save_expiration_date_meta');2. Создание WP-Cron задачи для проверки и удаления просроченных товаров
Добавим задачу в планировщик WordPress, которая будет ежедневно запускать проверку и удалять товары с прошедшей датой окончания.
function schedule_expired_products_cleanup() {
if (!wp_next_scheduled('daily_expired_products_cleanup')) {
wp_schedule_event(time(), 'daily', 'daily_expired_products_cleanup');
}
}
add_action('wp', 'schedule_expired_products_cleanup');
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_trash_post($product_id); // Можно заменить на wp_delete_post($product_id, true) для полного удаления
}
}
}
add_action('daily_expired_products_cleanup', 'delete_expired_products');3. Проверка работы и отладка
Чтобы проверить, что автоматическое удаление работает:
- Создайте тестовый товар с датой окончания, например, на вчерашний день.
- Запустите вручную событие WP-Cron через плагин WP Crontrol или вызовите функцию
delete_expired_products()напрямую из функций (например, черезadd_action('init', 'delete_expired_products')на время теста). - Проверьте, что товар переместился в корзину или удалился полностью.
Частые ошибки при автоматическом удалении товаров
- Отсутствие даты окончания у товаров — без корректного метаполя фильтрация не сработает.
- Неправильный формат даты — дата должна храниться в формате
YYYY-MM-DD, иначе сравнение не сработает. - Проблемы с WP-Cron — если на сервере нет трафика, WP-Cron может не запускаться вовремя. В этом случае рекомендуется настроить системный cron и отключить WP-Cron (
define('DISABLE_WP_CRON', true);в wp-config.php). - Удаление товаров вместо перемещения в корзину — используйте
wp_trash_post()для безопасного удаления, чтобы не потерять данные безвозвратно.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных, особенно если используете
wp_delete_postс полным удалением. - Если товаров много, разбивайте запросы на части с
'posts_per_page' => 50и используйте пагинацию WP_Query, чтобы не перегружать сервер. - Кэшируйте результаты запросов, если функция вызывается часто в других местах.
- Для критичных магазинов лучше уведомлять администратора о предстоящем удалении товаров по email, чтобы можно было вручную проверить.
Сравнение способов реализации удаления товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + wp_trash_post() | Автоматическое перемещение товаров в корзину по крону | Безопасно, легко восстановить | Зависит от работы WP-Cron, товары остаются в базе |
| WP-Cron + wp_delete_post(true) | Полное удаление товаров по крону | Полностью очищает базу | Нельзя восстановить, риск удаления нужных товаров |
| Ручное удаление через админку | Администратор контролирует удаление | Минимум ошибок | Затратно по времени, риски забыть |