Диагностика задачи: зачем удалять товары по дате и статусу
В WooCommerce с течением времени накапливаются товары, которые могут стать неактуальными или устаревшими, например, товары со статусом "Черновик" или "Отменённый" и датой публикации более полугода назад. Оставлять их на сайте нецелесообразно: они загромождают базу данных, замедляют админку и могут ухудшать SEO. Автоматическое или разовое удаление таких товаров через админку неудобно, особенно если их сотни или тысячи. Решение — написать скрипт, который удалит товары по заданным критериям — дате и статусу.
Как проверить текущий статус и дату товаров WooCommerce
Для начала убедитесь, что товары действительно имеют нужные статусы и даты. В WooCommerce посты товаров — это записи с типом product. Их статусы могут быть стандартными WordPress (publish, draft) и специфичными WooCommerce (pending, private, trash, future).
Проверить товары с нужным статусом и датой можно через следующий WP_Query:
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'pending'],
'date_query' => [
[
'before' => '6 months ago'
]
],
'posts_per_page' => 10
];
$query = new WP_Query($args);
foreach ($query->posts as $product) {
echo $product->ID . ' - ' . $product->post_title . "\n";
}Так вы получите первые 10 товаров-черновиков, опубликованных более 6 месяцев назад. Это поможет убедиться, что выборка корректна.
Пошаговое решение: удаление товаров по дате и статусу
Для массового удаления используем WP_Query и функцию wp_delete_post(), которая удаляет товар с учётом всех зависимостей WooCommerce (включая метаданные и таксономии). Вот пример рабочего кода, который можно добавить в файл темы (например, в functions.php) или использовать в отдельном плагине:
function wc_delete_old_products_by_status_date() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'pending'],
'date_query' => [
[
'before' => '6 months ago',
],
],
'posts_per_page' => 50, // обрабатываем по 50 товаров за запуск
'fields' => 'ids',
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
error_log('No old products found for deletion.');
return;
}
foreach ($query->posts as $product_id) {
// Удаляем товар окончательно
wp_delete_post($product_id, true);
error_log("Deleted product ID: $product_id");
}
}
// Запускаем функцию при активации сайта или вручную
// wc_delete_old_products_by_status_date();Примечания:
- Устанавливайте
posts_per_pageс учётом производительности сервера. - Для запуска кода вручную вызовите функцию один раз, потом закомментируйте, чтобы не удалять товары постоянно.
- Аргумент
trueвоwp_delete_post()гарантирует безвозвратное удаление (обход корзины).
Автоматизация через WP-CLI
Для регулярного удаления можно написать WP-CLI команду. Пример простейшей реализации:
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('wc-delete-old-products', function() {
wc_delete_old_products_by_status_date();
WP_CLI::success('Old products deleted by status and date.');
});
}Запуск из консоли: wp wc-delete-old-products.
Проверка результата после внедрения
Чтобы убедиться, что товары удалены корректно:
- Повторите WP_Query из раздела диагностики — количество товаров должно уменьшиться.
- Проверьте базу данных напрямую (таблица
wp_posts) на предмет отсутствия удалённых ID. - Просмотрите логи ошибок сервера или
error_logфайла, если функция выводит логи. - Проверьте админку WooCommerce — отсутствуют ли удалённые товары.
Частые ошибки при удалении товаров WooCommerce
- Удаление без проверки резервных копий. Не запускайте скрипты удаления без резервного копирования базы данных.
- Неправильный статус товара. Учитывайте, что WooCommerce использует как стандартные, так и дополнительные статусы. Проверяйте текущие статусы через админку.
- Проблемы с правами доступа. Запуск кода должен происходить от имени администратора или с достаточными правами.
- Удаление с корзиной вместо окончательного удаления. Если не указать второй параметр
trueвwp_delete_post, товары попадут в корзину и не освободят место. - Перегрузка сервера при большом количестве товаров. Делайте удаление пакетами и не запускайте многоразово без пауз.
Практические советы по безопасности и производительности
- Обязательно делайте резервное копирование базы данных перед массовыми изменениями.
- Используйте WP-CLI для безопасного и быстрого запуска массовых операций.
- Ограничивайте количество удаляемых товаров за один проход (например, 50 или 100).
- Добавьте логирование и уведомления об удалении для контроля.
- Оптимизируйте таблицы базы данных после удаления (через phpMyAdmin или WP-CLI).
- Если сайт большой, рассмотрите использование плагинов для массового управления товарами с поддержкой фильтров по статусу и дате.
Сравнение методов удаления товаров WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| WP_Query + wp_delete_post | Гибкость, можно подстроить под любые условия, без сторонних плагинов | Требует навыков программирования, риск ошибок при неправильном коде |
| WP-CLI команда | Быстрое выполнение, удобно для админов и разработчиков, можно запускать по расписанию | Требует доступа к серверу по SSH, не всегда доступно на shared-хостингах |
| Плагины массового управления товарами | Удобный интерфейс, готовые фильтры и функции, минимальный риск ошибок | Могут замедлить сайт, не всегда бесплатны, ограничены функционалом |