在Woocommerce 3中以编程方式设置产品销售价格和购物车商品价格

时间:2018-02-13 16:19:12

标签: php wordpress woocommerce cart price

这是Set product sale price programmatically in WooCommerce 3

的延续

答案有效,但是一旦用户将产品添加到购物车,旧价格仍会在结帐时显示。

如何在购物车商品的购物车和结帐页面上获得正确的促销价格?

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

让它适用于购物车和结帐页面(以及订单和电子邮件通知)的缺失部分是一个非常简单的技巧:

add_action( 'woocommerce_before_calculate_totals', 'set_cart_item_sale_price', 20, 1 );
function set_cart_item_sale_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        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

    }
}

代码进入活动子主题(活动主题)的function.php文件。

经过测试和工作。

  

因此,代码只是将产品销售价格设置为购物车商品中的产品价格,并且有效。

答案 1 :(得分:0)

@LoicTheAztec的答案非常好,但不是必需的。

您需要至少使用dynamic_sales_price_function过滤 woocommerce_product_get_price woocommerce_product_variation_get_price

要使其真正正常工作,还需要更多过滤器。

答案 2 :(得分:0)

接受的答案对我不起作用。 这是有效的方法:

function get_active_price($price, $product) {
        if ($product->is_on_sale()) {
            return $product->get_sale_price();
        }
        return $product->get_regular_price();
    }

add_filter('woocommerce_product_get_price', 'get_active_price'));

这与定制销售和正常价格一起使用。

答案 3 :(得分:0)

希望此代码对您有帮助

add_filter( 'woocommerce_get_price_html', 'bbloomer_alter_price_display', 9999, 2 );

function bbloomer_alter_price_display( $price_html, $product ) {

  // ONLY ON FRONTEND
  if ( is_admin() ) return $price_html;

  // ONLY IF PRICE NOT NULL
  if ( '' === $product->get_price() ) return $price_html;

  // IF CUSTOMER LOGGED IN, APPLY 20% DISCOUNT   
  if ( wc_current_user_has_role( 'customer' ) ) {
    $orig_price = wc_get_price_to_display( $product );
    $price_html = wc_price( $orig_price * 0.80 );
  }
  return $price_html;
}

add_action( 'woocommerce_before_calculate_totals', 'bbloomer_alter_price_cart', 9999 );

function bbloomer_alter_price_cart( $cart ) {

  if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

  if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;

  // IF CUSTOMER NOT LOGGED IN, DONT APPLY DISCOUNT
  if ( ! wc_current_user_has_role( 'customer' ) ) return;

  // LOOP THROUGH CART ITEMS & APPLY 20% DISCOUNT
  foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
    $product = $cart_item['data'];
    $price = $product->get_price();
    $cart_item['data']->set_price( $price * 0.80 );
  }
}