В WooCommerce вы легко можете получить список простых, вариативных или рекомендуемых товаров. Так же легко получить товары со статусом «в наличии» или «нет в наличии».
Тем не менее получить список товаров со скидкой может быть немного сложнее, потому что товары со скидкой используют другие мета-ключи для определения скидочного статуса в зависимости от типа товара.
[contents]
Рассмотрим несколько путей получить продукты со скидкой в WooCommerce.
Проверяем статус товара
Если вы хотите проверить статус товара используйте код ниже:
global $product;
if ( $product->is_on_sale() ) {
do_something();
}
Простой способ отобразить товары со скидкой
Множество разработчиков хотят вывести товары на собственной странице. Для этого вы можете использовать шорткод
[sale_products columns="1" per_page="2"]

Шорткод сделает за вас всю сложную работу.
Вывод WooCommerce товаров со скидкой с помощью WP_Query
Вы можете использовать WP_Query для получения товаров. По умолчанию рекомендуется использовать мета ключ _sale_price
для определения скидочных товаров.
Проблема этого способа в том, что вариативные товары не используют этот ключ. Он возвращает только простые товары.
Для обхода этого ограничения добавьте мета ключ _min_variation_sale_price
. Затем сделайте запрос используя оба ключа с отношением OR
.
$args = array(
'post_type' => 'product',
'posts_per_page' => 2,
'meta_query' => array(
'relation' => 'OR',
array( // Простой товар
'key' => '_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
),
array( // Вариативный товар
'key' => '_min_variation_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
)
)
);
$q = new WP_Query( $args );
Это определенно работает, но не лучший способ.
Давайте вернемся к шорткоду, упомянутому ранее, чтобы увидеть, как woocommerce получает товары со скидкой.
Woocommerce делает это по другому. Они используют функцию wc_get_product_ids_on_sale()
, которая возвращает массив содержащий идентификаторы товаров со скидкой. Это позволяет сделать простой запрос
$query_args = array(
'posts_per_page' => 8,
'no_found_rows' => 1,
'post_status' => 'publish',
'post_type' => 'product',
'meta_query' => WC()->query->get_meta_query(),
'post__in' => array_merge( array( 0 ), wc_get_product_ids_on_sale() )
);
$products = new WP_Query( $query_args );
Это более эффективный способ получить товары.
Так почему это лучше?
- Проще выполнить единственный
SQL
запросpost__in
, чем более сложный для мета ключей - Этот метод использует отдельный запрос для получения идентификаторов товаров со скидкой и затем может быть проанализирован и оптимизирован (относится к следующему пункту)
- Запрос для
post__in
, когда у нас уже есть идентификаторы намного быстрее, потому что функцияwc_get_product_ids_on_sale
использует транзитное кэширование.
WooCommerce и wordpress хорошо оптимизированы и прежде чем писать свой запрос посмотрите как это сделано в ядре WooCommerce