Все данные товара в WooCommerce живут в объекте класса WC_Product. Работать с ним правильнее, чем читать post_meta напрямую: объект знает, где хранится каждое поле, применяет фильтры и одинаково ведёт себя для всех типов товаров. Ниже — как получить объект по ID, шпаргалка по его методам и несколько мест, где новичков ждут неожиданности.
Получаем объект товара
$product = wc_get_product( $product_id );
if ( ! $product ) {
return; // товара с таким ID нет или он не является товаром
}
echo $product->get_name();
Функция возвращает false, если ID не найден, поэтому проверка обязательна. Внутри цикла товаров объект уже есть в глобальной переменной $product, и вызывать wc_get_product() без аргумента там тоже можно — она возьмёт текущий пост.
Важно, что функция возвращает не всегда один и тот же класс: для простого товара это WC_Product_Simple, для вариативного — WC_Product_Variable, для вариации — WC_Product_Variation, есть ещё сгруппированные и внешние товары. Общие методы у них одинаковые, но часть методов существует только у своего типа. Узнать тип можно через $product->get_type() или проверить $product->is_type( 'variable' ).
Шпаргалка по методам
// Основное
$product->get_id();
$product->get_name();
$product->get_slug();
$product->get_permalink();
$product->get_type(); // simple, variable, variation, grouped, external
$product->get_status(); // publish, draft, private…
$product->get_sku();
$product->get_description();
$product->get_short_description();
$product->get_catalog_visibility();
$product->get_menu_order();
$product->get_date_created(); // объект WC_DateTime
$product->get_date_modified();
// Цены и скидки
$product->get_price(); // актуальная цена (строка, без валюты)
$product->get_regular_price();
$product->get_sale_price();
$product->is_on_sale();
$product->get_date_on_sale_from();
$product->get_date_on_sale_to();
$product->get_price_html(); // готовая цена для вывода, с валютой и зачёркиванием
$product->get_total_sales();
// Наличие
$product->get_stock_status(); // instock, outofstock, onbackorder
$product->is_in_stock();
$product->get_manage_stock();
$product->get_stock_quantity();
$product->get_low_stock_amount();
$product->get_backorders();
$product->get_sold_individually();
$product->is_purchasable();
// Налоги и доставка
$product->get_tax_status();
$product->get_tax_class();
$product->get_shipping_class_id();
$product->get_shipping_class(); // ярлык класса доставки
$product->is_virtual();
$product->is_downloadable();
$product->get_downloads();
// Размеры и вес
$product->get_weight();
$product->get_length();
$product->get_width();
$product->get_height();
$product->get_dimensions(); // готовая строка вида «10 × 20 × 30 см»
$product->get_dimensions( false ); // массив с отдельными значениями
// Таксономии и связи
$product->get_category_ids();
$product->get_tag_ids();
$product->get_upsell_ids();
$product->get_cross_sell_ids();
$product->get_parent_id(); // для вариации — ID родителя, иначе 0
// Изображения
$product->get_image_id();
$product->get_image( 'woocommerce_thumbnail' ); // готовый тег img
$product->get_gallery_image_ids();
// Атрибуты
$product->get_attributes(); // массив объектов WC_Product_Attribute
$product->get_attribute( 'pa_color' ); // значения одного атрибута строкой
// Отзывы
$product->get_reviews_allowed();
$product->get_average_rating();
$product->get_review_count();
$product->get_rating_counts();
// Прочее
$product->get_purchase_note();
$product->get_featured();
$product->get_meta( '_my_field' ); // произвольное поле
На что обратить внимание
Цены — это строки
Методы get_price(), get_regular_price() и get_sale_price() возвращают строку без форматирования, как она хранится в базе, и не учитывают налоги. Для вывода покупателю используйте get_price_html() или wc_price( $product->get_price() ). Для цены с учётом настроек отображения налогов есть wc_get_price_to_display( $product ). Для арифметики приводите строку к числу.
Даты — это объекты
Методы get_date_created(), get_date_modified() и даты распродажи возвращают объект WC_DateTime либо null, если дата не задана. Строку из него даёт метод date( 'Y-m-d' ) или date_i18n() для локализованного формата.
Произвольные поля — через get_meta()
Для собственных мета-полей используйте $product->get_meta( '_my_field' ), а не get_post_meta(): метод объекта учитывает, где WooCommerce хранит данные товара, и совместим с будущими изменениями хранилища. Запись — через update_meta_data() и обязательный save():
$product->update_meta_data( '_my_field', 'значение' );
$product->save();
Вариативные товары и вариации
У вариативного товара цены и остатки хранятся в вариациях, поэтому у родителя get_price() вернёт минимальную цену, а для полного набора есть отдельные методы:
$product = wc_get_product( 256 ); // вариативный товар
$product->get_children(); // массив ID вариаций
$product->get_variation_price( 'min' ); // минимальная цена, 'max' — максимальная
$product->get_available_variations(); // массив данных всех доступных вариаций
$variation = wc_get_product( 257 ); // конкретная вариация
$variation->get_parent_id(); // 256
$variation->get_variation_attributes(); // [ 'attribute_pa_color' => 'red' ]
$variation->get_price(); // цена именно этой вариации
Название, описание и категории у вариации берутся от родителя, поэтому за ними нужно обращаться к нему.
Все данные разом
Метод get_data() возвращает основные поля товара одним ассоциативным массивом — удобно для отладки, экспорта или передачи в JSON:
$data = $product->get_data();
// [ 'id' => 256, 'name' => '…', 'price' => '1990', 'stock_status' => 'instock', … ]
В массив не попадают вычисляемые значения вроде get_price_html() и часть данных вариаций, но для быстрого взгляда на товар его достаточно.
Много товаров сразу
Если нужны данные не одного товара, а выборки, не вызывайте wc_get_product() в цикле по ID из своего запроса. Функция wc_get_products() принимает те же условия — статус, категорию, наличие, лимит — и возвращает готовые объекты:
$products = wc_get_products( array(
'status' => 'publish',
'category' => array( 'svetilniki' ),
'stock_status' => 'instock',
'limit' => 20,
) );
Коротко
wc_get_product( $id ) даёт объект товара, и всё остальное — его методы: цены как строки, даты как объекты, произвольные поля через get_meta(). Проверяйте результат на false, помните о типах товаров и берите данные вариаций из самих вариаций. Для отладки есть get_data(), для выборок — wc_get_products().
Частые вопросы
Метод отдаёт цену так, как она хранится в базе. Для вывода покупателю используйте get_price_html() или wc_price(), для цены с учётом налогов — wc_get_price_to_display().
Через $product->get_meta( 'ключ' ). Запись — update_meta_data() и затем save(). Прямой get_post_meta() тоже работает, но метод объекта не зависит от способа хранения данных.
У родителя get_variation_price( 'min' ) и get_variation_price( 'max' ) дают диапазон, get_available_variations() — данные каждой вариации. Цена конкретной вариации — у её собственного объекта через wc_get_product( $variation_id ).
get_date_created() возвращает объект WC_DateTime или null. Проверьте на null и вызовите date( 'd.m.Y' ) или date_i18n() для локализованного формата.
Источники
- 1.WC_Product — WooCommerce Code Referencehttps://woocommerce.github.io/code-reference/classes/WC-Product.html
- 2.wc_get_product — WooCommerce Code Referencehttps://woocommerce.github.io/code-reference/namespaces/default.html#function_wc_get_product
- 3.CRUD Objects in WooCommerce 3.0 — wiki WooCommercehttps://github.com/woocommerce/woocommerce/wiki/CRUD-Objects-in-3.0



