以编程方式在WooCommerce 3

时间:2018-02-13 09:59:55

标签: php wordpress woocommerce product price

我有一个设有各种产品类别的Woocommerce商店。

我想对属于 Cuckoo

产品类别的所有产品享受20%的折扣

现在,我想要实现的所有功能都在我的 functions.php

中设定了售价。

尝试如下:

    /* 
     * For a specific date, 20% off all products with product category as cuckoo clock.
     */
    function cuckoo_minus_twenty($sale_price, $product) { 
        $sale_price = $product->get_price() * 0.8;
        return $sale_price;
    }; 

    // add the action 
    add_filter( 'woocommerce_get_sale_price', 'cuckoo_minus_twenty', 10, 2 ); 

如果我在计算后var_dump $ sale_price的结果我得到了正确的答案,但是前端的价格显示了正常价格,并将销售价格显示为正常价格。

enter image description here

我可以使用钩子/过滤器来实现这个目标吗?

我还尝试通过以下方式设定销售价格:

$product->set_sale_price($sale_price); 

无济于事。

3 个答案:

答案 0 :(得分:3)

自WooCommerce 3以来,钩子woocommerce_get_sale_price已被弃用,并被woocommerce_product_get_sale_price取代。

此外,产品显示的价格也会被缓存。当促销价处于活动状态时,常规价格也会有效。

请改为尝试:

// Generating dynamically the product "regular price"
add_filter( 'woocommerce_product_get_regular_price', 'custom_dynamic_regular_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_regular_price', 'custom_dynamic_regular_price', 10, 2 );
function custom_dynamic_regular_price( $regular_price, $product ) {
    if( empty($regular_price) || $regular_price == 0 )
        return $product->get_price();
    else
        return $regular_price;
}


// Generating dynamically the product "sale price"
add_filter( 'woocommerce_product_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );
function custom_dynamic_sale_price( $sale_price, $product ) {
    $rate = 0.8;
    if( empty($sale_price) || $sale_price == 0 )
        return $product->get_regular_price() * $rate;
    else
        return $sale_price;
};

// Displayed formatted regular price + sale price
add_filter( 'woocommerce_get_price_html', 'custom_dynamic_sale_price_html', 20, 2 );
function custom_dynamic_sale_price_html( $price_html, $product ) {
    if( $product->is_type('variable') ) return $price_html;

    $price_html = wc_format_sale_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ), wc_get_price_to_display(  $product, array( 'price' => $product->get_sale_price() ) ) ) . $product->get_price_suffix();

    return $price_html;
}

代码放在活动子主题(活动主题)的function.php文件中。

经过测试,适用于单品,商店,产品类别和代码存档页面。

  

继续:
  Wrong Woocommerce cart item price after setting programmatically product sale price

答案 1 :(得分:0)

我意识到,您或多或少需要以下所有过滤器来使HTML可以立即使用。

add_filter( 'woocommerce_product_get_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_variation_prices_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_variation_prices_sale_price', 'custom_dynamic_sale_price', 10, 2 );

并且,如果要针对可变产品正确显示它,则需要确保已更改了 woocommerce_get_variation_prices_hash (由于存储的瞬态)。

您可能会发现我为客户创建的要点很有用

https://gist.github.com/xandl/743fb6af60827eb95ad42b20b478b020

答案 2 :(得分:-1)

使用woocomerce_get_sale_price过滤器。

var maxDiff = dates.Zip(dates.Skip(1), (c, n) => (n-c).TotalSeconds).Max();