【问题标题】:WooCommerce: Display ONLY on-sale products in ShopWooCommerce:仅在商店中显示打折产品
【发布时间】:2014-01-26 05:33:43
【问题描述】:

我需要创建一个产品存档页面(通常是 WooCommerce 中的 Shop 页面)但仅显示 特价产品。基本上它应该使用与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,并作为页面模板

但是,这仅适用于 Simple products 类型,我需要它同时适用于 Simple 产品和 Variable 产品类型。 p>

【问题讨论】:

    标签: wordpress woocommerce archive product shop


    【解决方案1】:

    @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);
            }
            if(isset($_GET['bestsellers'])) {
                $meta_query     = array(
                array( 
                    'key'           => 'total_sales',
                    'value'         => 0,
                    'compare'       => '>',
                    'type'          => 'numeric'
                    )
                );
            }
        }
    
    return $query;
    }
    

    【讨论】:

    • 干杯!当我有时间回顾那个项目时,我会尝试一下。发送信息! :)
    • 这行得通。但是,在存档页面上应用其他过滤器会覆盖它,因为它不像标准那样表现为“AND”过滤器。
    • @Skovsgaard 我没有要测试的 WP
    【解决方案2】:

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

    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; 
    
    }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    • 由于某种原因,我无法让它工作。如果类别不存在,则创建该类别,但未将产品分配给它。即使我再次尝试保存,该类别仍为空,没有任何关联的产品。
    【解决方案3】:

    @mirus 关于短代码的回答让我想到了查看 WooCommerce 如何仅查询打折商品。显然 WooCommerce 有一个 wc_get_product_ids_on_sale() 函数,它将返回打折商品的 ID。然后我们可以使用post__in 参数轻松调整查询,只返回那些特定的项目。

    WooCommerce 在class-wc-query.php 类中有一个woocommerce_product_query 钩子,它允许我们在运行之前修改查询......它在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 );
    
    }
    

    【讨论】:

    • 这应该是正确的答案。它在主查询之前运行(更好的性能),问题似乎是针对主查询的(这个方法正在影响什么),它利用了 Woo 所做的工作。
    • 对,这是正确的答案。元键 '_min_variation_sale_price' 不适用于“可变产品” - 我使用 '$q->set('post__in', (array) $product_ids_on_sale);' 'post__in' 比 'meta_query' 快得多,并且使用缓存 'transient' 并找到 'variable products'。
    • 这对我也有用,不知何故有些产品没有“_min_variation_sale_price”元键
    【解决方案4】:

    我设法过滤掉 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 并作为页面模板

    【讨论】:

    • 你有没有遇到过这样的问题:检查销售价格是否大于 0 元查询返回产品计划开始销售,但目前不在销售片刻?这些产品不应在结果中返回,但我不知道如何编写元查询以排除/包含预定销售产品。干杯
    • 不,我以前从未遇到过这种情况。也许您应该创建一个新问题,并希望有人能够提供帮助。我相信我们很多人也想知道。
    • 如何使用内置的 woocommerce 过滤器?我已经有显示所有在售产品的页面模板,但我想按类别、价格等进行过滤(使用默认的 woocommerce)?当我现在更改类别时,会显示所有产品(不仅带有销售徽章)。
    • 我认为将类别添加到参数将是一个开始。不过,请尝试创建一个针对您的案例的新问题。它对我们许多人来说可能会派上用场。
    • 不要忘记添加'paged' => $paged,,因为@Giraldi 在他的编辑中添加了。否则分页将无法正常工作!
    【解决方案5】:

    使用简码[sale_products per_page="12"]创建一个新页面

    可用短代码及其参数列表在这里:http://docs.woothemes.com/document/woocommerce-shortcodes/

    【讨论】:

    • 他只想展示特价商品。这仍将保留原始商店页面...以及未在售的商品
    • 哦,我现在明白你的意思了
    • 感谢您的回答。但是,我知道这个 shortcode,但我需要它与 archive-product.php模板布局 具有相同的结果计数、排序过滤器、分页等。
    • @gmaggio,对不起,对你的问题有点误解
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多