Диагностика проблемы: товары остаются активными после окончания акции
В интернет-магазинах на 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 | Точная настройка, без лишних плагинов | Требует навыков разработки, возможны ошибки при неправильной реализации | Высокий |