wplinks.ru wordpress WPLinks.ru

Автоматическое отключение товаров в WooCommerce после окончания срока акции

Диагностика проблемы: товары остаются активными после окончания акции

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

Основная проблема — отсутствие автоматического отключения или изменения статуса товара после даты окончания акции. Многие владельцы сайтов сталкиваются с необходимостью вручную проверять и изменять статус акционных товаров, что трудоемко и ошибочно.

Пошаговое решение: автоматическое отключение товаров по дате окончания акции

1. Добавление метаполя для даты окончания акции

Чтобы система понимала, когда заканчивается акция, нужно добавить к товарам поле с датой окончания. Это можно сделать через ACF или нативно, например, с помощью пользовательского поля.

function add_sale_end_date_field() {
    woocommerce_wp_text_input( array(
        'id'          => '_sale_end_date',
        'label'       => __('Дата окончания акции', 'woocommerce'),
        'placeholder' => 'ГГГГ-ММ-ДД',
        'description' => __('Введите дату окончания акции в формате ГГГГ-ММ-ДД', 'woocommerce'),
        'type'        => 'date',
    ) );
}
add_action('woocommerce_product_options_pricing', 'add_sale_end_date_field');

// Сохраняем поле
function save_sale_end_date_field($post_id) {
    $sale_end_date = isset($_POST['_sale_end_date']) ? sanitize_text_field($_POST['_sale_end_date']) : '';
    update_post_meta($post_id, '_sale_end_date', $sale_end_date);
}
add_action('woocommerce_process_product_meta', 'save_sale_end_date_field');

2. Создание функции для проверки и отключения товаров

Далее создаём функцию, которая будет проверять дату окончания акции у всех товаров и отключать товары, у которых акция закончилась:

function disable_expired_sale_products() {
    $today = date('Y-m-d');
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_sale_end_date',
                'value'   => $today,
                'compare' => '<',
                'type'    => 'DATE'
            ),
        ),
        'post_status'    => 'publish',
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $product_id = get_the_ID();

            // Снимаем акцию
            update_post_meta($product_id, '_sale_price', '');
            update_post_meta($product_id, '_sale_end_date', '');

            // Отключаем товар
            wp_update_post(array(
                'ID'          => $product_id,
                'post_status' => 'draft'
            ));
        }
        wp_reset_postdata();
    }
}
// Запускаем проверку раз в сутки
if (!wp_next_scheduled('disable_expired_sale_products_daily')) {
    wp_schedule_event(strtotime('00:00:00'), 'daily', 'disable_expired_sale_products_daily');
}
add_action('disable_expired_sale_products_daily', 'disable_expired_sale_products');

3. Очистка планировщика и отладка

Для удаления задачи из cron, если потребуется, используйте:

wp_clear_scheduled_hook('disable_expired_sale_products_daily');

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

  • Создайте товар с датой окончания акции, которая уже прошла.
  • Запустите вручную функцию disable_expired_sale_products() через WP-CLI или через временный вызов в functions.php.
  • Проверьте, что товар переведён в статус draft и цена акции снята.
  • Убедитесь, что акционные цены на сайте больше не отображаются для таких товаров.

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

  • Не создаётся крон задача — проверьте, что сайт посещается хотя бы раз в сутки, иначе wp-cron не запустится. Для гарантии можно настроить системный cron на вызов wp-cron.php.
  • Дата в неправильном формате — убедитесь, что дата сохраняется в формате ГГГГ-ММ-ДД, иначе сравнение не сработает.
  • Товары не отключаются — проверьте, что статус меняется через wp_update_post, и пользователь, под которым работает скрипт, имеет права на редактирование товаров.

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

  • При большом количестве товаров используйте пагинацию в WP_Query, чтобы избежать превышения лимита памяти.
  • Минимизируйте количество вызовов cron, проверяя дату окончания только для товаров с установленным полем _sale_end_date.
  • Обязательно делайте резервные копии перед внедрением автоматических массовых изменений.
  • Для безопасности проверяйте nonce и права пользователя при сохранении полей и изменении данных.

Сравнение подходов к автоматическому отключению товаров

МетодПлюсыМинусыУровень сложности
Ручное отключениеПолный контрольТрудозатратно, риск ошибокНизкий
Плагин для управления акциямиУдобный интерфейс, автоматизацияЗависимость от стороннего кода, возможные конфликтыСредний
Кастомный код с WP-CronТочная настройка, без лишних плагиновТребует навыков разработки, возможны ошибки при неправильной реализацииВысокий
×

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

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

пишет статьи

готовит SEO

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

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