Почему важно удалять неактивные товары в WooCommerce
Если на вашем магазине WooCommerce накапливаются товары, которые давно не обновлялись, не продаются и не востребованы, они могут негативно влиять на производительность сайта и поисковый рейтинг. Автоматическое удаление таких товаров позволяет поддерживать базу данных в актуальном состоянии, снижая нагрузку и улучшая опыт пользователей.
Диагностика проблемы: как определить неактивные товары
Для автоматического удаления нам нужно четко определить критерии неактивности товара. Обычно это:
- Отсутствие продаж за определенный период.
- Отсутствие просмотров или обновлений товара.
- Товар в статусе «черновик» или «ожидает проверки» длительное время.
Чтобы проверить, сколько товаров подпадает под эти условия, можно выполнить SQL-запрос в базе данных или использовать WP_Query с мета-запросами. Например, SQL-запрос для поиска товаров, не продававшихся последние 180 дней:
SELECT p.ID, p.post_title FROM wp_posts p LEFT JOIN wp_wc_order_product_lookup opl ON p.ID = opl.product_id WHERE p.post_type = 'product' AND p.post_status = 'publish' GROUP BY p.ID HAVING MAX(opl.date_created) < DATE_SUB(NOW(), INTERVAL 180 DAY) OR MAX(opl.date_created) IS NULL;Этот запрос покажет товары, которые не были проданы за последние 180 дней или не продавались вообще.
Пошаговое решение: автоматизация удаления через WP-Cron и код
1. Создание функции для удаления неактивных товаров
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
function wc_delete_inactive_products() {
$days_inactive = 180; // Период неактивности в днях
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => '_last_sale_date',
'value' => $date_threshold,
'compare' => '<',
'type' => 'DATETIME',
),
array(
'key' => '_last_sale_date',
'compare' => 'NOT EXISTS',
),
),
);
$products = get_posts($args);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // Полное удаление
}
}Здесь мы используем кастомное метаполе _last_sale_date для хранения даты последней продажи. Если такого поля нет, будем считать товар не продаваемым.
2. Обновление даты последней продажи при оформлении заказа
Чтобы функция работала корректно, нужно обновлять метаполе при каждой продаже:
add_action('woocommerce_order_status_completed', 'update_product_last_sale_date');
function update_product_last_sale_date($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
update_post_meta($product_id, '_last_sale_date', current_time('mysql'));
}
}3. Настройка WP-Cron для регулярного запуска
Добавим задачу в WP-Cron, которая будет запускать удаление раз в неделю:
add_action('wc_weekly_delete_inactive_products', 'wc_delete_inactive_products');
function wc_schedule_weekly_product_deletion() {
if (!wp_next_scheduled('wc_weekly_delete_inactive_products')) {
wp_schedule_event(time(), 'weekly', 'wc_weekly_delete_inactive_products');
}
}
add_action('wp', 'wc_schedule_weekly_product_deletion');Проверка результата после внедрения
- Проверьте наличие метаполя
_last_sale_dateу товаров через phpMyAdmin или плагин Advanced Custom Fields. - Создайте тестовый заказ, убедитесь, что дата обновляется.
- Запустите функцию удаления вручную, вызвав
wc_delete_inactive_products()из консоли WP-CLI или временно добавив вызов в шаблон. - Проверьте, что товары с истекшим сроком удалились полностью из базы.
- Просмотрите лог ошибок сервера на предмет возможных проблем с правами или вызовами функций.
Частые ошибки и как их исправить
- Отсутствие метаполя _last_sale_date: если нет обновления даты продажи, товары не будут корректно определяться. Убедитесь, что хук
woocommerce_order_status_completedработает и обновляет поле. - Неправильный формат даты: дата должна быть в формате MySQL DATETIME, иначе сравнения не сработают.
- Функция не запускается по расписанию: убедитесь, что WP-Cron активен, и на сайте есть трафик для его срабатывания, либо используйте серверный cron для вызова
wp-cron.php. - Ошибка удаления товаров: проверьте права пользователя и функцию
wp_delete_post()на наличие ошибок.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($product_id, true)для полного удаления, чтобы не оставлять мусор в базе. - Перед массовым удалением рекомендуем создавать резервные копии базы данных.
- Для больших магазинов разбивайте удаление на партии по 50-100 товаров, чтобы избежать таймаутов.
- Добавьте логирование удаленных товаров, чтобы отслеживать процесс и возможные ошибки.
- Если не хотите полностью удалять товар, используйте смену статуса на
draftилиprivate.
Сравнение способов удаления неактивных товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Автоматическое удаление с настройками через UI | Простота настройки, удобство | Дополнительная нагрузка, ограниченная гибкость |
| Код с WP-Cron и метаполями | Полная кастомизация, интеграция с бизнес-логикой | Контроль, отсутствие лишних плагинов | Требует навыков, может вызвать ошибки при неправильной реализации |
| Ручной SQL-запрос | Удаление напрямую в базе | Очень быстро, без нагрузки на WordPress | Риск потери данных, требует бэкапа, нет логики |