Диагностика задачи: зачем и когда нужно удалять товары автоматически
В крупных магазинах на WooCommerce нередко возникает необходимость автоматически удалять товары, которые устарели или больше не актуальны. Причины могут быть разные: сезонные коллекции, распродажи, временные предложения, товары с истекшим сроком годности или снятые с производства позиции. Ручное удаление каждого такого товара — трудоемко и неэффективно, особенно если товаров тысячи.
Автоматизация процесса позволяет поддерживать базу товаров в актуальном состоянии, уменьшить нагрузку на администратора и избежать путаницы для покупателей.
Как определить товары для удаления
Для автоматического удаления нужно четко понимать критерии отбора. Обычно используют одно из следующих условий:
- Дата публикации товара старше определенного срока;
- Значение пользовательского поля (custom field) с датой окончания;
- Статус товара (например, «черновик», «отключен» и прочее);
- Признак в категории или метке.
В этом примере возьмем условие — все товары, опубликованные более 180 дней назад, будут удалены раз в сутки.
Пошаговое решение: реализация через WP-Cron и WP_Query
1. Создаем функцию удаления товаров
function wpmart_delete_old_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => 50, // лимит на один запуск
'date_query' => array(
array(
'before' => '180 days ago',
'inclusive' => true,
),
),
'post_status' => 'publish',
'fields' => 'ids',
);
$old_products = get_posts($args);
if (empty($old_products)) {
return; // Нет товаров для удаления
}
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true); // принудительное удаление без корзины
}
}2. Регистрируем ежесуточное задание WP-Cron
function wpmart_schedule_old_products_deletion() {
if (!wp_next_scheduled('wpmart_daily_old_products_deletion')) {
wp_schedule_event(time(), 'daily', 'wpmart_daily_old_products_deletion');
}
}
add_action('wp', 'wpmart_schedule_old_products_deletion');
add_action('wpmart_daily_old_products_deletion', 'wpmart_delete_old_products');3. Опционально: добавляем проверку и логирование удаления
function wpmart_delete_old_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => 50,
'date_query' => array(
array('before' => '180 days ago', 'inclusive' => true),
),
'post_status' => 'publish',
'fields' => 'ids',
);
$old_products = get_posts($args);
if (empty($old_products)) {
error_log('WPMart: Нет товаров для удаления');
return;
}
foreach ($old_products as $product_id) {
if (wp_delete_post($product_id, true)) {
error_log('WPMart: Удален товар ID ' . $product_id);
} else {
error_log('WPMart: Ошибка при удалении товара ID ' . $product_id);
}
}
}Проверка результата после внедрения
- Подождите до следующего запуска cron (обычно в течение суток) или вызовите задачу вручную через
do_action('wpmart_daily_old_products_deletion');. - Проверьте, что товары старше 180 дней действительно удалились из базы и не отображаются в админке WooCommerce.
- Проверьте логи ошибок PHP или системный лог, если добавлено логирование, на предмет успешных удалений.
- Для теста можно временно уменьшить порог с 180 дней до нескольких минут, чтобы проверить работу на реальных данных.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается: проверьте, что на сайте есть регулярный трафик или настройте системный cron для вызова
wp-cron.php. Без этого автоматизация не сработает. - Удаление не происходит или удаляются не все товары: убедитесь, что параметры
WP_Queryкорректны, и что нет конфликтов с другими плагинами, блокирующими удаление. - Потеря данных из-за удаления: используйте принудительное удаление с осторожностью. Лучше сначала тестировать на копии сайта или с функцией перемещения в корзину (
wp_delete_post($id, false)). - Проблемы с производительностью при большом количестве товаров: ограничивайте количество товаров на один цикл (например, 50), чтобы не перегружать сервер.
Практические советы по безопасности и производительности
- Не используйте
wp_delete_postс параметром$force_delete = trueбез необходимости — лучше сначала перемещать товары в корзину, чтобы можно было восстановить. - Добавьте проверку nonce и прав пользователя, если планируете запускать удаление из интерфейса.
- Регулярно делайте резервное копирование базы данных перед внедрением автоматических удалений.
- Используйте транзиенты или опции для контроля прогресса удаления, если товаров много.
- Для больших магазинов рассмотрите деление удаления на несколько задач по категориям или меткам.
Сравнение вариантов автоматического удаления
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + PHP код | Гибкость, нет зависимостей, легко кастомизировать | Зависит от посещаемости сайта, требует навыков программирования |
| Плагины для удаления товаров | Простота установки, интерфейс | Может быть избыточным, нагрузка, не всегда подходит под специфичные условия |
| Ручное удаление | Полный контроль | Трудоемко, риск ошибок и пропусков |