Диагностика проблемы: почему и когда нужно удалять старые товары
В магазинах на WooCommerce с большим каталогом зачастую появляются устаревшие или нерелевантные товары, которые уже не продаются или неактуальны. Ручное удаление таких товаров — трудоемкий и рискованный процесс, особенно если их сотни или тысячи. Автоматизация удаления по дате публикации или изменению позволяет поддерживать каталог в актуальном состоянии и улучшить производительность сайта.
Пошаговое решение: автоматическое удаление товаров WooCommerce по дате
Шаг 1. Создание регулярного события WP-Cron
Для автоматического удаления товаров нужно создать задачу cron, которая будет запускаться, например, ежедневно.
function wpmarket_schedule_daily_product_cleanup() {
if ( ! wp_next_scheduled( 'wpmarket_daily_product_cleanup_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpmarket_daily_product_cleanup_hook' );
}
}
add_action( 'wp', 'wpmarket_schedule_daily_product_cleanup' );Шаг 2. Написание функции удаления товаров по условию возраста
Удалим все товары, которые были опубликованы более 180 дней назад.
function wpmarket_delete_old_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'date_query' => array(
array(
'column' => 'post_date',
'before' => '180 days ago',
),
),
'fields' => 'ids',
'post_status' => 'publish',
);
$old_products = get_posts( $args );
foreach ( $old_products as $product_id ) {
wp_delete_post( $product_id, true ); // true - удаление без перемещения в корзину
}
}
add_action( 'wpmarket_daily_product_cleanup_hook', 'wpmarket_delete_old_products' );Шаг 3. Добавление безопасности и логирования
Для отслеживания удалений добавим простое логирование в файл wp-content/debug.log.
function wpmarket_delete_old_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'date_query' => array(
array(
'column' => 'post_date',
'before' => '180 days ago',
),
),
'fields' => 'ids',
'post_status' => 'publish',
);
$old_products = get_posts( $args );
if ( empty( $old_products ) ) {
error_log( 'No old products found for deletion on ' . date('Y-m-d H:i:s') );
return;
}
foreach ( $old_products as $product_id ) {
$title = get_the_title( $product_id );
$deleted = wp_delete_post( $product_id, true );
if ( $deleted ) {
error_log( "Deleted product ID {$product_id} ({$title}) on " . date('Y-m-d H:i:s') );
} else {
error_log( "Failed to delete product ID {$product_id} ({$title}) on " . date('Y-m-d H:i:s') );
}
}
}Проверка результата после внедрения
1. Включите WP_DEBUG и WP_DEBUG_LOG в wp-config.php для записи логов:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );2. Выполните вручную событие cron (для теста) через WP-CLI:
wp cron event run wpmarket_daily_product_cleanup_hook3. Проверьте файл wp-content/debug.log на наличие записей об удалении товаров.
4. Проверьте в админке WooCommerce, что товары с датой старше 180 дней действительно удалены.
Частые ошибки и как их исправить
- Задача cron не запускается: Убедитесь, что WordPress посещают пользователи, или настройте системный cron для wp-cron.php. Для системного cron используйте команду:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1. - Удаление не происходит: Проверьте, что функция
wp_delete_postвызывается с параметромtrueдля полного удаления, а не только в корзину. - Удаляются не те товары: Проверьте параметры
date_queryиpost_status, чтобы выбирать только нужные публикации. - Память или время выполнения превышены: Если товаров много, разбейте процесс на части с пагинацией, например, по 100 товаров за раз.
Практические советы по производительности и безопасности
- Для больших магазинов используйте пагинацию и batch-удаление, чтобы избежать превышения лимитов PHP.
- Логируйте только ошибки и критичные события, чтобы не перегружать debug.log.
- Ограничьте права доступа к скриптам удаления, чтобы избежать потенциального злоупотребления.
- Регулярно создавайте резервные копии базы данных перед автоматическим удалением.
- Используйте плагины, такие как Clearfy Pro, для оптимизации базы и дополнительно очистки данных WooCommerce.
Сравнение способов реализации автоматического удаления
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с собственным кодом | Гибкость, полное управление, отсутствует зависимость от плагинов | Требует знаний PHP, риски при ошибках в коде |
| Плагины очистки (например, Clearfy Pro) | Простота настройки, дополнительные функции оптимизации | Может быть избыточным, влияет на производительность при больших объемах |
| Ручное удаление через админку | Простота, нет риска ошибочного кода | Неэффективно при большом количестве товаров, трудоемко |