Як у WooCommerce отримати мінімальну та максимальну ціну всіх товарів

Привіт:) У цьому пості покажу універсальний спосіб як у WooCommerce отримати мінімальну та максимальну ціну всіх товарів з детальним поясненням.

Коли ви створюєте інтернет-магазин на WooCommerce, іноді виникає потреба визначити найменшу (мінімальну) та найбільшу (максимальну) ціну серед усіх товарів. Це може бути корисно для:

  • створення динамічного цінового фільтру;
  • відображення діапазону цін на сторінці магазину;
  • аналітики цін;
  • маркетингових цілей (наприклад, "ціни від XX грн до YY грн").

Для розв'язання цієї задачі є декілька способів. Але я використаю саме SQL-запит до бази даних.

до змісту ↑

Чому варто використовувати SQL-запит

WooCommerce зберігає ціни товарів у таблиці wp_postmeta (або {prefix}_postmeta, де {prefix} — префікс вашої бази даних). Якщо просто перебирати всі товари через WP_Query, це може бути повільно — особливо якщо у вас сотні або тисячі товарів.

Замість цього можна напряму запитати мінімальне та максимальне значення з поля _price, що значно швидше і ефективніше.

Функція get_woocommerce_min_max_price()

Нижче наведена повноцінна користувацька PHP-функція, яка повертає мінімальну та максимальну ціну всіх опублікованих товарів WooCommerce:

/**
* Get the minimum and maximum price of all products in WooCommerce
*/
if ( ! function_exists( 'get_woocommerce_min_max_price' ) ) {
function get_woocommerce_min_max_price() {
global $wpdb;

$min_price = $wpdb->get_var("
SELECT MIN(CAST(pm.meta_value AS UNSIGNED))
FROM {$wpdb->prefix}postmeta pm
INNER JOIN {$wpdb->prefix}posts p ON pm.post_id = p.ID
WHERE pm.meta_key = '_price'
AND p.post_type = 'product'
AND p.post_status = 'publish'
");

$max_price = $wpdb->get_var("
SELECT MAX(CAST(pm.meta_value AS UNSIGNED))
FROM {$wpdb->prefix}postmeta pm
INNER JOIN {$wpdb->prefix}posts p ON pm.post_id = p.ID
WHERE pm.meta_key = '_price'
AND p.post_type = 'product'
AND p.post_status = 'publish'
");

return [
'min_price' => $min_price,
'max_price' => $max_price,
];
}
}

Пояснення рядків коду функції.

global $wpdb;

Цей рядок підключає глобальну змінну $wpdb, яка є основним інструментом для роботи з базою даних WordPress. Вона дозволяє виконувати SQL-запити безпосередньо до бази даних.

$wpdb->get_var(...)

Метод get_var() повертає одне значення з SQL-запиту — саме те, що нам потрібно (мінімальна або максимальна ціна).

SELECT MIN(CAST(pm.meta_value AS UNSIGNED))
  • MIN(...) — SQL-функція, що повертає найменше значення.
  • CAST(pm.meta_value AS UNSIGNED) — перетворює значення ціни з текстового формату (в якому воно зберігається у базі даних) у числовий формат, щоб SQL міг правильно визначити мінімум/максимум.

Аналогічно у другому запиті використовується MAX(...) щоб знайти максимальну ціну.

FROM {$wpdb->prefix}postmeta pm

Інформація вибирається із таблиці postmeta, яка зберігає мета-дані (у тому числі й ціни).

INNER JOIN {$wpdb->prefix}posts p ON pm.post_id = p.ID

Цей JOIN поєднує таблиці postmeta та posts для перевірки що мета-дані належать саме до опублікованого товару.

WHERE pm.meta_key = '_price'

Цим рядком вказується, що нас цікавить лише мета-значення із ключем _price, яке WooCommerce використовує для зберігання загальної ціни товару (враховуючи варіації тощо).

AND p.post_type = 'product' AND p.post_status = 'publish'

Тут фільтруються лише опубліковані товари, щоб уникнути розрахунку по товарах у чернетках або неактивних продуктах.

Що з варіативними товарами?

WooCommerce автоматично зберігає у _price мінімальну ціну варіативного товару, тому ця функція вже враховує варіативні товари. Не потрібно робити додаткову обробку варіацій.
до змісту ↑

Як використовувати функцію get_woocommerce_min_max_price()

/** Вивести мінімальну та максимальну ціну простим числом **/

// Мінімальна ціна
$minProductPrice = get_woocommerce_min_max_price()['min_price'];
echo $minProductPrice; // Результат: 2

// Максимальна ціна
$maxProductPrice = get_woocommerce_min_max_price()['max_price'];
echo $maxProductPrice; // Результат: 100


/** Вивести мінімальну та максимальну ціну числом із символом валюти **/ 

$prices = get_woocommerce_min_max_price();

// Мінімальна ціна
$minProductPrice = wc_price( $prices['min_price'] );
echo $minProductPrice; // Результат: 2,00 ₴

// Максимальна ціна
$maxProductPrice = wc_price( $prices['max_price'] );
echo $maxProductPrice; // Результат: 100,00 ₴

Михайло Петров
Михайло Петров

Мене звати Михайло. Я — WordPress-розробник. Створюю візитки, корпоративні сайти, блоги на WordPress.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *