WC_Product{}└─ WC_Abstract_Legacy_Product
Работает с данными отдельного товара WooCommerce: названием, ценами, остатками, изображениями, атрибутами и другими свойствами. Позволяет создавать, получать, изменять и удалять товары.
Это базовый класс товаров. Конкретные типы представлены его наследниками:
| Класс | Тип товара |
|---|---|
| WC_Product_Simple{} | Простой товар. |
| WC_Product_Variable{} | Вариативный товар. |
| WC_Product_Variation{} | Отдельная вариация. |
| WC_Product_Grouped{} | Сгруппированный товар. |
| WC_Product_External{} | Внешний/партнёрский товар. |
Несмотря на слово Abstract в описании исходного кода, класс не объявлен абстрактным. Создать new WC_Product() технически можно, но для нового товара следует выбирать класс соответствующего типа.
Данные читаются методами get_*(), изменяются методами set_*() и записываются в БД методом save(). Работу с хранилищем класс выполняет через Data Store. Поэтому код не должен самостоятельно обновлять служебные метаполя вроде _price или _stock.
Основные методы:
| Метод | Назначение |
|---|---|
| get_id() | ID товара. У нового несохранённого объекта — 0. |
| get_type() | Тип товара: simple, variable, variation и другие. |
| get_name() | Название. |
| get_sku() | Артикул. |
| get_description() | Полное описание. |
| get_short_description() | Краткое описание. |
| get_permalink() | Ссылка на товар. |
| get_price() | Текущая цена без HTML и обозначения валюты. |
| get_regular_price() | Обычная цена. |
| get_sale_price() | Акционная цена. |
| get_price_html() | HTML цены с форматированием, валютой и учётом настроек отображения налогов. |
| get_image() | HTML основного изображения. |
| get_image_id() | ID основного изображения. |
| get_gallery_image_ids() | ID изображений галереи. |
| get_category_ids() | ID категорий. |
| get_tag_ids() | ID меток. |
| get_stock_quantity() | Остаток. |
| get_stock_status() | Статус наличия. |
| get_attributes() | Все атрибуты. |
| get_attribute() | Значение одного атрибута. |
| get_meta() | Чтение пользовательского метаполя. |
| update_meta_data() | Изменение пользовательского метаполя. |
| get_data() | Массив данных объекта. |
| get_changes() | Изменённые свойства, ожидающие сохранения. |
| set_props() | Установка нескольких свойств через массив. |
| save() | Создание или обновление товара. Результат — ID товара. |
| delete() | Удаление. При true — окончательное. |
Для проверок доступны:
| Метод | Назначение |
|---|---|
| is_type() | Checks the product type. |
| is_on_sale() | Returns whether or not the product is on sale. |
| is_in_stock() | Returns whether or not the product can be purchased. This returns true for 'instock' and 'onbackorder' stock statuses. |
| is_purchasable() | Returns false if the product cannot be bought. |
| is_visible() | Returns whether or not the product is visible in the catalog. |
| is_virtual() | Checks if a product is virtual (has no shipping). |
| is_downloadable() | Checks if a product is downloadable. |
is_purchasable() не заменяет проверку остатков. А is_in_stock() допускает статус onbackorder, поэтому его результат не обязательно означает положительное количество на складе.
Многие методы получения свойств принимают $context:
view- значение с применением фильтров WooCommerce. Используется по умолчанию.edit- значение без фильтров получения свойства. Подходит для редактирования и последующего сохранения.
Контекст edit учитывает уже внесённые изменения объекта. Он не перечитывает значение из БД.
Используйте wc_get_product(), когда нужно получить существующий товар. Функция определяет его тип и создаёт объект подходящего класса.
Используйте wc_get_products(), когда нужно получить список товаров по условиям.
Методы set_*() меняют данные только в объекте. Чтобы записать изменения в БД, вызовите save().
Некоторые методы установки свойств выбрасывают исключение WC_Data_Exception при некорректных данных. Метод set_props() собирает такие ошибки в WP_Error. При этом успешно обработанные свойства остаются изменёнными: автоматического отката нет.
Хуки из класса
Возвращает
null.
- WC_Product - объект при создании через
new WC_Product(). Сам конструктор отдельного значения не возвращает.
Создание объекта без ID не добавляет товар в БД. Запись создаётся при вызове save().
Использование
$wc_product = new WC_Product( $product ); // use class methods
- $product(число|WC_Product|объект)
Товар для инициализации объекта. Параметр конструктора.
- Положительный ID - загрузить данные товара из БД.
- Объект
WC_Product- взять его ID и загрузить данные из БД. Несохранённые изменения переданного объекта не копируются. - Объект с полем
ID, например WP_Post - загрузить товар по этому ID. 0- создать объект нового товара.
Прямой вызов конструктора не выбирает класс по типу существующего товара.
При положительном ID отсутствующего товара или записи неподходящего типа стандартное хранилище выбрасывает
Exception. Функцияwc_get_product()перехватывает исключение и в таком случае возвращаетfalse.По умолчанию:
0
Методы
- public __construct( $product = 0 )
- public get_type()
- public get_name( $context = 'view' )
- public get_slug( $context = 'view' )
- public get_date_created( $context = 'view' )
- public get_date_modified( $context = 'view' )
- public get_status( $context = 'view' )
- public get_featured( $context = 'view' )
- public get_catalog_visibility( $context = 'view' )
- public get_description( $context = 'view' )
- public get_short_description( $context = 'view' )
- public get_sku( $context = 'view' )
- public get_global_unique_id( $context = 'view' )
- public get_price( $context = 'view' )
- public get_regular_price( $context = 'view' )
- public get_sale_price( $context = 'view' )
- public get_date_on_sale_from( $context = 'view' )
- public get_date_on_sale_to( $context = 'view' )
- public get_total_sales( $context = 'view' )
- public get_tax_status( $context = 'view' )
- public get_tax_class( $context = 'view' )
- public get_manage_stock( $context = 'view' )
- public get_stock_quantity( $context = 'view' )
- public get_stock_status( $context = 'view' )
- public get_backorders( $context = 'view' )
- public get_low_stock_amount( $context = 'view' )
- public get_sold_individually( $context = 'view' )
- public get_weight( $context = 'view' )
- public get_length( $context = 'view' )
- public get_width( $context = 'view' )
- public get_height( $context = 'view' )
- public get_dimensions( $formatted = true )
- public get_upsell_ids( $context = 'view' )
- public get_cross_sell_ids( $context = 'view' )
- public get_parent_id( $context = 'view' )
- public get_reviews_allowed( $context = 'view' )
- public get_purchase_note( $context = 'view' )
- public get_attributes( $context = 'view' )
- public get_default_attributes( $context = 'view' )
- public get_menu_order( $context = 'view' )
- public get_post_password( $context = 'view' )
- public get_category_ids( $context = 'view' )
- public get_tag_ids( $context = 'view' )
- public get_brand_ids( $context = 'view' )
- public get_virtual( $context = 'view' )
- public get_gallery_image_ids( $context = 'view' )
- public get_shipping_class_id( $context = 'view' )
- public get_downloads( $context = 'view' )
- public get_download_expiry( $context = 'view' )
- public get_downloadable( $context = 'view' )
- public get_download_limit( $context = 'view' )
- public get_image_id( $context = 'view' )
- public get_rating_counts( $context = 'view' )
- public get_average_rating( $context = 'view' )
- public get_review_count( $context = 'view' )
- public set_name( $name )
- public set_slug( $slug )
- public set_date_created( $date = null )
- public set_date_modified( $date = null )
- public set_status( $status )
- public set_featured( $featured )
- public set_catalog_visibility( $visibility )
- public set_description( $description )
- public set_short_description( $short_description )
- public set_sku( $sku )
- public set_global_unique_id( $global_unique_id )
- public set_price( $price )
- public set_regular_price( $price )
- public set_sale_price( $price )
- public set_date_on_sale_from( $date = null )
- public set_date_on_sale_to( $date = null )
- public set_total_sales( $total )
- public set_tax_status( $status )
- public set_tax_class( $class )
- public set_manage_stock( $manage_stock )
- public set_stock_quantity( $quantity )
- public set_stock_status( $status = ProductStockStatus::IN_STOCK )
- public set_backorders( $backorders )
- public set_low_stock_amount( $amount )
- public set_sold_individually( $sold_individually )
- public set_weight( $weight )
- public set_length( $length )
- public set_width( $width )
- public set_height( $height )
- public set_upsell_ids( $upsell_ids )
- public set_cross_sell_ids( $cross_sell_ids )
- public set_parent_id( $parent_id )
- public set_reviews_allowed( $reviews_allowed )
- public set_purchase_note( $purchase_note )
- public set_attributes( $raw_attributes )
- public set_default_attributes( $default_attributes )
- public set_menu_order( $menu_order )
- public set_post_password( $post_password )
- public set_category_ids( $term_ids )
- public set_tag_ids( $term_ids )
- public set_brand_ids( $term_ids )
- public set_virtual( $virtual )
- public set_shipping_class_id( $id )
- public set_downloadable( $downloadable )
- public set_downloads( $downloads_array )
- public set_download_limit( $download_limit )
- public set_download_expiry( $download_expiry )
- public set_gallery_image_ids( $image_ids )
- public set_image_id( $image_id = '' )
- public set_rating_counts( $counts )
- public set_average_rating( $average )
- public set_review_count( $count )
- public validate_props()
- public save()
- public delete( $force_delete = false )
- public supports( $feature )
- public exists()
- public is_type( $type )
- public is_downloadable()
- public is_virtual()
- public is_featured()
- public is_sold_individually()
- public is_viewable()
- public is_publicly_viewable()
- public is_visible()
- public is_purchasable()
- public is_on_sale( $context = 'view' )
- public has_dimensions()
- public has_weight()
- public is_in_stock()
- public needs_shipping()
- public is_taxable()
- public is_shipping_taxable()
- public managing_stock()
- public backorders_allowed()
- public backorders_require_notification()
- public is_on_backorder( $qty_in_cart = 0 )
- public has_enough_stock( $quantity )
- public has_attributes()
- public has_child()
- public child_has_dimensions()
- public child_has_weight()
- public has_file( $download_id = '' )
- public has_options()
- public get_title()
- public get_permalink()
- public get_children()
- public get_stock_managed_by_id()
- public get_price_html( $deprecated = '' )
- public get_cogs_value_html()
- public get_formatted_name()
- public get_min_purchase_quantity()
- public get_max_purchase_quantity()
- public get_purchase_quantity_step()
- public add_to_cart_url()
- public single_add_to_cart_text()
- public add_to_cart_aria_describedby()
- public add_to_cart_text()
- public add_to_cart_description()
- public get_image( $size = 'woocommerce_thumbnail', $attr = array(), $placeholder = true )
- public get_shipping_class()
- public get_attribute( $attribute )
- public get_rating_count( $value = null )
- public get_file( $download_id = '' )
- public get_file_download_path( $download_id )
- public get_price_suffix( $price = '', $qty = 1 )
- public get_availability()
- public set_cogs_value( ?float $value )
- public get_cogs_value()
- public get_cogs_effective_value()
- public get_cogs_total_value()
- protected get_valid_tax_classes()
- private build_downloads_map( array $downloads )
- protected before_data_store_save_or_update()
- protected after_data_store_save_or_update( $state )
- protected maybe_defer_product_sync()
- protected is_visible_core()
- protected get_availability_text()
- protected get_availability_class()
- protected adjust_cogs_value_before_set( ?float $value )
- protected get_cogs_effective_value_core()
- protected get_cogs_total_value_core()
Примеры
#1 Получение и вывод данных товара
Код предназначен для шаблона, который выполняется после инициализации WooCommerce.
$product = wc_get_product( 123 );
if ( ! $product ) {
return;
}
printf(
'<a href="%s">%s</a>',
esc_url( $product->get_permalink() ),
esc_html( $product->get_name() )
);
echo wp_kses_post( $product->get_image() );
echo wp_kses_post( $product->get_price_html() );
get_price() получает цену строкой, например '1500'. Если цена не задана, результат - ''. Нулевая цена '0' допустима, поэтому проверка через empty() здесь не подходит.
Используйте wc_get_price_to_display(), когда нужна числовая цена с учётом настроек отображения налогов в магазине.
#2 Получение значения для отображения и редактирования
$product = wc_get_product( 123 );
if ( ! $product ) {
return;
}
$display_price = $product->get_price();
$edit_price = $product->get_price( 'edit' );
Первый вызов допускает изменение цены фильтрами. Второй получает текущее значение свойства без этих фильтров.
#3 Изменение цены простого товара
Установим обычную цену и уберём акционную цену вместе с её расписанием:
$product = wc_get_product( 123 );
if ( ! $product || ! $product->is_type( 'simple' ) ) {
return;
}
$product->set_regular_price( '1500' );
$product->set_sale_price( '' );
$product->set_date_on_sale_from( null );
$product->set_date_on_sale_to( null );
$product->save();
При сохранении стандартное хранилище пересчитает текущую цену с учётом изменений.
Для вариативного товара цены задаются у отдельных вариаций. Цена родительского товара синхронизируется с ними.
#4 Создание простого товара
Создадим черновик с ценой и учётом остатков:
$product = new WC_Product_Simple();
$result = $product->set_props( [
'name' => 'Футболка',
'status' => 'draft',
'regular_price' => '1500',
'manage_stock' => true,
'stock_quantity' => 10,
] );
if ( is_wp_error( $result ) ) {
return;
}
$product_id = $product->save();
Ключи массива соответствуют названиям свойств без префикса set_. Например, regular_price обрабатывается методом set_regular_price().
set_props() возвращает true или WP_Error. Неизвестные свойства без подходящего метода установки пропускаются.
При сохранении товара с включённым учётом остатков статус наличия определяется по количеству, порогу отсутствия товара и настройке предзаказов. Если учёт остатков отключён, количество сбрасывается в null.
#5 Сохранение пользовательского метаполя
$product = wc_get_product( 123 );
if ( ! $product ) {
return;
}
$product->update_meta_data( '_supplier_code', 'ABC-123' );
$product->save();
$supplier_code = $product->get_meta( '_supplier_code' );
Для удаления пользовательского метаполя используется delete_meta_data(), после которого также нужно сохранить изменения:
$product->delete_meta_data( '_supplier_code' ); $product->save();
Служебные свойства товара изменяйте специальными методами: например, артикул - через set_sku(), цену - через set_regular_price().
Заметки
| Пакет: WooCommerce\Abstracts |