В чем проблема: ручное создание вариаций в WooCommerce отнимает много времени
Для товаров с несколькими атрибутами (цвет, размер, материал и т.д.) стандартный функционал WooCommerce требует вручную создавать все вариации. При большом количестве комбинаций это неудобно и чревато ошибками, например, пропуском вариаций или неправильной ценой. Чтобы ускорить процесс и избежать ошибок, можно автоматизировать создание вариаций программно.
Диагностика задачи: как понять, что нужна автоматизация вариаций
- Товар имеет 2 и более атрибутов с несколькими значениями.
- Общее число вариаций превышает 10, что затрудняет их ручное создание.
- В WooCommerce нет вариаций, хотя атрибуты уже добавлены к товару.
- Вам регулярно нужно обновлять или добавлять новые вариации в большом количестве товаров.
Пошаговое решение: скрипт для массового создания вариаций по атрибутам
В данном примере предположим, что у вас есть переменный товар с ID $product_id. Атрибуты уже добавлены и назначены этому товару. Скрипт создаст все возможные комбинации вариаций.
1. Получение объекта товара и атрибутов
use Automattic\WooCommerce\Internal\ProductVariations\CRUD\ProductVariationCRUD; // при необходимости, зависит от версии WooCommerce
$product = wc_get_product($product_id);
if (!$product || 'variable' !== $product->get_type()) {
return; // товар не переменный
}
$attributes = $product->get_attributes();2. Формирование массива всех значений атрибутов
$attribute_values = [];
foreach ($attributes as $attribute_name => $attribute) {
if ($attribute->get_variation()) { // только вариативные атрибуты
$options = $attribute->get_options();
if (!empty($options)) {
$attribute_values[$attribute_name] = $options;
}
}
}3. Функция для генерации всех комбинаций атрибутов
function array_cartesian_product(array $arrays) {
$result = [[]];
foreach ($arrays as $property => $property_values) {
$tmp = [];
foreach ($result as $result_item) {
foreach ($property_values as $property_value) {
$tmp[] = array_merge($result_item, [$property => $property_value]);
}
}
$result = $tmp;
}
return $result;
}
$variations = array_cartesian_product($attribute_values);4. Создание вариаций в WooCommerce
foreach ($variations as $variation_attributes) {
$variation_post = [
'post_title' => $product->get_name(),
'post_name' => 'product-' . $product_id . '-variation',
'post_status' => 'publish',
'post_parent' => $product_id,
'post_type' => 'product_variation',
'guid' => $product->get_permalink(),
];
$variation_id = wp_insert_post($variation_post);
if (is_wp_error($variation_id)) {
continue; // ошибка создания вариации
}
$variation = wc_get_product($variation_id);
foreach ($variation_attributes as $attr_name => $attr_value) {
$taxonomy = 'pa_' . $attr_name;
wp_set_post_terms($variation_id, $attr_value, $taxonomy);
$variation->set_attributes([$attr_name => $attr_value]);
}
// Можно задать цену, артикул и другие параметры вариации
$variation->set_regular_price('1000'); // пример цены
$variation->save();
}Проверка результата: как убедиться, что вариации созданы корректно
- В админке WooCommerce откройте редактирование товара, вкладка «Вариации» — должны появиться все комбинации.
- На фронтенде товара можно выбрать все комбинации атрибутов без ошибки.
- Если вариации не появились, проверьте логи ошибок сервера и wp_debug.
Частые ошибки при автоматическом создании вариаций и их решение
- Вариации не отображаются: убедитесь, что атрибуты помечены как «Использовать для вариаций» и у товара тип «variable».
- Ошибка wp_insert_post или пустой ID вариации: проверьте права пользователя и лимит памяти PHP.
- Неверные значения атрибутов: значения должны совпадать с зарегистрированными терминами таксономии
pa_*. - Скрипт долго выполняется: при большом числе вариаций разбейте генерацию на несколько частей и используйте WP Cron или командную строку.
Практические советы по производительности и безопасности
- Перед запуском скрипта сделайте резервную копию базы данных.
- Ограничивайте число вариаций, чтобы избежать перегрузки базы и снижения скорости работы сайта.
- Для массовых изменений используйте WP CLI, это быстрее и стабильнее.
- Устанавливайте цены и другие параметры вариаций по умолчанию, чтобы не создавать пустые вариации.
- Используйте транзакции или откаты, если создаете много вариаций за один запрос (через плагины или MySQL, если нужно).
Сравнение автоматического создания вариаций: код vs плагины
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код (самописный скрипт) | Полный контроль, можно интегрировать в процессы, нет лишнего ПО | Требует навыков, риск ошибок, нужно поддерживать |
| Плагины (например, WooCommerce Bulk Variations) | Удобный интерфейс, поддержка, быстрое внедрение | Может быть платным, ограниченная кастомизация, нагрузка |