Как вывести только товары с акцией в WooCommerce?
так wp-panda.com/woocommerce_posts/woocommerce-shortco...
цикл сильно прощще<ul class="products">
	<?php
                $product_ids_on_sale = wc_get_product_ids_on_sale();

		$args = array(
			'post_type' => 'product',
                        'post__in' => array_merge( array( 0 ), $product_ids_on_sale )
			);
		$loop = new WP_Query( $args );
		if ( $loop->have_posts() ) {
			while ( $loop->have_posts() ) : $loop->the_post();
				wc_get_template_part( 'content', 'product' );
			endwhile;
		} else {
			echo __( 'Продуктов не найдено' );
		}
		wp_reset_postdata();
	?>
</ul><!--/.products-->
Можно шорткодом [sale_products per_page="12"] (12 - кол-во продуктов на вывод)
Можно кодом: $args = array(
    'post_type'      => 'product',
    'meta_query'     => array(
        'relation' => 'OR',
        array( // Simple products type
            'key'           => '_sale_price',
            'value'         => 0,
            'compare'       => '>',
            'type'          => 'numeric'
        ),
        array( // Variable products type
            'key'           => '_min_variation_sale_price',
            'value'         => 0,
            'compare'       => '>',
            'type'          => 'numeric'
        )
    )
);

query_posts( $args );
Узнать есть ли скидка: $product->is_on_sale()
--
Смотря что нужно в конкретном случае