Ссылка скопирована

Простые товары в WooCommerce — WC_Product_Simple

DonVardixDonVardix—

Введение

Класс WC_Product_Simple — базовый класс ядра WooCommerce для представления простых товаров (как физических, так и цифровых или виртуальных). Он инкапсулирует CRUD-операции над товаром, управление ценами, складскими остатками, таксономиями и метаданными через унифицированный интерфейс Data Store.

Версия WooCommerce

Материал и примеры проверены на актуальной версии WooCommerce 11.1.1 и совместимы со всеми версиями, начиная с WooCommerce 3.0.

Какие задачи решает:

  • Программное создание и регистрация новых товаров в каталоге;
  • Безопасное изменение цен, скидок, остатков и статусов без прямых SQL-запросов;
  • Интеграция со сторонними CRM, ERP-системами (1C, МойСклад) и парсерами;
  • Чтение и валидация любых характеристик товара через типизированные геттеры.

Создание и получение

В WooCommerce работа с объектом товара строится на концепции CRUD (Create, Read, Update, Delete).

Создание нового товара

Для создания нового простого товара экземпляр класса инициализируется без аргументов. Свойства задаются через цепочку сеттеров, а физическая запись в базу данных происходит только при вызове $product->save():

$product = new WC_Product_Simple();

$product->set_name( 'Хлопковая футболка Basic' );
$product->set_regular_price( '1890' );
$product->set_status( 'publish' );

// Сохраняет товар в базу данных и возвращает его ID
$product_id = $product->save();

Получение существующего товара

Для работы с уже созданным товаром рекомендуется использовать глобальную фабрику wc_get_product() (а для пакетной выборки по фильтрам — wc_get_products()). Она автоматически определяет тип товара, обращается к кэшу объектов и возвращает нужный подкласс:

$product = wc_get_product( $product_id );

// Проверка типа перед выполнением операций
if ( $product instanceof WC_Product_Simple ) {
    $price = $product->get_price();
    $sku   = $product->get_sku();
}

Также доступна прямая инициализация через конструктор класса:

$product = new WC_Product_Simple( $product_id );

Свойства и методы

Все свойства объекта WC_Product_Simple защищены и управляются через соответствующие сеттеры (set_*) и геттеры (get_*).

Название, статус и описание

  • set_name( string $name ) / get_name() — название товара.
  • set_slug( string $slug ) / get_slug() — URL-ярлык записи.
  • set_status( string $status ) / get_status() — статус записи (publish, draft, pending, private).
  • set_catalog_visibility( string $visibility ) / get_catalog_visibility() — видимость в каталоге (visible, catalog, search, hidden).
  • set_description( string $description ) / get_description() — основное описание (контент).
  • set_short_description( string $short_description ) / get_short_description() — краткое описание товара (отрывок).
  • set_sku( string $sku ) / get_sku() — артикул товара.

Цены и акции

  • set_regular_price( string $price ) / get_regular_price() — базовая цена товара.
  • set_sale_price( string $price ) / get_sale_price() — акционная цена (со скидкой).
  • set_date_on_sale_from( string|int|null $date ) — дата начала распродажи (формат YYYY-MM-DD или timestamp).
  • set_date_on_sale_to( string|int|null $date ) — дата окончания распродажи.
  • get_price() — текущая актуальная цена с учетом действующих скидок и дат акций.
  • is_on_sale() — возвращает true, если на товар в данный момент действует скидка.

Складской учет и остатки

  • set_manage_stock( bool $manage_stock ) / get_manage_stock() — включить управление запасами на уровне товара.
  • set_stock_quantity( float|int|null $quantity ) / get_stock_quantity() — количество единиц товара на складе.
  • set_stock_status( string $status ) / get_stock_status() — статус наличия (instock, outofstock, onbackorder).
  • set_backorders( string $backorders ) / get_backorders() — разрешение предзаказа (no, notify, yes).
  • set_sold_individually( bool $sold_individually ) — ограничение покупки не более 1 штуки в одном заказе.

Категории, метки и изображения

  • set_category_ids( int[] $term_ids ) / get_category_ids() — массив ID категорий product_cat.
  • set_tag_ids( int[] $term_ids ) / get_tag_ids() — массив ID меток product_tag.
  • set_image_id( int $attachment_id ) / get_image_id() — ID главного изображения товара в медиабиблиотеке.
  • set_gallery_image_ids( int[] $attachment_ids ) / get_gallery_image_ids() — массив ID дополнительных изображений галереи.

Метаполя и кастомные данные

  • update_meta_data( string $key, mixed $value ) — добавление или обновление произвольного метаполя.
  • get_meta( string $key, bool $single = true ) — получение значения метаполя.
  • delete_meta_data( string $key ) — удаление метаполя из объекта.

Часто используемые примеры

Создание товара со всеми свойствами

Готовый сценарий создания физического простого товара с ценой, остатками, категориями и фото:

$product = new WC_Product_Simple();

// Базовые данные
$product->set_name( 'Зимняя худи с начесом' );
$product->set_slug( 'winter-hoodie-black' );
$product->set_status( 'publish' );
$product->set_sku( 'HD-BLK-01' );
$product->set_catalog_visibility( 'visible' );

// Описания
$product->set_description( '<p>Теплая худи из 100% органического хлопка с начесом.</p>' );
$product->set_short_description( '<p>Плотность 350 г/м², свободный оверсайз крой.</p>' );

// Цены
$product->set_regular_price( '4990' );
$product->set_sale_price( '3990' );
$product->set_date_on_sale_from( '2026-10-01' );
$product->set_date_on_sale_to( '2026-10-31' );

// Складской учет
$product->set_manage_stock( true );
$product->set_stock_quantity( 15 );
$product->set_stock_status( 'instock' );

// Вес и габариты для расчета доставки
$product->set_weight( '0.85' ); // кг
$product->set_length( '35' );   // см
$product->set_width( '25' );
$product->set_height( '8' );

// Таксономии и медиа
$product->set_category_ids( [ 14, 22 ] );
$product->set_tag_ids( [ 5 ] );
$product->set_image_id( 1205 );
$product->set_gallery_image_ids( [ 1206, 1207 ] );

// Произвольное метаполе
$product->update_meta_data( '_custom_supplier_code', 'SUPP-9842' );

// Сохранение в базу
$product_id = $product->save();

Обновление цен и акций

Быстрое изменение стоимости без перезаписи остальных параметров:

$product = wc_get_product( 105 );

if ( $product && $product->is_type( 'simple' ) ) {
    $product->set_regular_price( '5490' );
    
    // Включение скидки на 7 дней
    $product->set_sale_price( '4290' );
    $product->set_date_on_sale_from( current_time( 'Y-m-d' ) );
    $product->set_date_on_sale_to( date( 'Y-m-d', strtotime( '+7 days' ) ) );

    $product->save();
}

Синхронизация остатков склада

Паттерн для интеграции с ERP-системами или складскими шлюзами:

function sync_simple_product_stock( int $product_id, int $new_quantity ) {
    $product = wc_get_product( $product_id );

    if ( ! $product || ! $product->is_type( 'simple' ) ) {
        return false;
    }

    $product->set_manage_stock( true );
    $product->set_stock_quantity( $new_quantity );
    $product->set_stock_status( $new_quantity > 0 ? 'instock' : 'outofstock' );

    return $product->save();
}

Удаление и перемещение в корзину

WooCommerce поддерживает мягкое перемещение в корзину (Trash) и полное физическое удаление из базы данных:

$product = wc_get_product( 105 );

if ( $product ) {
    // Мягкое удаление (перемещение в корзину WordPress)
    $product->delete( false );

    // Полное удаление без возможности восстановления (force delete)
    // $product->delete( true );
}

Советы и практики

  1. Один вызов $product->save() в конце цепочки: каждый вызов save() выполняет SQL-запросы к таблицам постов, метаполей и таблицы быстрого поиска wc_product_meta_lookup, а также запускает тяжелые экшены woocommerce_update_product. Все сеттеры настраивайте пакетно и сохраняйте объект ровно один раз.
  2. Всегда проверяйте тип товара: перед работой со специфичными для простого товара свойствами выполняйте проверку $product instanceof WC_Product_Simple или $product->is_type( 'simple' ). Для вариативного товара (WC_Product_Variable) прямая установка set_regular_price() не работает, так как его цены формируются вариациями.
  3. Форматируйте цены как строки: передавайте значения цен в виде строк (например, '1890.50'), а не float. Это предотвращает ошибки округления чисел с плавающей точкой в PHP и точно обрабатывается валидатором WooCommerce (wc_format_decimal).
  4. Автоматическая синхронизация wc_product_meta_lookup: при вызове $product->save() WooCommerce автоматически наполняет вспомогательную таблицу wc_product_meta_lookup и очищает кэш транзиентов через wc_delete_product_transients(). Прямые вызовы update_post_meta() эту таблицу не обновляют, из-за чего каталог начинает отображать некорректные цены и остатки.
  5. Программное добавление в корзину покупателя: для эмуляции нажатия кнопки покупки используйте метод $product->add_to_cart_url() для генерации ссылки или нативный метод корзины:
    WC()->cart->add_to_cart( $product_id, 1 );