Диагностика проблемы: зачем удалять старые товары в WooCommerce
При ведении интернет-магазина на WooCommerce часто возникает задача очистки каталога от устаревших или неактуальных товаров. Ручное удаление — затратная по времени операция, особенно если товаров много. Автоматизация удаления товаров по дате публикации или последнего обновления помогает поддерживать актуальность ассортимента и облегчает администрирование.
Как настроить автоматическое удаление товаров по расписанию
1. Использование WP-Cron для запуска задачи
WordPress содержит встроенный механизм WP-Cron, который позволяет запускать периодические задачи. Для удаления товаров нужно создать кастомную функцию и зарегистрировать её на выполнение по расписанию.
2. Пример кода для удаления товаров старше 180 дней
function wpmart_delete_old_products() {
// Параметры запроса: товары типа 'product', опубликованные более 180 дней назад
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => '180 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_products = get_posts($args);
if (!empty($old_products)) {
foreach ($old_products as $product_id) {
wp_trash_post($product_id); // Перемещение в корзину
// Для полного удаления используйте wp_delete_post($product_id, true);
}
}
}
// Функция для регистрации расписания раз в сутки
function wpmart_register_daily_schedule($schedules) {
if (!isset($schedules['daily'])) {
$schedules['daily'] = [
'interval' => 86400, // 24 часа
'display' => __('Once Daily'),
];
}
return $schedules;
}
add_filter('cron_schedules', 'wpmart_register_daily_schedule');
// Запланировать событие при активации темы/плагина
function wpmart_schedule_delete_old_products() {
if (!wp_next_scheduled('wpmart_daily_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'wpmart_daily_delete_old_products');
}
}
add_action('wp', 'wpmart_schedule_delete_old_products');
// Привязать функцию к событию
add_action('wpmart_daily_delete_old_products', 'wpmart_delete_old_products');Пошаговое внедрение решения
- Добавьте приведённый код в файл functions.php вашей дочерней темы или в кастомный плагин.
- Обновите сайт для инициализации расписания WP-Cron.
- Проверьте наличие запланированного события с помощью плагина WP Crontrol или через консоль WP-CLI командой
wp cron event list. - Убедитесь, что товары старше 180 дней перемещаются в корзину раз в сутки.
Проверка результата после внедрения
Для проверки работоспособности:
- Создайте тестовый товар с датой публикации более 180 дней назад (можно вручную изменить дату через редактирование товара).
- Запустите вручную крон-задачу с помощью WP Crontrol или WP-CLI:
wp cron event run wpmart_daily_delete_old_products - Проверьте, что товар переместился в корзину (Админ-панель > Товары > Корзина).
- Если нужно полностью удалить, замените
wp_trash_postнаwp_delete_post($product_id, true)в коде.
Частые ошибки и как их исправить
- Задача не запускается: WP-Cron зависит от посещений сайта. На слабом трафике крон может не сработать вовремя. Используйте системный cron на сервере для запуска
wp-cron.phpили WP-CLI для регулярного запуска. - Удаляются не те товары: Проверьте параметры
date_queryи тип поста. Убедитесь, что дата публикации корректна. - Права доступа: Функция удаления требует прав администратора. Запускайте код от имени администратора.
- Потеря товаров: По умолчанию товары попадают в корзину. Если корзина не очищается, товары сохраняются. Для полного удаления используйте
wp_delete_postс параметромtrue.
Практические советы по безопасности и производительности
- Перед массовым удалением делайте резервную копию базы данных.
- При большом объёме товаров делайте удаление порциями, чтобы избежать превышения времени выполнения скрипта. Например, добавьте ограничение
'posts_per_page' => 50и используйте пагинацию. - Добавьте логирование удалённых товаров для аудита:
function wpmart_delete_old_products() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => '180 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => 50,
];
$old_products = get_posts($args);
if (!empty($old_products)) {
foreach ($old_products as $product_id) {
if (wp_trash_post($product_id)) {
error_log('Deleted old product ID: ' . $product_id);
}
}
}
}
- Для повышения надёжности используйте серверный cron вместо WP-Cron.
- Проверяйте нагрузку на сервер при выполнении задачи и корректируйте размер порций.
Сравнение способов автоматического удаления товаров
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| WP-Cron с пользовательским кодом | Полный контроль, без плагинов, гибкость | Зависит от трафика, возможны задержки | Для сайтов с хорошим трафиком или запускать системный cron |
| Серверный cron + WP-CLI | Надёжность, точное время запуска | Требуется доступ к серверу, настройка сложнее | Оптимально для больших магазинов |
| Плагины для удаления товаров | Простота использования, готовые настройки | Могут быть избыточны, нагрузка, безопасность | Если нет возможности писать код |