Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Объект товара: чтение

Товар в коде — объект класса 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». Всегда проверяйте результат перед обращением к методам.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.