Диагностика проблемы: зачем нужно автоматическое обновление остатков и цен
В интернет-магазинах на WooCommerce часто возникает необходимость регулярно обновлять запасы товаров и корректировать цены, например, в зависимости от поставок, сезонных акций или изменения себестоимости. Ручное обновление через админку или импорт CSV неудобен и подвержен ошибкам.
Типичные симптомы, что автоматизация необходима:
- Цены и остатки устаревают к середине дня
- Постоянные ошибки при импорте CSV вручную
- Отсутствие гибкости для изменения цен по сложным условиям
В этом материале разберём, как настроить автоматическое обновление остатков и изменение цен с помощью стандартных средств WordPress и WooCommerce.
Как автоматизировать обновление остатков WooCommerce через WP-Cron
Настройка WP-Cron задачи для обновления остатков
WooCommerce хранит остатки товаров в мета-данных _stock. Чтобы обновлять их автоматически по расписанию, создадим кастомную WP-Cron задачу.
function custom_update_stock() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
);
$products = get_posts($args);
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
// Пример логики: устанавливаем остаток согласно внешним данным
$new_stock = fetch_stock_from_external_api($product->get_sku());
if ($new_stock !== false) {
$product->set_stock_quantity($new_stock);
$product->save();
}
}
}
function schedule_custom_stock_update() {
if (!wp_next_scheduled('custom_stock_update_hook')) {
wp_schedule_event(time(), 'hourly', 'custom_stock_update_hook');
}
}
add_action('wp', 'schedule_custom_stock_update');
add_action('custom_stock_update_hook', 'custom_update_stock');В этом примере функция fetch_stock_from_external_api() — заглушка, которую нужно реализовать для получения актуальных остатков из вашего источника (API поставщика, CRM и т.д.).
Автоматическое изменение цен товаров с условиями
Изменение цен через WP-Cron и хуки WooCommerce
Для динамического изменения цен можно использовать схожий подход. Например, повышать или снижать цены по расписанию.
function custom_update_prices() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
);
$products = get_posts($args);
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
$regular_price = (float) $product->get_regular_price();
// Пример: повышение цены на 5%
$new_price = $regular_price * 1.05;
$product->set_regular_price($new_price);
$product->save();
}
}
function schedule_custom_price_update() {
if (!wp_next_scheduled('custom_price_update_hook')) {
wp_schedule_event(time(), 'daily', 'custom_price_update_hook');
}
}
add_action('wp', 'schedule_custom_price_update');
add_action('custom_price_update_hook', 'custom_update_prices');Этот код увеличивает цены всех товаров на 5% ежедневно. Логика изменения цены может быть любой — например, в зависимости от категории, наличия скидок, региональных условий.
Проверка результата после внедрения
- Проверьте, что задачи WP-Cron запланированы:
wp cron event listчерез WP-CLI или плагин WP Crontrol - Вручную вызовите задачи для теста:
do_action('custom_stock_update_hook');иdo_action('custom_price_update_hook');через functions.php или WP-CLI - Убедитесь, что в админке WooCommerce изменились запасы и цены
- Проверьте логи ошибок PHP, если изменения не применились
Частые ошибки и как исправить
- WP-Cron не запускается автоматически: на хостинге нет реального cron или низкий трафик сайта — настройте системный cron на вызов
wp-cron.php - Неверный формат цены или запаса: используйте числовые типы и функции WooCommerce для установки значений (
set_regular_price,set_stock_quantity) - Функция получения данных из API возвращает false: проверьте правильность URL, авторизации, формат ответа
- Изменения не видны в кэше: очистите кеш сайта и браузера
Практические советы по безопасности и производительности
- Не обновляйте все товары в одной задаче, если товаров >1000, разбивайте на порции с
WP_Queryи параметрамиoffset - Добавляйте логирование ошибок и успешных операций через
error_logили сторонние сервисы - Ограничьте права доступа к функциям, если вызываете их через REST API или AJAX
- Для высоконагруженных магазинов рассмотрите внешние CRON-задачи, вызывающие кастомные эндпоинты для обновления
Сравнение методов обновления остатков и цен
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + PHP код | Гибкость, настройка внутри WordPress | Зависит от трафика, требует программирования | Код из статьи |
| Импорт CSV через WooCommerce | Простота для небольших магазинов | Ручной процесс, риск ошибок | Админка WooCommerce - Импорт товаров |
| Внешний Cron + REST API | Надежность, можно запускать по расписанию | Требует разработки REST API и внешнего сервера | Кастомные REST эндпоинты |