Диагностика проблемы: зачем удалять старые товары в WooCommerce?
Со временем каталог WooCommerce может разрастаться за счет устаревших, неактивных или тестовых товаров, которые больше не продаются и не нужны. Наличие таких товаров замедляет работу админки, увеличивает размер базы данных и может влиять на SEO. Зачастую владельцы магазинов задаются вопросом, как быстро и безопасно удалить эти записи массово, чтобы не потерять нужные данные.
Критерии выбора товаров для удаления
Чтобы не потерять актуальные товары, стоит определить четкие критерии для удаления. Например:
- Товары, которые не обновлялись более 1 года.
- Товары со статусом "Черновик" или "Ожидает проверки".
- Товары с запасом 0 и без продаж за последний год.
Как получить список таких товаров в базе
Для диагностики можно использовать SQL-запросы или WP-CLI, но удобнее писать PHP-скрипт, который выведет ID и названия кандидатов на удаление.
function get_old_woocommerce_products() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'pending'],
'date_query' => [
[
'before' => '1 year ago'
]
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
return $query->posts;
}
// Выведем ID и названия
$old_products = get_old_woocommerce_products();
foreach ($old_products as $product_id) {
$title = get_the_title($product_id);
echo "ID: $product_id - $title<br>";
}Пошаговое решение: автоматическое удаление старых товаров
Удалять товары нужно аккуратно, чтобы не затронуть связанные данные и не нарушить работу магазина.
Шаг 1. Создаем функцию удаления по критериям
function wpguest_delete_old_products() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'pending'],
'date_query' => [
[
'before' => '1 year ago'
]
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if (empty($query->posts)) {
return 'No old products found for deletion.';
}
foreach ($query->posts as $product_id) {
// Удаляем товар вместе с метаданными и связанными данными
wp_delete_post($product_id, true); // true - без возможности восстановления
}
return count($query->posts) . ' old products deleted successfully.';
}Шаг 2. Запускаем функцию вручную или по расписанию
Для однократного запуска можно добавить вызов функции в файл темы или плагина и затем удалить код после выполнения:
add_action('init', function () {
if (current_user_can('administrator') && isset($_GET['delete_old_products'])) {
echo wpguest_delete_old_products();
exit;
}
});После этого достаточно в браузере перейти по адресу https://example.com/?delete_old_products=1 под администратором и дождаться вывода результата.
Шаг 3. Автоматизация с помощью WP-Cron
Чтобы регулярно очищать магазин от старых товаров, можно создать задачу WP-Cron:
if (!wp_next_scheduled('wpguest_cron_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'wpguest_cron_delete_old_products');
}
add_action('wpguest_cron_delete_old_products', 'wpguest_delete_old_products');Проверка результата после внедрения
Чтобы убедиться, что удаление сработало:
- Посмотрите в админке WooCommerce > Товары — должны исчезнуть товары, подходящие под критерии.
- Воспользуйтесь SQL-запросом для проверки количества товаров с нужным статусом и датой обновления:
SELECT COUNT(*) FROM wp_posts
WHERE post_type = 'product'
AND post_status IN ('draft','pending')
AND post_modified < DATE_SUB(NOW(), INTERVAL 1 YEAR);<Если результат 0 или значительно меньше, значит очистка прошла успешно.
Частые ошибки и как их исправить
- Удаляются нужные товары: проверьте критерии выборки, уточните дату и статус, добавьте дополнительную проверку метаполей.
- Ошибка при удалении из-за зависимостей: wp_delete_post с параметром
trueудаляет метаданные, но если есть сторонние связи (плагины, кросс-продажи), удаление может быть неполным. В таком случае нужно дополнительно очищать custom tables или связи. - Удаление не запускается: убедитесь, что функция вызывается, права пользователя подходят, и нет блокировок по безопасности (например, модуль безопасности сервера).
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Для больших магазинов удаление лучше делать пакетно, например, по 50 товаров за один запуск, чтобы не перегружать сервер.
- Используйте WP-CLI для удаления, если у вас есть доступ к серверу, это быстрее и надежнее.
- Отключите индексацию этих товаров поисковыми системами перед удалением (через метатег robots или плагин Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wpguest.ru&utm_medium=article&utm_campaign=kak-udalit-starye-i-neispolzuemye-tovary-woocommerce-s-pomoshhyu-koda).
Сравнение вариантов удаления старых товаров WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Долго, неэффективно для больших каталогов |
| PHP-код с WP_Query и wp_delete_post | Автоматизация, гибкие критерии, можно запускать по расписанию | Нужны навыки разработки, риск ошибки без тестирования |
| WP-CLI команды (wp post delete) | Быстро, подходит для больших баз, не зависит от сайта | Требуется доступ к серверу, командная строка |
| Плагины очистки базы | Удобно для новичков, готовые решения | Могут не иметь нужных условий, нагрузка на сайт |