Объект товара: чтение
Товар в коде — объект класса WC_Product. У него есть метод для каждого свойства: названия, цены, остатка. Где именно эти данные лежат в базе, знает сам объект — вам достаточно вызвать метод.
Где писать код
Создайте файл includes/products.php и подключите его в acme-shop.php строкой require __DIR__ . '/includes/products.php';. В нём будет всё, что касается товаров.
Получение товара
// wp-content/plugins/acme-shop/includes/products.php
add_action('woocommerce_before_shop_loop', function () {
$product = wc_get_product(12);
if ($product) {
echo '<p>Товар дня: ' . esc_html($product->get_name()) . '</p>';
}
});Функция wc_get_product() принимает идентификатор и возвращает объект товара либо false, если такого товара нет. Замените 12 на идентификатор своей кружки и откройте /shop/: над каталогом появится строка «Товар дня: Кружка».
Свойства
| Метод | Что возвращает |
|---|---|
get_id() | Идентификатор |
get_name() | Название |
get_sku() | Артикул |
get_regular_price() | Обычная цена |
get_sale_price() | Цена со скидкой, пустая строка без скидки |
get_price() | Действующая цена |
get_price_html() | Цена в HTML, старая зачёркнута |
get_short_description() | Краткое описание |
get_stock_quantity() | Остаток, null без учёта остатков |
get_permalink() | Адрес страницы товара |
get_image_id() | Идентификатор картинки |
Цены возвращаются строками, например '9.90': перед вычислениями их приводят к числу через (float).
Проверки
Методы, начинающиеся с is_, отвечают «да» или «нет»:
// wp-content/plugins/acme-shop/includes/products.php
add_action('woocommerce_before_shop_loop', function () {
$product = wc_get_product(12);
if ($product && $product->is_in_stock() && $product->is_on_sale()) {
printf(
'<p><a href="%s">%s</a> со скидкой: %s</p>',
esc_url($product->get_permalink()),
esc_html($product->get_name()),
$product->get_price_html()
);
}
});Строка со ссылкой и ценой появится, только если товар есть в наличии и на него действует скидка. Скидку задают в редакторе товара, поле «Цена распродажи».
Текущий товар
На странице товара и внутри плитки каталога WooCommerce сам кладёт текущий товар в глобальную переменную $product:
// wp-content/plugins/acme-shop/includes/products.php
add_action('woocommerce_single_product_summary', function () {
global $product;
if ($product instanceof WC_Product && $product->get_sku() !== '') {
echo '<p>Артикул: ' . esc_html($product->get_sku()) . '</p>';
}
}, 6);Откройте страницу любого товара с заполненным артикулом: под названием появится строка «Артикул: MUG-001». Вызывать wc_get_product() здесь не нужно.
Картинка
echo wp_get_attachment_image($product->get_image_id(), 'woocommerce_thumbnail');
echo $product->get_image('woocommerce_single');Первая строка выводит тег картинки по её идентификатору, вторая делает то же методом товара и подставляет заглушку, если картинки нет.
Частая ошибка
Результат wc_get_product() используют без проверки: wc_get_product($id)->get_name(). Товар могли удалить — функция вернёт false, и страница упадёт с ошибкой «вызов метода у false». Всегда проверяйте результат перед обращением к методам.