Диагностика проблемы: зачем удалять неактивные товары по дате изменения
Интернет-магазины на WooCommerce часто сталкиваются с проблемой "мёртвого" товара — тех товаров, которые давно не обновлялись и не продаются. Они создают нагрузку на базу данных, замедляют работу сайта и мешают покупателям находить актуальные позиции.
Удаление таких товаров вручную — трудоёмкий процесс, особенно при большом ассортименте. Автоматизация удаления по дате последнего изменения — оптимальный выход.
Как определить неактивные товары для удаления
Под неактивными товарами будем понимать продукты, дата последнего обновления которых старше заданного периода, например 90 дней. Также можно учитывать статус товара — только "черновики" и "приватные" для удаления или все без исключения.
Для получения даты последнего изменения используется поле post_modified в таблице wp_posts.
Пошаговое решение: автоматическое удаление товаров по дате последнего изменения
1. Создаём функцию удаления
function wc_delete_inactive_products_by_date( $days = 90 ) {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID товаров, которые не обновлялись дольше $days и имеют статус 'publish' или 'draft'
$product_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_modified < %s AND post_status IN ('publish', 'draft')",
$date_threshold
) );
if ( empty( $product_ids ) ) {
return 0; // Нет товаров для удаления
}
$deleted_count = 0;
foreach ( $product_ids as $product_id ) {
// Удаляем товар окончательно
wp_delete_post( $product_id, true );
$deleted_count++;
}
return $deleted_count;
}2. Запускаем функцию по расписанию (WP-Cron)
Чтобы удаление происходило автоматически, добавим cron-задачу, например, раз в неделю.
function wc_schedule_delete_inactive_products() {
if ( ! wp_next_scheduled( 'wc_delete_inactive_products_event' ) ) {
wp_schedule_event( time(), 'weekly', 'wc_delete_inactive_products_event' );
}
}
add_action( 'wp', 'wc_schedule_delete_inactive_products' );
add_action( 'wc_delete_inactive_products_event', function() {
$deleted = wc_delete_inactive_products_by_date( 90 );
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log("Удалено неактивных товаров: " . $deleted);
}
});Как проверить, что удаление сработало
- Заходим в админку WooCommerce > Товары и фильтруем товары по дате последнего изменения старше 90 дней — таких товаров не должно остаться.
- В логах сервера или отладочном логировании WordPress (если включён WP_DEBUG) должна появляться запись о количестве удалённых товаров при срабатывании cron.
- Можно временно заменить
wp_delete_post($product_id, true)наerror_log('Would delete product ID: '.$product_id)для теста без удаления.
Частые ошибки и как их исправить
- Крон не срабатывает: Проверьте, что на сайте есть посещения для запуска WP-Cron или настройте системный cron для вызова
wp-cron.php. - Удаляются лишние товары: Убедитесь, что фильтр статуса товара в запросе соответствует вашим требованиям — измените
post_statusпри необходимости. - Удаление не происходит: Возможно, недостаточно прав у пользователя или плагин безопасности блокирует функцию
wp_delete_post. Проверьте разрешения и логи ошибок.
Практические советы по безопасности и производительности
- Перед автоматическим удалением сделайте резервную копию базы данных.
- Добавьте оповещение администратору по email о количестве удалённых товаров.
- Для больших сайтов с тысячами товаров используйте пакетное удаление, чтобы избежать таймаутов:
function wc_delete_inactive_products_batch( $days = 90, $batch_size = 50 ) {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$product_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_modified < %s AND post_status IN ('publish', 'draft') LIMIT %d",
$date_threshold,
$batch_size
) );
if ( empty( $product_ids ) ) {
return 0;
}
$deleted_count = 0;
foreach ( $product_ids as $product_id ) {
wp_delete_post( $product_id, true );
$deleted_count++;
}
return $deleted_count;
}Сравнение способов удаления неактивных товаров
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простой контроль, визуальный выбор | Очень трудоёмко, риск забыть | Подходит для магазинов с малым количеством товаров |
| Плагин автоочистки | Удобно, настройки через UI | Зависимость от стороннего кода, нагрузка | Использовать проверенные плагины |
| Код на WP-Cron, кастомный скрипт | Гибкость, полное управление процессом | Требует навыков разработки | Оптимально для разработчиков и крупных магазинов |