wpcat.ru wordpress WPCat.ru

Как автоматически удалить пустые товары WooCommerce без плагинов

Что такое пустые товары 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Может быть медленнее, требует запуска вручную
Плагины для очисткиПростота использованияДополнительная нагрузка, не всегда гибко
×

Пора действовать!

Скидки на
WordPress!

-20%
на премиум темы

Успей купить ⋙