wpmoney.ru wordpress WP Money

Автоматическое удаление товаров WooCommerce без скидки через код

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

В крупных интернет-магазинах на WooCommerce часто появляются товары без актуальных скидок, которые устарели или не продаются. Ручное удаление таких товаров занимает много времени и может приводить к ошибкам. Автоматизация процесса удаления товаров без скидки помогает поддерживать каталог в актуальном состоянии, экономить место в базе и повышать удобство управления.

Пошаговое решение: как автоматически удалить товары без скидки

1. Создаем функцию для выборки товаров без скидки

Для начала нужно получить все товары, у которых нет активных скидок (sale price). WooCommerce хранит цену скидки в метаполе _sale_price. Если это поле пустое, скидки нет.

function get_products_without_sale_price() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_sale_price',
                'value'   => '',
                'compare' => '=',
            ],
        ],
        'fields' => 'ids',
    ];
    $query = new WP_Query($args);
    return $query->posts;
}

2. Функция удаления товаров по ID

Теперь нужно пройтись по списку ID товаров и удалить их программно.

function delete_products_by_ids($product_ids) {
    foreach ($product_ids as $product_id) {
        wp_delete_post($product_id, true); // true - удаление без возможности восстановления
    }
}

3. Объединяем в задачу для автоматического запуска

Для удобства можно создать функцию, которую запускать вручную или через WP-Cron.

function auto_delete_products_without_sale() {
    $products = get_products_without_sale_price();
    if (!empty($products)) {
        delete_products_by_ids($products);
    }
}

4. Настройка WP-Cron для регулярного запуска

Добавим задачу, которая будет запускать удаление товаров раз в неделю.

add_action('auto_delete_products_event', 'auto_delete_products_without_sale');

if (!wp_next_scheduled('auto_delete_products_event')) {
    wp_schedule_event(time(), 'weekly', 'auto_delete_products_event');
}

Как проверить, что удаление работает

1. Перед запуском функции auto_delete_products_without_sale() сделайте экспорт товаров или создайте бэкап базы.

2. Запустите функцию вручную через auto_delete_products_without_sale(); в файл functions.php или через WP-CLI.

3. Проверьте, что товары без скидок исчезли из админки и фронтенда.

4. Для мониторинга можно вывести количество удаленных товаров:

function auto_delete_products_without_sale() {
    $products = get_products_without_sale_price();
    if (!empty($products)) {
        $count = count($products);
        delete_products_by_ids($products);
        error_log("Удалено товаров без скидки: $count");
    }
}

Частые ошибки и как их исправить

  • Пустой или неправильный meta_query: если товары не удаляются, убедитесь, что ключ метаполя _sale_price написан правильно и что у товаров действительно отсутствует скидка.
  • Запуск крона не происходит: проверьте, активен ли WP-Cron, или настройте системный cron для запуска wp-cron.php.
  • Удаление не происходит из-за прав доступа: функция wp_delete_post требует прав администратора, убедитесь, что выполняется код с нужными правами.
  • Удаляются товары с активной скидкой: возможно, у товаров есть скидка, но она не отражена в _sale_price, например, применена через динамические правила. В этом случае нужно расширить логику.

Практические советы по безопасности и производительности

  • Перед массовым удалением создайте резервную копию базы данных.
  • Для больших магазинов используйте пакетную обработку, чтобы избежать таймаутов. Например, обрабатывать по 50 товаров за раз.
  • Добавьте логирование действий для отслеживания удалений.
  • Проверяйте наличие скидок не только в _sale_price, но и в динамических правилах (если используются), чтобы не удалить нужные товары.

Сравнение вариантов автоматизации удаления товаров без скидки

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, точечное удалениеМного времени, риск пропустить
Плагины для управления товарамиУдобный интерфейс, дополнительные фильтрыНагрузка на сайт, возможная плата
Код с WP-Cron (как в статье)Автоматизация, контроль, отсутствие дополнительных плагиновНужны базовые знания PHP, возможно доработка под кейс
×
Делай сайт лучше!!

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

Использовать скидку ⋙