Почему нужно удалять старые товары в WooCommerce
С течением времени в магазине WooCommerce накапливаются товары, которые уже не актуальны: сезонные коллекции, устаревшие модели, распроданные позиции. Их хранение увеличивает нагрузку на базу данных, замедляет админ-панель и может создавать путаницу в отчетах.
Как диагностировать наличие старых товаров для удаления
Для начала определитесь с критериями «старого» товара. Обычно это дата публикации или дата последнего обновления товара. Чтобы проверить, сколько таких товаров у вас есть, используйте SQL-запрос напрямую через phpMyAdmin или WP-CLI:
SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'product' AND post_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);Этот запрос покажет товары старше 1 года. Если количество значительное — стоит автоматизировать их удаление.
Пошаговое решение: автоматизация удаления старых товаров с помощью кода
Создаем функцию удаления
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpguest_delete_old_woocommerce_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'date_query' => array(
array(
'before' => '1 year ago',
),
),
'fields' => 'ids',
'post_status' => array('publish', 'draft', 'pending'),
);
$old_products = get_posts($args);
if (!empty($old_products)) {
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true); // true — удалить без возможности восстановления
}
}
}Запускаем функцию по расписанию
Чтобы не запускать вручную, используйте WP-Cron. Добавьте следующий код:
function wpguest_schedule_old_product_deletion() {
if (!wp_next_scheduled('wpguest_delete_old_products_hook')) {
wp_schedule_event(time(), 'daily', 'wpguest_delete_old_products_hook');
}
}
add_action('wp', 'wpguest_schedule_old_product_deletion');
add_action('wpguest_delete_old_products_hook', 'wpguest_delete_old_woocommerce_products');Этот код запустит удаление старых товаров каждый день.
Проверка результата после внедрения
- Проверьте в WooCommerce раздел «Товары» — старые товары должны исчезнуть.
- Запустите вручную функцию из консоли WP-CLI для проверки:
wp eval 'wpguest_delete_old_woocommerce_products();' - Просмотрите логи сервера или логи ошибок PHP на предмет сбоев.
Частые ошибки и как их исправить
- Товары не удаляются: Проверьте, что функция вызывается и не возникает ошибок. Добавьте
error_logвнутри цикла, чтобы отследить процесс. - Удаляются не те товары: Уточните дату в параметре
'before'. Можно вывести выборку товаров перед удалением для проверки. - Проблемы с WP-Cron: Если WP-Cron не срабатывает, настройте системный cron или используйте плагин для мониторинга WP-Cron.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Если товаров очень много, разбивайте удаление на партии, чтобы избежать таймаутов:
function wpguest_delete_old_products_batch($batch_size = 50) {
$args = array(
'post_type' => 'product',
'posts_per_page' => $batch_size,
'date_query' => array(
array('before' => '1 year ago'),
),
'fields' => 'ids',
'post_status' => array('publish', 'draft', 'pending'),
);
$old_products = get_posts($args);
if (!empty($old_products)) {
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true);
}
return true; // Есть еще товары
}
return false; // Товары закончились
}- Используйте этот подход с повторным запуском через WP-Cron или ручной триггер.
- Для крупных магазинов рассмотрите плагин Clearfy Pro для оптимизации и удаления устаревших данных.
Сравнение методов удаления старых товаров WooCommerce
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Код в functions.php + WP-Cron | Полный контроль, бесплатно, можно кастомизировать | Нужны навыки кода, риск ошибок | Разработчики, магазины с контролем хостинга |
| Плагины типа Clearfy Pro | Удобство, дополнительные функции оптимизации, поддержка | Платно, возможно избыточно для простой задачи | Средние и крупные магазины, администраторы без кода |
| Ручное удаление через админку | Просто, не требует кода | Нельзя автоматизировать, долго при большом объеме | Малые магазины, единичные случаи |