Диагностика проблемы: когда и зачем удалять неактивные товары
В магазине WooCommerce со временем накапливаются товары, которые не обновлялись и не продавались длительное время. Такие товары создают "мусор" в базе, замедляют работу сайта и мешают покупателям ориентироваться. Вручную искать и удалять их неудобно, особенно если товаров сотни или тысячи.
Задача — автоматизировать удаление товаров, которые неактивны (по дате последнего изменения или по отсутствию заказов) в течение заданного периода. Это снижает нагрузку на базу и улучшает управление ассортиментом.
Пошаговое решение: создание WP-Cron задачи для удаления неактивных товаров
1. Определение критериев неактивности
Для определения неактивного товара можно использовать:
- Дата последнего обновления товара (
post_modified) - Дата последнего заказа с этим товаром (через мета-данные заказов)
В этом примере реализуем удаление товаров, не обновлявшихся более 180 дней.
2. Регистрация WP-Cron задачи
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
if ( ! wp_next_scheduled( 'wc_delete_inactive_products_event' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_inactive_products_event' );
}
add_action( 'wc_delete_inactive_products_event', 'wc_delete_inactive_products' );
function wc_delete_inactive_products() {
global $wpdb;
$days_inactive = 180; // Порог в днях
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
// Получаем ID товаров, которые не обновлялись дольше порога
$query = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_modified < %s AND post_status = 'publish'",
$date_threshold
);
$product_ids = $wpdb->get_col( $query );
if ( ! empty( $product_ids ) ) {
foreach ( $product_ids as $product_id ) {
// Проверка на заказы с этим товаром
$orders = wc_get_orders( array(
'limit' => 1,
'status' => 'any',
'product_id' => $product_id
) );
if ( empty( $orders ) ) {
// Удаление товара
wp_delete_post( $product_id, true );
}
}
}
}3. Отключение WP-Cron при необходимости
Если ваш сайт использует системный cron, можно отключить WP-Cron, добавив в wp-config.php:
define('DISABLE_WP_CRON', true);И настроить системный cron для вызова wp-cron.php раз в день.
Проверка результата после внедрения
- Включите отладку, добавив
error_logвнутри функции для логирования удаляемых товаров. - Просмотрите базу данных в разделе
wp_posts, чтобы убедиться, что товары со старой датой и отсутствием заказов удалены. - Проверьте раздел «Товары» в админке WooCommerce — неактивные товары должны исчезнуть.
Частые ошибки при автоматическом удалении товаров
- Удаление товаров с активными заказами. Ошибка возникает, если не проверять наличие заказов с товаром. В нашем коде это проверка
wc_get_orders. - Неправильный формат даты. Убедитесь, что
post_modifiedсравнивается в формате 'Y-m-d H:i:s'. - Неправильный хук для WP-Cron. Используйте уникальные имена событий, чтобы не конфликтовать с другими задачами.
- Отсутствие прав на удаление. Проверьте, что код запускается с достаточными правами (в админке или через плагин).
Практические советы по безопасности и производительности
- Перед удалением всегда делайте резервную копию базы данных.
- Используйте
wp_delete_post( $id, true )для полного удаления, без помещения в корзину. - Добавьте лимит на количество удаляемых товаров за один запуск, чтобы избежать таймаутов:
$limit = 20;
$product_ids = array_slice( $product_ids, 0, $limit );- Используйте системный cron для надежности выполнения задач на больших сайтах.
- Логируйте результаты удаления в файл для последующего аудита.
Сравнение вариантов удаления неактивных товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron с кастомным кодом | Гибкость, контроль, нет лишних плагинов | Требует знаний, возможны таймауты на больших базах | Пример кода выше |
| Плагины очистки WooCommerce | Простота настройки, пользовательский интерфейс | Могут быть платными, требуют обновления | Например, "WooCommerce Smart Manager" с фильтрами |
| SQL скрипты вручную | Быстро и эффективно для опытных администраторов | Риск ошибок, нет автоматизации | DELETE запросы по дате и статусу |