Диагностика проблемы: зачем автоматически удалять старые товары-черновики
В WooCommerce часто накапливаются товары, которые были созданы, но так и не опубликованы — они остаются в статусе "черновик". Это приводит к загромождению базы данных, усложняет администрирование каталога и может негативно влиять на производительность сайта. Особенно актуально для магазинов с большим каталогом и частым обновлением ассортимента.
Чтобы выявить количество таких товаров, можно выполнить SQL-запрос напрямую на базе данных WordPress:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product' AND post_status = 'draft';Если число черновиков велико, стоит рассмотреть автоматическое удаление товаров, которые не публикуются долгое время — например, старше 30 дней.
Пошаговое решение: как настроить автоматическое удаление товаров-черновиков WooCommerce старше 30 дней
1. Создаём функцию для удаления товаров-черновиков
Добавьте следующий код в файл functions.php вашей темы или в специально созданный плагин:
function wpkpi_delete_old_draft_products() {
$args = array(
'post_type' => 'product',
'post_status' => 'draft',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$old_draft_products = get_posts($args);
if (!empty($old_draft_products)) {
foreach ($old_draft_products as $product_id) {
wp_delete_post($product_id, true); // true — удаление без помещения в корзину
}
}
}2. Настраиваем планировщик задач WP-Cron для регулярного запуска
Добавьте в functions.php регистрацию события и хука, чтобы функция запускалась автоматически раз в сутки:
// Регистрируем ежедневное событие
if (!wp_next_scheduled('wpkpi_daily_delete_old_draft_products')) {
wp_schedule_event(time(), 'daily', 'wpkpi_daily_delete_old_draft_products');
}
// Подключаем функцию к событию
add_action('wpkpi_daily_delete_old_draft_products', 'wpkpi_delete_old_draft_products');3. Опционально: добавляем ручной запуск через админку
Чтобы иметь возможность запускать удаление вручную, добавьте в админ-меню кнопку:
add_action('admin_menu', function() {
add_submenu_page(
'tools.php',
'Удалить старые товары-черновики',
'Удалить старые черновики',
'manage_options',
'wpkpi-delete-old-drafts',
'wpkpi_delete_old_drafts_page'
);
});
function wpkpi_delete_old_drafts_page() {
if (isset($_POST['wpkpi_delete_old_drafts_nonce']) && wp_verify_nonce($_POST['wpkpi_delete_old_drafts_nonce'], 'wpkpi_delete_old_drafts')) {
wpkpi_delete_old_draft_products();
echo '<div class="updated notice"><p>Удаление завершено.</p></div>';
}
?>
<div class="wrap">
<h1>Удалить товары-черновики старше 30 дней</h1>
<form method="post">
<?php wp_nonce_field('wpkpi_delete_old_drafts', 'wpkpi_delete_old_drafts_nonce'); ?>
<p><input type="submit" class="button button-primary" value="Удалить"></p>
</form>
</div>
<?php
}Проверка результата после внедрения
- Зайдите в админку WooCommerce → Товары и установите фильтр по статусу «Черновик». Проверьте, что количество товаров-черновиков старше 30 дней уменьшилось или равно нулю.
- Для проверки работы WP-Cron можно использовать плагин WP Crontrol. В списке задач должно появиться и выполняться событие
wpkpi_daily_delete_old_draft_products. - При ручном запуске через новый пункт меню «Инструменты → Удалить старые черновики» должен выводиться уведомляющий блок об успешном выполнении.
Частые ошибки и как их исправить
- Функция не запускается автоматически: Проверьте, активирован ли WP-Cron. Он может не работать, если на сайте нет трафика или отключён в
wp-config.php(константаDISABLE_WP_CRON= true). Решение — настроить системный cron на сервере или проверить плагин WP Crontrol. - Удаление не происходит: Убедитесь, что пользователь, под которым выполняется функция, имеет права на удаление товаров. Проверьте, что посты действительно имеют статус
draftи дата создания старше 30 дней. - Потеря данных: Всегда делайте резервную копию базы перед массовым удалением. Вызов
wp_delete_post()с вторым параметромtrueудаляет записи навсегда без возможности восстановления из корзины.
Практические советы по безопасности и производительности
- Устанавливайте лимит на количество удаляемых товаров за один запуск, чтобы избежать таймаутов сервера. Например, замените
'posts_per_page' => -1на'posts_per_page' => 50и запускайте функцию несколько раз. - Логируйте действия удаления в отдельный файл или таблицу, чтобы можно было отследить удалённые товары.
- Используйте транзиенты для кеширования результата подсчёта черновиков, чтобы не нагружать базу данных лишними запросами.
- Если у вас есть плагин Clearfy Pro от WPShop, можно дополнительно оптимизировать базу и очистить мусорные записи, что поможет поддерживать сайт в порядке.
Сравнение вариантов реализации удаления товаров-черновиков
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кастомной функцией | Полный контроль, без сторонних плагинов, гибкость настроек | Зависит от трафика, требует навыков программирования |
| Плагины автоматической очистки базы (например, WP-Optimize) | Простота в использовании, дополнительные функции оптимизации | Могут удалять не только нужные записи, меньше контроля |
| Ручное удаление через админку | Безопасно, можно проверить перед удалением | Трудозатратно при большом объёме товаров |