Encodera

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

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

Оглавление

Поиск товаров

Чтобы получить не один товар, а список по условию — новинки, товары категории, всё со скидкой, — используют функцию wc_get_products(). Она принимает массив условий и возвращает массив объектов WC_Product.

Простой запрос

// wp-content/plugins/acme-shop/includes/products.php
add_action('woocommerce_after_single_product_summary', function () {
    $products = wc_get_products([
        'status' => 'publish',
        'limit' => 4,
        'orderby' => 'date',
        'order' => 'DESC',
    ]);
 
    echo '<h2>Новинки</h2><ul>';
 
    foreach ($products as $product) {
        printf(
            '<li><a href="%s">%s</a> — %s</li>',
            esc_url($product->get_permalink()),
            esc_html($product->get_name()),
            $product->get_price_html()
        );
    }
 
    echo '</ul>';
}, 25);

Запрос берёт четыре последних опубликованных товара. Откройте страницу любого товара: внизу, после вкладок с описанием, появится список «Новинки» со ссылками и ценами.

Параметры

ПараметрЧто отбирает
statusСтатус: publish, draft
typeВид: simple, variable
categoryМассив ярлыков категорий: ['mugs']
tagМассив ярлыков меток
skuАртикул, совпадение по части строки
stock_statusinstock, outofstock, onbackorder
featuredtrue — только рекомендуемые
include, excludeМассивы идентификаторов
limitСколько вернуть, -1 — все
orderby, orderСортировка: date, title, ID, rand
returnobjects или ids

Товары категории в наличии

$products = wc_get_products([
    'category' => ['mugs'],
    'stock_status' => 'instock',
    'limit' => 12,
]);

Условия объединяются по «И»: вернутся только кружки, которые есть в наличии.

Только идентификаторы

$ids = wc_get_products([
    'category' => ['mugs'],
    'limit' => -1,
    'return' => 'ids',
]);
 
echo count($ids);

С return => ids функция не создаёт объекты, поэтому работает заметно быстрее. Так считают товары или готовят список для другой операции.

Постраничный вывод

$result = wc_get_products([
    'limit' => 12,
    'page' => 2,
    'paginate' => true,
]);
 
echo $result->total;          // всего товаров
echo $result->max_num_pages;  // всего страниц
 
foreach ($result->products as $product) {
    echo $product->get_name();
}

С параметром paginate вместо массива возвращается объект с тремя полями: товары текущей страницы, общее число и число страниц.

Класс запроса

Функция wc_get_products() — короткая запись для класса WC_Product_Query:

$query = new WC_Product_Query(['category' => ['mugs'], 'limit' => 12]);
$products = $query->get_products();

Результат тот же. Класс удобен, когда условия собирают по частям методом $query->set('limit', 24).

Поиск по метаданным

Собственный ключ в массиве условий WooCommerce не понимает — его нужно научить фильтром:

// wp-content/plugins/acme-shop/includes/products.php
add_filter('woocommerce_product_data_store_cpt_get_products_query', function (array $query, array $vars): array {
    if (isset($vars['acme_lead_time'])) {
        $query['meta_query'][] = [
            'key' => '_acme_lead_time',
            'value' => (int) $vars['acme_lead_time'],
            'type' => 'NUMERIC',
        ];
    }
 
    return $query;
}, 10, 2);

После этого вызов wc_get_products(['acme_lead_time' => 3]) вернёт товары со сроком изготовления три дня.

Частая ошибка

Запрос с limit => -1 без return => ids на большом каталоге создаёт тысячи объектов и упирается в ограничение памяти. Всегда задавайте разумный limit, а для полного обхода каталога берите идентификаторы или читайте товары порциями через page.

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

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