WooCommerce:仅在商店中展示销售产品

时间:2014-01-08 08:16:21

标签: wordpress woocommerce archive product shop

我需要创建产品存档页面(通常是商店页面 WooCommerce ),但只显示 出售产品。基本上它应该使用与archive-product.php中相同的模板布局。主菜单中将有一个指向此页面的链接。我该怎么做?

更新

我设法过滤掉 ON SALE 产品,下面的代码放在if ( have_posts() ) :行的上方......

$args = array(
    'post_type'      => 'product',
    'order'          => 'ASC',
    'paged'          => $paged,
    'meta_query'     => array(
        array(
            'key'           => '_sale_price',
            'value'         => 0,
            'compare'       => '>',
            'type'          => 'numeric'
        )
    )
);

query_posts( $args );

代码放在archive-product.php副本中,我将其命名为archive-product_sale.php并制作为页面模板

但是,这仅适用于简单产品类型,我需要它适用于简单产品和变量产品类型。

5 个答案:

答案 0 :(得分:14)

@ Mirus公司'关于短代码的答案给了我一个想法,看看WooCommerce如何只询问销售商品。显然,WooCommerce有一个wc_get_product_ids_on_sale()功能,它将返回销售商品的ID。然后,我们可以使用post__in参数轻松调整查询,仅返回这些特定项目。

WooCommerce在woocommerce_product_query类中有class-wc-query.php个钩子,允许我们在运行之前修改查询....它在pre_get_posts运行,这是通常的地方用于修改查询。使用Woo的钩子只意味着让它们处理大部分条件逻辑关于应该应用此查询修改的时间。

add_action( 'woocommerce_product_query', 'so_20990199_product_query' );

function so_20990199_product_query( $q ){

    $product_ids_on_sale = wc_get_product_ids_on_sale();

    $q->set( 'post__in', $product_ids_on_sale );

}

答案 1 :(得分:9)

我设法过滤掉了 ON SALE 产品,其中位于if ( have_posts() ) :线以上的代码......

$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 );

代码放在archive-product.php的副本中,我将其重命名为archive-product_sale.php并制作为页面模板

答案 2 :(得分:6)

@gmaggio使用query_posts()will break your site。 使用pre_get_posts

add_filter( 'pre_get_posts', 'catalog_filters' );
function catalog_filters( $query ) {
    if ( $query->is_main_query() && $query->post_type = 'product' ) {
        if(isset($_GET['onsale'])) {
            $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->set('meta_query', $meta_query); d($query);
        }
        if(isset($_GET['bestsellers'])) {
            $meta_query     = array(
            array( 
                'key'           => 'total_sales',
                'value'         => 0,
                'compare'       => '>',
                'type'          => 'numeric'
                )
            );
        }
    }

return $query;
}

答案 3 :(得分:0)

使用短代码[sale_products per_page="12"]

创建新页面

可用的短代码及其参数列表如下:http://docs.woothemes.com/document/woocommerce-shortcodes/

答案 4 :(得分:0)

可变和简单产品的解决方案:

add_action( 'save_post_product', 'update_product_set_sale_cat_var' );

function update_product_set_sale_cat_var( $post_id ) {

    $sales_ids = wc_get_product_ids_on_sale();

    foreach ( $sales_ids as $sale_id ) :
        if ($sale_id == $post_id) :
            wp_set_object_terms($post_id, 'sale', 'product_cat', true );
        else :
            if ( has_term( 'sale', 'product_cat', $post_id ) ) {
                wp_remove_object_terms( $post_id, 'sale', 'product_cat' );
            }
        endif;
    endforeach; 

}