Диагностика проблемы: зачем удалять старые черновики товаров
В WooCommerce при активной работе с каталогом товаров часто накапливаются неактивные товары со статусом "Черновик". Они не отображаются в магазине, но занимают ресурсы базы данных и усложняют администрирование. Особенно если товары создаются массово или импортируются для последующего редактирования.
Задача — автоматически удалять товары-черновики, которым больше 30 дней, чтобы поддерживать базу в чистоте и ускорить работу с товарами.
Пошаговое решение: как настроить автоматическое удаление товаров-черновиков
1. Создание функции удаления
Добавим в файл functions.php темы (рекомендуется использовать дочернюю тему или плагин для кастомного кода) функцию, которая будет искать товары со статусом draft и датой создания старше 30 дней, и удалять их.
function wpkpi_delete_old_draft_products() {
$args = [
'post_type' => 'product',
'post_status' => 'draft',
'date_query' => [
'before' => date('Y-m-d', strtotime('-30 days')),
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$draft_products = get_posts($args);
if (!empty($draft_products)) {
foreach ($draft_products as $product_id) {
wp_delete_post($product_id, true); // true – удаление без возможности восстановления
}
}
}2. Планирование регулярного запуска с помощью WP-Cron
Чтобы функция запускалась автоматически, добавим событие в WP-Cron:
if (!wp_next_scheduled('wpkpi_daily_delete_old_drafts')) {
wp_schedule_event(time(), 'daily', 'wpkpi_daily_delete_old_drafts');
}
add_action('wpkpi_daily_delete_old_drafts', 'wpkpi_delete_old_draft_products');Этот код запускает удаление один раз в сутки. Если нужно запускать чаще, можно использовать другие интервалы или добавить кастомный интервал.
Проверка результата после внедрения
Чтобы проверить, что код работает:
- Создайте тестовый товар со статусом "Черновик" и датой публикации более 30 дней назад (можно вручную изменить дату публикации в базе или использовать плагин).
- Запустите функцию вручную (например, вызвав
wpkpi_delete_old_draft_products()через консоль WP-CLI или временно добавив вызов вfunctions.php). - Проверьте, что товар удалён из списка товаров в админке.
- После этого удалите вызов функции вручную, чтобы не запускать удаление при каждом запросе.
Частые ошибки и как исправить
- Функция не запускается автоматически: Проверьте, что WP-Cron работает. В некоторых хостингах WP-Cron отключён. Запустите вручную cron через WP-CLI или настройте системный cron.
- Удаляются не те товары: Убедитесь, что в запросе правильно указан
post_typeиpost_status. Например, если используются кастомные статусы — учтите их. - Нет прав на удаление: Код запускается с правами текущего пользователя. При использовании WP-Cron это обычно админские права, но если нет — проверьте разрешения.
- Незначительная нагрузка при большом количестве товаров: Если товаров много, лучше удалять партиями (например, по 50 за раз), чтобы избежать таймаута.
Практические советы по безопасности и производительности
- Резервное копирование: Перед автоматическим удалением важно иметь резервные копии базы, чтобы избежать потери данных.
- Логирование удалений: Добавьте запись в лог для отслеживания удалённых товаров:
function wpkpi_delete_old_draft_products() {
$args = [
'post_type' => 'product',
'post_status' => 'draft',
'date_query' => [
'before' => date('Y-m-d', strtotime('-30 days')),
],
'posts_per_page' => 50,
'fields' => 'ids',
];
$draft_products = get_posts($args);
if (!empty($draft_products)) {
foreach ($draft_products as $product_id) {
wp_delete_post($product_id, true);
error_log('Deleted draft product ID: ' . $product_id);
}
}
}- Оптимизация запросов: Используйте
posts_per_pageс ограничением для уменьшения нагрузки, запускайте удаление в несколько итераций. - Тестирование на staging-сайте: Перед внедрением на боевом сайте проверяйте работу на тестовом окружении.
Сравнение вариантов удаления старых черновиков товаров
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, контроль | Трудозатратно при большом количестве | Мало товаров, редкие чистки |
| Автоматический WP-Cron с кастомной функцией (код) | Полный контроль, без плагинов | Требует навыков разработки, возможно нагрузка | Средние и крупные магазины, регулярное удаление |
| Плагины для очистки базы (например, WP-Optimize) | Удобство, дополнительные функции оптимизации | Могут быть избыточными, нагрузка, нет специфики по статусам товаров | Общая оптимизация базы, не только товары |