


Блог IT-шника
Блог IT-шника
Привіт:) У цьому пості покажу універсальний спосіб як у WooCommerce отримати мінімальну та максимальну ціну всіх товарів з детальним поясненням.
Коли ви створюєте інтернет-магазин на WooCommerce, іноді виникає потреба визначити найменшу (мінімальну) та найбільшу (максимальну) ціну серед усіх товарів. Це може бути корисно для:
Для розв'язання цієї задачі є декілька способів. Але я використаю саме SQL-запит до бази даних.
до змісту ↑WooCommerce зберігає ціни товарів у таблиці wp_postmeta
(або {prefix}_postmeta
, де {prefix}
— префікс вашої бази даних). Якщо просто перебирати всі товари через WP_Query
, це може бути повільно — особливо якщо у вас сотні або тисячі товарів.
Замість цього можна напряму запитати мінімальне та максимальне значення з поля _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'
Тут фільтруються лише опубліковані товари, щоб уникнути розрахунку по товарах у чернетках або неактивних продуктах.
_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 ₴