Диагностика проблемы: зачем нужно автоматическое удаление товаров без наличия
В интернет-магазинах на WooCommerce со временем накапливаются товары, которых нет в наличии. Они занимают место в базе данных, мешают навигации покупателей и могут ухудшать SEO. Ручное удаление таких товаров неудобно и требует постоянного контроля. Автоматизация процесса решает эти проблемы.
Подходы к решению задачи автоматического удаления товаров без наличия
1. Использование плагинов
Плагины типа Clearfy Pro могут помочь с очисткой сайта, включая удаление неактивных товаров, но зачастую это комплексные решения с платной подпиской.
2. Самописный код для автоматического удаления
Для большей гибкости и контроля можно написать собственный скрипт на PHP, который будет запускаться по расписанию (WP-Cron).
Пошаговое решение: реализация автоудаления через WP-Cron
Шаг 1. Создаем функцию удаления товаров без наличия
function wpb_delete_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true для удаления без перехода в корзину
}
}
}Шаг 2. Регистрируем событие WP-Cron для регулярного запуска
function wpb_schedule_stock_cleanup() {
if (!wp_next_scheduled('wpb_daily_stock_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_stock_cleanup');
}
}
add_action('wp', 'wpb_schedule_stock_cleanup');
add_action('wpb_daily_stock_cleanup', 'wpb_delete_out_of_stock_products');Шаг 3. Проверяем работу и при необходимости запускаем вручную
Для теста функцию удаления можно вызвать напрямую:
add_action('init', function() {
if (current_user_can('administrator') && isset($_GET['run_stock_cleanup'])) {
wpb_delete_out_of_stock_products();
echo 'Удаление товаров без наличия выполнено';
exit;
}
});После добавления этого кода зайдите на сайт в админке с параметром ?run_stock_cleanup=1 например https://example.com/wp-admin/?run_stock_cleanup=1 — при успешном выполнении удалится весь товар со статусом outofstock.
Проверка результата после внедрения
- Проверьте, что товары со статусом
outofstockдействительно удаляются (вручную или через WP-Cron). - В админке WooCommerce в разделе «Товары» не должно быть товаров с состоянием «Нет в наличии».
- Проверьте логи WP-Cron с помощью плагина WP Crontrol или аналогов.
Частые ошибки и как их исправить
- Товары не удаляются: убедитесь, что функция вызывается, и WP-Cron работает (проверьте лог и наличие события
wpb_daily_stock_cleanup). - Удаляются не те товары: проверьте правильность meta_query — значение
_stock_statusдолжно бытьoutofstock. - Удаление происходит, но товар остается в базе: возможно, установлены плагины резервного копирования или кеширования, блокирующие удаление. Очистите кеш и проверьте права пользователя.
- WP-Cron не срабатывает по расписанию: настройте системный cron на сервере или запустите вручную для теста.
Практические советы по безопасности и производительности
- Удаляйте товары только с подтверждением, чтобы не потерять данные по ошибке (например, используйте дополнительную мета-метку
auto_delete_ready). - Если товаров много, разбивайте удаление на порции, чтобы избежать превышения лимитов времени выполнения PHP.
- Для запуска WP-Cron используйте системный cron на сервере — это надежнее, чем при посещениях сайта.
- Перед автоматическим удалением делайте резервные копии базы данных.
Таблица сравнения вариантов удаления товаров без наличия
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Плагин Clearfy Pro | Готовое решение, дополнительные функции оптимизации | Платный, избыточный функционал для простой задачи | Clearfy Pro |
| Самописный код с WP-Cron | Гибкость, контроль, бесплатность | Требует знаний PHP, настройка cron | Код из статьи выше |
| Ручное удаление через админку | Простота без кода | Неэффективно при большом количестве товаров | WooCommerce «Товары» → фильтр по наличию → удаление |