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