Что такое пустые товары WooCommerce и зачем их удалять
Пустые товары — это товары без вариаций, атрибутов или с нулевым запасом и отсутствием описания, которые не несут смысла для пользователей и могут ухудшать SEO и производительность магазина. Часто такие товары появляются после импорта, массового обновления или ошибок в управлении каталогом.
Диагностика пустых товаров WooCommerce
Для начала нужно определить, какие товары считать пустыми. Типичные критерии:
- Отсутствие описания (
post_contentпустой). - Отсутствие изображений (нет миниатюры).
- Нулевой или отрицательный запас (
_stockили_stock_status). - Нет вариаций и атрибутов для вариативных товаров.
Для быстрого просмотра пустых товаров можно использовать SQL-запрос в phpMyAdmin:
SELECT ID, post_title FROM wp_posts WHERE post_type = 'product' AND (post_content = '' OR post_content IS NULL);Этот запрос покажет товары без описания. Аналогично можно проверять другие параметры через метаданные (wp_postmeta).
Пошаговое решение: автоматическое удаление пустых товаров через функции темы
Мы реализуем PHP-скрипт, который можно добавить в functions.php вашей темы или создать простой плагин. Скрипт будет искать пустые товары и удалять их программно.
Шаг 1. Определяем критерии пустоты
В нашем примере товар считается пустым, если:
- Описание пустое.
- Нет миниатюры (изображения).
- Запас равен нулю или товар в статусе "нет в наличии".
Шаг 2. Код для удаления пустых товаров
function wpcat_delete_empty_products() {
// Аргументы для выборки товаров
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
];
$products = get_posts($args);
$deleted_count = 0;
foreach ($products as $product_post) {
$product_id = $product_post->ID;
$content = trim($product_post->post_content);
$thumbnail_id = get_post_thumbnail_id($product_id);
$stock_status = get_post_meta($product_id, '_stock_status', true);
$stock_qty = (int)get_post_meta($product_id, '_stock', true);
if ($content === '' && !$thumbnail_id && ($stock_status === 'outofstock' || $stock_qty <= 0)) {
wp_delete_post($product_id, true); // true - безвозвратно
$deleted_count++;
}
}
return $deleted_count;
}
// Запуск функции по хуку admin_init для безопасности
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['wpcat_delete_empty'])) {
$deleted = wpcat_delete_empty_products();
wp_redirect(admin_url('edit.php?post_type=product&deleted_empty='.$deleted));
exit;
}
});Этот код добавляет в админке запуск удаления по URL ?wpcat_delete_empty=1. По окончании вы увидите количество удаленных товаров.
Проверка результата
После запуска:
- Перейдите в Товары > Все товары и проверьте, что пустые записи исчезли.
- В URL после удаления появится параметр
deleted_empty=число— количество удаленных товаров. - Можно повторить SQL-запрос из раздела диагностики, чтобы убедиться в отсутствии пустых товаров.
Частые ошибки и как их исправить
- Не удаляются товары: Проверьте, что вы запускаете код под пользователем с правами
manage_woocommerceи передаете параметрwpcat_delete_empty=1в URL. - Удаляются нужные товары: Проверьте логику условий, возможно, слишком жесткие критерии (например, товары без описания, но с изображениями — стоит оставить).
- Проблемы с большим количеством товаров: Если товаров очень много, выполнение функции может превысить лимит времени. В этом случае разбейте удаление на части, используя WP Cron или пагинацию.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед массовым удалением.
- Для больших сайтов запускайте удаление в CLI через WP-CLI, чтобы избежать таймаутов.
- Добавьте ведение логов удаленных ID, чтобы можно было восстановить ошибки.
- Используйте транзакции, если база поддерживает, для предотвращения частичных удалений.
Сравнение способов удаления пустых товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| SQL-запросы напрямую | Быстро и эффективно | Риск повреждения данных, требует знаний SQL |
| PHP-скрипт в functions.php | Безопасно, учитывает логику WP | Может быть медленнее, требует запуска вручную |
| Плагины для очистки | Простота использования | Дополнительная нагрузка, не всегда гибко |