wpwebsite.ru wordpress WPWebSite

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

Диагностика задачи: зачем нужно автоматическое удаление товаров в WooCommerce

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

Как определить товары с истекшими сроками действия

Первый шаг — задать условие, по которому товар считается устаревшим. Чаще всего для этого используют:

  • Кастомное поле с датой окончания действия товара;
  • Дата окончания акции или скидки;
  • Дата публикации товара с заданным сроком актуальности.

Для примера рассмотрим, что у товара есть кастомное поле expiration_date с датой в формате YYYY-MM-DD. Именно по нему и будем фильтровать товары.

Пошаговое решение: удаление товаров с истекшей датой

1. Добавление кастомного поля expiration_date (если еще не добавлено)

Можно добавить поле через админку или программно, например, с помощью metabox:

add_action('add_meta_boxes', function() {
    add_meta_box('expiration_date_box', 'Срок действия товара', function($post) {
        $value = get_post_meta($post->ID, 'expiration_date', true);
        echo '<label for="expiration_date">Дата окончания (ГГГГ-ММ-ДД):</label>';
        echo '<input type="date" id="expiration_date" name="expiration_date" value="' . esc_attr($value) . '" />';
    }, 'product', 'side', 'default');
});

add_action('save_post_product', function($post_id) {
    if (isset($_POST['expiration_date'])) {
        update_post_meta($post_id, 'expiration_date', sanitize_text_field($_POST['expiration_date']));
    }
});

2. Скрипт для удаления устаревших товаров

Создаем функцию, которая будет находить все товары с датой expiration_date меньше сегодняшней и удалять их.

function delete_expired_products() {
    $today = date('Y-m-d');
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => 'expiration_date',
                'value' => $today,
                'compare' => '<',
                'type' => 'DATE',
            ]
        ],
        'fields' => 'ids',
    ];
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // true - удаление без перемещения в корзину
        }
    }
}

3. Автоматизация через WP-Cron

Чтобы удаление происходило автоматически, зарегистрируем задачу в планировщике WP-Cron:

if (!wp_next_scheduled('delete_expired_products_daily')) {
    wp_schedule_event(time(), 'daily', 'delete_expired_products_daily');
}

add_action('delete_expired_products_daily', 'delete_expired_products');

Проверка результата после внедрения

1. Создайте тестовый товар с полем expiration_date, выставленным на дату, которая уже прошла.

2. Запустите функцию вручную из админки (или через WP CLI):

delete_expired_products();

3. Проверьте, что товар удалился из каталога.

4. Убедитесь, что cron-задача срабатывает (можно установить плагин WP Crontrol для просмотра и управления задачами WP-Cron).

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

  • Неправильный формат даты в meta поле. Убедитесь, что дата хранится в формате YYYY-MM-DD. Иначе сравнение в meta_query не сработает.
  • Отсутствие cron-задачи. WP-Cron работает при посещении сайта, если сайт малопосещаемый, cron может не запускаться. Для надежности настройте системный cron или запускайте вручную.
  • Товары не удаляются, а только в корзину. В wp_delete_post второй параметр true удаляет сразу. Проверьте, что стоит именно true.
  • Удаление происходит слишком часто. Используйте расписание daily или другое подходящее, чтобы не нагружать базу.

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

  • Перед удалением товаров делайте резервное копирование базы.
  • Если каталог очень большой, разбивайте удаление на порции, чтобы не перегружать сервер.
  • Для массовых операций используйте WP-CLI: wp post delete $(wp post list --post_type=product --meta_key=expiration_date --meta_value_date='2024-01-01' --meta_compare='<') --force
  • Вместо удаления можно сначала переводить товары в статус draft для дополнительной проверки.

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

МетодПреимуществаНедостатки
WP-Cron с PHP функциейЛегко настроить, не требует внешних сервисовЗависит от посещаемости сайта, возможны задержки
Системный cron + WP-CLIНадежно и быстро, подходит для больших сайтовТребует доступа к серверу и навыков администрирования
Плагины для управления истекшими товарамиГотовое решение с удобным интерфейсомМогут нагружать сайт, не всегда бесплатно
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше