Диагностика проблемы: зачем и когда удалять отсутствующие товары
В магазинах на WooCommerce часто сталкиваются с ситуацией, когда товары становятся недоступными по разным причинам — поставка прекращена, товар снят с производства или временно отсутствует. Это приводит к накоплению устаревших карточек товаров, которые ухудшают навигацию и SEO, а также повышают нагрузку на базу данных.
Ручное удаление таких товаров — трудозатратный процесс. Автоматизация решения этой задачи позволит поддерживать каталог в актуальном состоянии без лишних усилий.
Как автоматически удалять отсутствующие товары по расписанию
Определение отсутствующих товаров
Первый шаг — определить критерий «отсутствия» товара. Чаще всего это:
- Статус товара: 'outofstock' (нет на складе);
- Пользовательское поле или мета-данные, указывающие на отсутствие;
- Дата последнего обновления товара — если товар не обновлялся длительное время.
Для примера используем стандартный статус 'outofstock' и удаляем товары, которые находятся в этом статусе более 30 дней.
Реализация кода для удаления товаров
Реализуем WP-Cron задание, которое ежедневно проверяет и удаляет товары с статусом 'outofstock' старше 30 дней.
function wpdirect_schedule_delete_outofstock_products() {
if ( ! wp_next_scheduled( 'wpdirect_delete_outofstock_products_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wpdirect_delete_outofstock_products_daily' );
}
}
add_action( 'wp', 'wpdirect_schedule_delete_outofstock_products' );
function wpdirect_delete_outofstock_products() {
$date_threshold = date( 'Y-m-d H:i:s', strtotime( '-30 days' ) );
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => $date_threshold,
],
],
'fields' => 'ids',
];
$products = get_posts( $args );
foreach ( $products as $product_id ) {
wp_delete_post( $product_id, true );
}
}
add_action( 'wpdirect_delete_outofstock_products_daily', 'wpdirect_delete_outofstock_products' );Пошаговое руководство по внедрению
- Добавьте код в файл
functions.phpвашей дочерней темы или создайте небольшой плагин. - Убедитесь, что WP-Cron активен. Для проверки можно использовать плагин WP Crontrol.
- Настройте сервер, если хотите использовать системный cron вместо WP-Cron для повышения надежности.
- Проверьте, что товары со статусом
outofstockи датой изменения более 30 дней действительно удаляются после запуска cron.
Как проверить, что решение работает
- Вручную запустите функцию
wpdirect_delete_outofstock_products(например, через консоль WP-CLI или временно вызвав функцию на странице). - Проверьте список товаров до и после выполнения функции — отсутствующие товары старше 30 дней должны быть удалены.
- Используйте плагин WP Crontrol для просмотра запланированных задач и их логов.
- Проверьте базу данных: таблица
wp_postsне должна содержать удалённых товаров.
Частые ошибки и как их исправить
- WP-Cron не срабатывает — проверьте, что на сайте есть посещения, запускающие WP-Cron, или настройте системный cron для вызова
wp-cron.php. - Удаляются не те товары — убедитесь, что критерии поиска товаров (статус, дата) заданы корректно.
- Удаление не происходит из-за прав доступа — проверьте, что функция запускается с достаточными правами (например, не из гостевого контекста).
- Ошибка памяти или таймаут — если товаров много, разбейте задачу на партии с помощью параметра
'posts_per_page' => 50и реализуйте пагинацию.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии перед внедрением автоматического удаления.
- Используйте
wp_delete_post( $post_id, true )с параметромtrueдля полного удаления с мета-данными. - Для больших магазинов лучше разбивать удаление на партии, чтобы не перегружать базу.
- Регулярно проверяйте логи ошибок и работы WP-Cron.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление | Полный контроль | Трудозатратно, риск пропустить | Маленькие магазины, редкие изменения |
| Плагин (например, WP Bulk Delete) | Простота настройки | Дополнительная нагрузка, может быть не гибким | Для большинства пользователей без навыков кода |
| Код с WP-Cron (описанный) | Автоматизация, гибкость, без сторонних плагинов | Нужны навыки разработки, настройка WP-Cron | Средние и крупные магазины с регулярными обновлениями |