wpmoney.ru wordpress WP Money

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

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

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

Где и как хранится скидка в WooCommerce

Скидочная цена товара хранится в метаполе _sale_price поста товара. Если это поле пустое или отсутствует, значит скидка не задана. Для вариативных товаров скидка может быть задана для каждой вариации отдельно.

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

1. Создаем WP-CLI команду для массовой проверки и удаления

Используем WP-CLI, чтобы безопасно запускать удаление товаров из терминала. Такой подход удобен для больших магазинов и не влияет на время отклика сайта.

if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('wc-remove-empty-sale', function() {
        $args = [
            'post_type'      => ['product', 'product_variation'],
            'posts_per_page' => -1,
            'post_status'    => 'publish',
            'meta_query'     => [
                'relation' => 'OR',
                [
                    'key'     => '_sale_price',
                    'compare' => 'NOT EXISTS',
                ],
                [
                    'key'     => '_sale_price',
                    'value'   => '',
                    'compare' => '=',
                ]
            ]
        ];

        $query = new WP_Query($args);
        $deleted = 0;

        foreach ($query->posts as $post) {
            wp_delete_post($post->ID, true); // жесткое удаление
            $deleted++;
        }

        WP_CLI::success("Удалено товаров с пустой скидкой: $deleted");
    });
}

2. Запускаем команду в терминале

В консоли сервера в корне сайта запускаем:

wp wc-remove-empty-sale

Команда удалит все товары и вариации с пустым значением скидки.

3. Альтернатива: удаление через Cron (для автоматизации)

Если WP-CLI недоступен, можно настроить WP-Cron для периодической очистки:

function wc_remove_empty_sale_schedule() {
    if (!wp_next_scheduled('wc_remove_empty_sale_event')) {
        wp_schedule_event(time(), 'daily', 'wc_remove_empty_sale_event');
    }
}
add_action('wp', 'wc_remove_empty_sale_schedule');

add_action('wc_remove_empty_sale_event', function() {
    $args = [
        'post_type'      => ['product', 'product_variation'],
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'meta_query'     => [
            'relation' => 'OR',
            [
                'key'     => '_sale_price',
                'compare' => 'NOT EXISTS',
            ],
            [
                'key'     => '_sale_price',
                'value'   => '',
                'compare' => '=',
            ]
        ]
    ];

    $query = new WP_Query($args);

    foreach ($query->posts as $post) {
        wp_delete_post($post->ID, true);
    }
});

Как проверить, что решение работает

  • После запуска WP-CLI команды или срабатывания Cron проверьте список товаров в админке WooCommerce — товары с пустым _sale_price должны исчезнуть.
  • Можно вручную проверить базу данных в таблице wp_postmeta — записи с пустым или отсутствующим ключом _sale_price для удалённых товаров не должны присутствовать.
  • Для отладки WP-CLI выводит количество удалённых товаров.

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

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

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

  • Всегда делайте резервную копию базы перед массовым удалением товаров.
  • Используйте WP-CLI для безопасного и быстрого выполнения задач без перегрузки сайта.
  • Для сайтов с большим каталогом разбивайте удаление на части с помощью параметров posts_per_page и пагинации.
  • Добавьте логирование операций удаления в файл для аудита и восстановления в случае ошибок.
  • Если используете WP-Cron, убедитесь, что он запускается регулярно, иначе удаление не будет своевременным.

Сравнение подходов: WP-CLI vs WP-Cron

МетодПлюсыМинусыРекомендуется для
WP-CLI команда Быстро, надежно, не нагружает сайт, удобна для администраторов Требует доступа к серверу и командной строке Большие магазины, разовая массовая очистка
WP-Cron Автоматизация, не требует ручного запуска Зависит от посещаемости сайта, может запускаться с задержками Малые и средние магазины, регулярное удаление
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее