Диагностика задачи: зачем нужно массовое изменение цен в WooCommerce
Владельцы магазинов часто сталкиваются с необходимостью обновить цены большого количества товаров — например, при изменении себестоимости, сезонных скидках или инфляции. Использовать плагины для этого удобно, но не всегда приемлемо из-за нагрузки, безопасности или ограничений хостинга. В таких случаях полезно иметь готовый рабочий код для массового обновления цен.
Как массово изменить цены товаров в WooCommerce через PHP
Подготовка: резервное копирование и тестовая среда
Перед выполнением любых массовых операций с базой данных обязательно сделайте резервную копию сайта и базы данных. Запускайте код сначала на локальной копии или тестовом сервере, чтобы избежать потерь данных.
Пример кода для массового увеличения цены на 10%
Ниже пример, который увеличит цену всех опубликованных товаров на 10%. Код можно добавить в functions.php вашей темы или использовать как отдельный скрипт с подключением WordPress.
function wpexamples_mass_update_prices() {
// Получаем все ID продуктов
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids'
);
$product_ids = get_posts($args);
foreach ($product_ids as $product_id) {
$product = wc_get_product($product_id);
if (!$product) continue;
$regular_price = $product->get_regular_price();
if ($regular_price === '') continue;
// Пример: увеличить цену на 10%
$new_price = round($regular_price * 1.10, 2);
// Обновляем цены
$product->set_regular_price($new_price);
// Если есть скидочная цена, можно обновить или удалить
if ($product->get_sale_price()) {
$product->set_sale_price(''); // Снимаем скидку
}
$product->save();
}
echo 'Цены успешно обновлены';
}
// Запускаем функцию один раз
wpexamples_mass_update_prices();Обработка вариативных продуктов
Если в магазине есть вариативные товары, их цены хранятся в вариациях. Для обновления цен вариаций нужно перебрать их отдельно:
function wpexamples_update_variable_product_prices() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids'
);
$product_ids = get_posts($args);
foreach ($product_ids as $product_id) {
$product = wc_get_product($product_id);
if (!$product) continue;
if ($product->is_type('variable')) {
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if (!$variation) continue;
$regular_price = $variation->get_regular_price();
if ($regular_price === '') continue;
$new_price = round($regular_price * 1.10, 2);
$variation->set_regular_price($new_price);
if ($variation->get_sale_price()) {
$variation->set_sale_price('');
}
$variation->save();
}
}
}
echo 'Цены вариаций успешно обновлены';
}
// Запуск функции
wpexamples_update_variable_product_prices();Пошаговое решение
- Создайте резервную копию сайта и базы данных.
- Откройте файл
functions.phpактивной темы или создайте отдельный PHP-скрипт с подключением WordPress. - Добавьте код функции для массового обновления цен (пример выше).
- Запустите функцию один раз, например, вызвав ее внизу файла.
- После выполнения удалите или закомментируйте вызов функции, чтобы избежать повторного запуска.
- Проверьте изменение цен в админке WooCommerce и на витрине.
Как проверить результат после внедрения
- Зайдите в админку WooCommerce → Товары и проверьте цены на нескольких товарах.
- Проверьте товарные страницы на фронтенде — отображаются ли новые цены.
- Проверьте вариации товаров, если есть.
- Для дополнительной проверки можно вывести цены программно:
$product = wc_get_product($product_id);
echo 'Текущая цена: ' . $product->get_price();Частые ошибки и как исправить
- Функция запускается многократно: если не удалить вызов функции, цены будут увеличиваться при каждом обновлении страницы. Решение — запускать функцию один раз и сразу отключать.
- Пропущены вариации: цены обновились только у простых товаров. Решение — добавить обработку вариаций (код выше).
- Отсутствие резервного копирования: потеря данных при ошибке. Обязательно делайте бэкап до изменений.
- Неправильный формат цен: цены могут не обновиться, если они пустые или нечисловые. Добавьте проверки
if ($regular_price !== ''). - Кэширование: после обновления цен кэшированные страницы могут показывать старые цены. Очистите кэш сайта и браузера.
Практические советы по безопасности и производительности
- Не выполняйте массовые операции в цикле на живом сайте без ограничения, чтобы не перегрузить сервер. Разбивайте обновления на партии (например, по 50 товаров за раз).
- Используйте WP-CLI для массовых операций, если есть доступ к командной строке — это надежнее и быстрее.
- После обновления цен убедитесь, что кэш страниц и WooCommerce очищен.
- Ограничьте доступ к коду и запуску подобных функций только администраторам.
- Для периодических обновлений рассмотрите написание WP-Cron задачи с контролем времени выполнения.
Сравнение подходов: плагин vs код vs WP-CLI
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин массового редактирования | Простота использования, UI для выбора товаров | Нагрузка на сайт, возможные конфликты, платные расширения |
| PHP код (как в статье) | Точный контроль, без лишних плагинов | Риски при ошибках, требует навыков разработчика |
| WP-CLI | Быстро и надежно, можно запускать из командной строки | Нужен доступ к серверу, требует консольных навыков |