Диагностика проблемы: зачем и когда нужно автоматическое удаление товаров
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически удалять товары по определённым условиям: устаревшие, снятые с производства, с истёкшим сроком действия или с определённым статусом. Ручное удаление занимает много времени и подвержено ошибкам. Автоматизация процесса помогает поддерживать базу данных в актуальном состоянии и улучшает производительность сайта.
Какие условия можно использовать для удаления товаров
Для выбора товаров под удаление можно использовать следующие параметры:
- Статус товара (publish, draft, pending, private и т.д.)
- Дата создания или последнего обновления (например, старше 6 месяцев)
- Наличие запасов (товары с нулевым запасом)
- Категории или метки (например, товары из категории "Архив")
В этой статье мы рассмотрим удаление товаров по статусу и дате создания.
Пошаговое решение: создание WP-Cron задачи для удаления товаров
1. Создаём функцию для выборки и удаления товаров
function wponline_delete_old_products() {
// Параметры: статус 'draft', дата создания старше 180 дней
$args = [
'post_type' => 'product',
'post_status' => 'draft',
'date_query' => [
[
'column' => 'post_date',
'before' => '180 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
return;
}
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - без перемещения в корзину
}
}2. Регистрируем событие WP-Cron для ежедневного запуска
function wponline_schedule_delete_old_products() {
if (!wp_next_scheduled('wponline_daily_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'wponline_daily_delete_old_products');
}
}
add_action('wp', 'wponline_schedule_delete_old_products');
add_action('wponline_daily_delete_old_products', 'wponline_delete_old_products');3. Добавляем возможность ручного запуска функции для тестирования
add_action('admin_post_wponline_delete_old_products', function() {
if (!current_user_can('manage_options')) {
wp_die('Нет доступа');
}
wponline_delete_old_products();
wp_redirect(admin_url('tools.php?deleted=1'));
exit;
});Таким образом, вы можете перейти по URL https://ваш-сайт/wp-admin/admin-post.php?action=wponline_delete_old_products для запуска удаления вручную.
Проверка результата после внедрения
- Проверьте наличие товаров со статусом
draftи датой создания старше 180 дней в админке WooCommerce - они должны исчезнуть после запуска задачи. - Для проверки WP-Cron используйте плагин WP Crontrol — он покажет запланированные задачи.
- Запустите ручное удаление через адрес, описанный выше, и убедитесь, что товары удаляются.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается: Убедитесь, что на сайте есть посещения (WP-Cron запускается при загрузке страниц). Для точного запуска используйте системный cron и WP-CLI.
- Неверные параметры запроса: Проверьте правильность аргументов в
WP_Query, особенноpost_statusиdate_query. - Права доступа: Убедитесь, что функция запускается от пользователя с правами на удаление постов.
- Удаление не происходит: Проверьте, не блокирует ли плагин защиту от массового удаления или есть ли ошибки в логах PHP.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии перед автоматическим удалением данных.
- Для больших магазинов используйте постраничный обход с
posts_per_pageиoffset, чтобы не перегружать сервер. - Запускайте WP-Cron задачи в период низкой нагрузки на сайт.
- Логируйте действия удаления в отдельный файл для последующего аудита.
- Проверяйте, что удаление происходит только по нужным критериям, чтобы избежать потери данных.
Сравнение подходов к автоматическому удалению товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + собственный код | Гибко, без сторонних плагинов, точечное удаление | Зависит от посещаемости сайта, требует навыков разработки | Код из статьи |
| Плагины автоматизации (например, WP All Import) | Простота настройки, визуальный интерфейс | Может быть тяжеловесным, ограничения по условиям удаления | Плагин с настройками импорта/удаления |
| WP-CLI команды | Быстро, удобно для разработчиков, можно запускать через cron сервера | Нужен доступ к серверу, терминалу | wp post delete --post_type=product --post_status=draft --before='180 days ago' |