php WooCommerce 'set_price()'无法按预期工作

whlutmcx  于 2023-11-16  发布在  PHP
关注(0)|答案(1)|浏览(106)

我有下面的代码来更新基于所选项目的小计。客户可以订购5美元的产品样品,或者他们可以以每平方英尺7.95美元的价格购买产品。我试图让set_price()更新它以显示5美元,或者,例如,如果客户购买40平方英尺,则显示318美元。然而,我只能看到7.95美元在任何一种情况下,这是“正常价格”从产品页面上的后端 Jmeter 板。

add_action('woocommerce_before_calculate_totals', 'set_custom_calculated_item_price', 10, 1);
// add_action('woocommerce_calculate_totals', 'set_custom_calculated_item_price', 10, 1);
// add_action('woocommerce_after_calculate_totals', 'set_custom_calculated_item_price', 10, 1);
function set_custom_calculated_item_price($cart) {
  if (is_admin() && !defined('DOING_AJAX')) {
    return;
  }

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

  foreach($cart->get_cart() as $cart_item) {
    $product = $cart_item['data'];
    write_log(create_message('product: ', $product));
    if (isset($cart_item['cost'])) {
      $product->set_price($cart_item['cost']);
    }
    if (str_starts_with($cart_item['product_sku'], 'S-')) {
      $name = get_the_title($product->get_id()) . ' (Sample)';
      $product->set_name($name);
    }
  }
}

字符串
正如你所看到的,我尝试了三种不同的挂钩,试图让这个更新,但没有一个给我预期的变化。我仍然只看到7.95美元,如上所述。
有没有人知道我下一步可以尝试什么?谢谢!
编辑:这是我目前看到的截图。我需要更改的小计是在行项目上。购物车小计是正确的,但我显然需要向客户显示每个行项目的正确小计。
x1c 0d1x的数据

h6my8fg2

h6my8fg21#

实际上,我最近遇到了一个非常类似的问题。我也使用before_calculate_totals钩子设置了一个自定义价格,我的购物车总数会更新,但我的商品只会显示为以前的价格。经过大量搜索,我遇到了一个非常有用的Github问题线程,其中包含另一个用户分享的修复。
https://github.com/woocommerce/woocommerce/issues/26422#issuecomment-1025490033

function wpse64458_force_recalculate_wc_totals() {
    // Calculate totals
    WC()->cart->calculate_totals();
    // Save cart to session
    WC()->cart->set_session();
    // Maybe set cart cookies
    WC()->cart->maybe_set_cart_cookies();
}
add_action( 'woocommerce_before_mini_cart_contents', 'wpse64458_force_recalculate_wc_totals' );

字符串
基本上迫使购物车重新计算价格导致正确的价格被显示。
另一方面,你有没有试过不把$cart_item ['data']赋给一个变量,甚至在一开始测试时赋给一个固定的值?

$cart_item['data']->set_price($cart_item['cost'])


如果这些对你不起作用的另一个选择是尝试在'update_cart_product_subtotal_price'钩子上设置价格:

/**
 * Display custom pricing in cart subtotal
 */
public function update_cart_product_subtotal_price( $product_price, $cart_item, $cart_item_key ){
    $product_price = $cart_item['data']->get_price();
    return wc_price($product_price);
}

add_filter('woocommerce_cart_item_price', 'update_cart_product_subtotal_price', 20, 3);

相关问题