自定义 Woocommerce 价格未从购物车传递到结帐

Custom Woocommerce price not being passed from cart to checkout

我正在建立一个 woocommerce 商店来销售古董地图,包括原件和数字印刷品。因此,地图被设置为同一产品的两个变体:"Original" 和 "Print"。 "Original" 只是原始古董地图,但 "Print" 有很多选项,例如框架、安装和打印尺寸,这些由用户在单品页面中使用 jquery 设置。

我已经成功地允许用户从单个产品页面中的一系列选项中进行选择,从而根据他们select.

这是使用 jquery 完成的,选项(包括价格)使用隐藏字段和自定义数据传递到购物车,如下所示,其中 isset($_REQUEST['price']) 是指到 jquery 设置的隐藏价格字段(框架、安装、尺寸等有很多这些,但这给出了一个想法:

if(isset($_REQUEST['price']) && ! empty( 'price' )) {

    $order_item_price = sanitize_text_field($_REQUEST['price']);

    $cart_item_data['custom_data']['order_price'] = array(
      'label' => 'Total this item',
      'value' => '£' . $order_item_price
    );
}

...这很好用。价格和总价(以及有关产品的其他自定义信息)显示在购物车中,购物车底部的总价与产品价格相符。我用这个函数来实现这个:

function update_price_in_cart( $cart_obj ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }
    if( ! is_cart() ) {
        return;
    }  
    // Iterate through each cart item
    foreach( $cart_obj->get_cart() as $item_key=>$cart_item ) {

        if( isset( $cart_item['total_price'] ) || isset( $cart_item['total_price_original'] ) ) {
            $price = $cart_item['total_price'] + $cart_item['total_price_original'];
            $cart_item['data']->set_price( ( $price ) );
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'update_price_in_cart', 10, 1 );

问题出在用户进行结帐时。使用隐藏字段(框架类型、安装类型、尺寸、价格)创建的所有数据显示在页面左侧的产品下方,但右侧每个订购产品旁边的总计设置为原始价格设置在 wordpress 的 woocommerce 产品中设置的变体 'Print'。

我试过用这样的方法约会(下面是使用静态值的测试):

function update_price_in_checkout($cart_obj) {

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

    var_dump($cart_item_data['custom_data']['order_price']);

    if( isset( $cart_item['total_price'] ) || isset( $cart_item['total_price_original'] ) ) {
         WC()->cart->total = 597;
    } else {
        WC()->cart->total = 1;
    }
}
add_action( 'woocommerce_review_order_before_order_total', 'update_price_in_checkout' );

...但是一个。这只接受静态数字,因为它不获取隐藏字段和 b。它不会触及结帐右侧的单个产品价格。

总而言之,我需要找到一种方法,用基于用户输入的计算总价替换显示在右侧的基本变体产品价格。在购物车页面中一切正常,但不会转移到结帐页面。

深入研究 Whosebug 我认为将其设置为 woocommerce_checkout_create_order_line_item 可能是个好主意,但我不知道该怎么做。

有什么想法吗?

以下代码会将您的产品价格 select 选项(来自隐藏的产品字段)作为自定义添加到购物车商品数据中,并将更新购物车商品价格:

// Get custom field value, calculate new item price, save it as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_field_data', 20, 3 );
function add_custom_field_data( $cart_item_data, $product_id, $variation_id ) {
    if (isset($_REQUEST['price']) && !empty($_REQUEST['price'])) {
        $cart_item_data['custom_price'] = sanitize_text_field($_REQUEST['price']);
        $cart_item_data['unique_key']   = md5(microtime().rand());
    }
    return $cart_item_data;
}

// Update price
add_action( 'woocommerce_before_calculate_totals', 'update_price_in_cart', 10, 1 );
function update_price_in_cart( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    // Loop through cart items
    foreach( $cart->get_cart() as $cart_item ) {
        if( isset( $cart_item['custom_price'] ) ) {
            // Add options to the product price
            $cart_item['data']->set_price( $cart_item['data']->get_price() + $cart_item['custom_price'] );
        }
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。测试和工作。