Поиск товаров
Чтобы получить не один товар, а список по условию — новинки, товары категории, всё со скидкой, — используют функцию 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_status | instock, outofstock, onbackorder |
featured | true — только рекомендуемые |
include, exclude | Массивы идентификаторов |
limit | Сколько вернуть, -1 — все |
orderby, order | Сортировка: date, title, ID, rand |
return | objects или 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.