我想做的是为我的每个Woocommerce产品购买正常价格,并根据几个条件动态创建销售价格。这将包括以下内容:
1)在商店页面产品上显示动态创建的销售价格。 2)购物车中显示的促销价格(商品价格和购物车总数反映了动态促销价格) 3)结帐页面和总计反映动态销售价格。
研究几种解决方案我提出了以下解决方案:
// 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.7;
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;
}
add_action( 'woocommerce_before_calculate_totals',
'set_cart_item_sale_price', 10, 1 );
function set_cart_item_sale_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Iterate through each cart item
foreach( $cart->get_cart() as $cart_item ) {
$price = $cart_item['data']->get_sale_price(); // get sale price
$cart_item['data']->set_price( $price ); // Set the sale price
}
}
add_filter( 'woocommerce_cart_item_price',
'bbloomer_change_cart_table_price_display', 30, 3 );
function bbloomer_change_cart_table_price_display( $price, $values,
$cart_item_key ) {
$slashed_price = $values['data']->get_price_html();
$is_on_sale = $values['data']->is_on_sale();
if ( $is_on_sale ) {
$price = $slashed_price;
}
return $price;
}
此工作除了购物车表总计显示原始价格总计,而不是动态销售价格总计。必须有一种更简单的方法来做到这一点。任何帮助,将不胜感激。谢谢,Jules
答案 0 :(得分:0)
不知何故,折扣被应用了两次。也许是主题或框架相关,我不确定。在两个函数中添加一行限制何时应用折扣使其对我有用。
function custom_product_sale_price( $price, $product ) {
if( is_admin() ) return $price;{
}
if( ! get_post_meta( $product->get_id(), '_sale_price', true ) > 0 ){
if( is_shop() || is_product_category() || is_product_tag() || is_product()
|| is_cart() || is_checkout() )
$price *= 0.7;
}
return $price;
}