Диагностика проблемы: зачем и когда нужно удалять неактивные товары
В интернет-магазинах на WooCommerce со временем накапливаются товары, которые больше не продаются или временно неактивны. Это может замедлять загрузку админки, увеличивать размер базы данных и усложнять поиск актуальных товаров. Особенно остро проблема стоит при большом количестве товаров.
Неактивные товары — это товары со статусом draft, pending или private. В некоторых случаях нужно удалить и товары с меткой outofstock.
Как проверить, какие товары неактивны
SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product' AND post_status IN ('draft', 'pending', 'private');Этот запрос покажет список товаров, которые не опубликованы.
Пошаговое решение: удаление неактивных товаров через PHP-код
Ниже пример PHP-функции, которую можно добавить в functions.php темы или создать отдельный плагин для однократного выполнения. Функция удаляет все товары с указанными статусами.
function wpnews_delete_inactive_products() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'pending', 'private'],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true — удаление без промежуточной корзины
}
}
}
// Запуск функции однократно (например, при активации плагина)
// wpnews_delete_inactive_products();Если хотите удалить товары с нулевым остатком, добавьте проверку мета-поля _stock_status:
function wpnews_delete_outofstock_products() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'meta_key' => '_stock_status',
'meta_value' => 'outofstock',
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true);
}
}
}
// wpnews_delete_outofstock_products();Как проверить, что удаление сработало
- В админке WooCommerce в разделе «Товары» проверьте, что неактивные товары исчезли.
- Запустите SQL-запрос из раздела диагностики еще раз — он должен вернуть пустой результат.
- Проверьте размер таблицы
wp_postsиwp_postmeta, чтобы убедиться, что записи удалены.
Частые ошибки и как их исправить
- Товары не удаляются: убедитесь, что функция вызывается. Добавьте временное действие
add_action('init', 'wpnews_delete_inactive_products');для теста, затем удалите. - Удаляются не все товары: проверьте, что статус товара совпадает с заданным в запросе. Для сложных условий используйте WP_Meta_Query.
- Удаление не учитывает вариации: вариации — отдельные посты типа
product_variation, их тоже нужно удалять отдельно. - Проблемы с правами доступа: функция должна запускаться с правами администратора, особенно при добавлении в плагин.
Практические советы по безопасности и производительности
- Перед удалением сделайте полное резервное копирование базы данных.
- Для больших магазинов удаляйте товары по частям, используя
posts_per_pageс пагинацией, чтобы избежать таймаутов. - Не запускайте удаление на публичной части сайта — используйте админский хук или WP-CLI.
- Для автоматизации через WP-CLI команда может выглядеть так:
wp post delete $(wp post list --post_type=product --post_status=draft,pending,private --field=ID) --forceСравнение способов удаления неактивных товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| PHP-функция в теме/плагине | Удаление через WP_Query и wp_delete_post() | Гибкий, можно доработать под задачи | Нужно запускать вручную, риск ошибок без бэкапа |
| WP-CLI | Удаление через командную строку | Быстро, безопасно, можно скриптовать | Требует доступа к серверу и знаний WP-CLI |
| Плагины очистки | Автоматизация с UI | Удобно для новичков | Может не учитывать все нюансы, лишний плагин |