Диагностика проблемы: зачем и когда удалять товары автоматически
В интернет-магазинах на WooCommerce часто возникает задача поддерживать актуальность каталога. Наличие товаров, которых нет в наличии или которые устарели, снижает конверсию и ухудшает пользовательский опыт. Если товаров много — ручное удаление занимает много времени и чревато ошибками.
Типичные признаки необходимости автоматизации:
- Товары с остатком 0 не обновляются и не удаляются;
- Товары с истекшим сроком публикации продолжают отображаться;
- Отсутствие единого процесса очистки каталога приводит к накоплению неактуальных продуктов.
Пошаговое решение: автоматическое удаление товаров по остаткам и дате публикации
1. Использование WP-Cron для регулярной проверки товаров
WP-Cron позволяет запускать задачи по расписанию без необходимости внешних cron-сервисов.
2. Функция для удаления товаров с нулевым остатком
Пример функции, которая находит и удаляет товары с запасом 0:
function wc_delete_products_out_of_stock() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '='
),
),
'fields' => 'ids',
);
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // жесткое удаление
}
}
}3. Функция для удаления товаров по дате публикации
Удаляем товары старше определенной даты, например, 180 дней:
function wc_delete_old_products() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'fields' => 'ids',
);
$old_products = get_posts($args);
if (!empty($old_products)) {
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true);
}
}
}4. Регистрация cron-задачи и запуск функций
Добавляем событие при активации темы или плагина:
function wc_schedule_product_cleanup() {
if (!wp_next_scheduled('wc_daily_product_cleanup')) {
wp_schedule_event(time(), 'daily', 'wc_daily_product_cleanup');
}
}
add_action('wp', 'wc_schedule_product_cleanup');
add_action('wc_daily_product_cleanup', 'wc_delete_products_out_of_stock');
add_action('wc_daily_product_cleanup', 'wc_delete_old_products');Чтобы отменить задачу (например, при деактивации плагина), используйте:
function wc_unschedule_product_cleanup() {
$timestamp = wp_next_scheduled('wc_daily_product_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_daily_product_cleanup');
}
}Проверка результата после внедрения
- Запустить вручную
wc_delete_products_out_of_stock()иwc_delete_old_products()через WP-CLI или временно вызвать в functions.php — проверить, что товары с нулевым остатком и старше 180 дней удаляются. - Через админку WooCommerce убедиться, что таких товаров больше нет.
- Проверить логи сервера на наличие ошибок при выполнении cron-задачи.
- Отслеживать поведение сайта в течение нескольких дней — автоматическое удаление должно происходить ежедневно.
Частые ошибки и как их исправить
- Не запускается WP-Cron: убедитесь, что на хостинге разрешен WP-Cron или настройте системный cron для вызова
wp-cron.php. - Удаляются не те товары: проверьте правильность условий
meta_queryиdate_query. Не используйтеpost_status="publish", если хотите удалить и черновики. - Функции не вызываются: проверьте регистрацию хуков
add_action, убедитесь, что код загружается (например, в functions.php темы или в плагине). - Отсутствует резервное копирование: всегда делайте бэкап базы перед автоматическим удалением данных.
Практические советы по безопасности и производительности
- Перед удалением товаров можно отправлять уведомление администратору с количеством и ID удаляемых товаров.
- Для больших магазинов разбивайте удаление на партии по 50-100 товаров, чтобы избежать таймаутов и превышения памяти.
- Используйте транзакции базы данных (если возможно) или логируйте удаленные товары для возможности восстановления.
- Отключайте WP-Cron и используйте системный cron на высоконагруженных сайтах для стабильности.
Сравнение вариантов автоматического удаления товаров
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код на PHP с WP-Cron | Гибкость, без плагинов, точная кастомизация | Зависимость от WP-Cron, требует навыков | Лучше для опытных разработчиков и средних магазинов |
| Плагины очистки каталога | Простота установки, GUI | Могут грузить сайт, ограниченные настройки | Подходит для небольших магазинов |
| Системный cron с WP-CLI | Стабильность, высокая производительность | Требует доступа к серверу, знания командной строки | Лучший вариант для больших проектов |