Получить список товаров со скидкой в woocommerce

В woocommerce вы легко можете получить список простых, вариативных или рекомендуемых товаров. Так же легко получить товары со статусом «в наличии» или «нет в наличии».

Тем не менее получить список товаров со скидкой может быть немного сложнее, потому что товары со скидкой используют другие мета-ключи для определения скидочного статуса в зависимости от типа товара.

Рассмотрим несколько путей получить продукты со скидкой в woocommerce.

Проверяем статус товара

Если вы хотите проверить статус товара используйте код ниже:


global $product;
if ( $product->is_on_sale() ) {
    do_something();
}

Простой способ отобразить товары со скидкой

Множество разработчиков хотят вывести товары на собственной странице. Для этого вы можете использовать шорткод


[sale_products columns="1" per_page="2"]

Отобразить товары со скидкой woocommerce

Шорткод сделает за вас всю сложную работу.

Вывод 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

Оглавление:

  1. Проверяем статус товара
  2. Простой способ отобразить товары со скидкой
  3. Вывод WooCommerce товаров со скидкой с помощью WP_Query
  4. Так почему это лучше?