【问题标题】:Woocommerce add to cart with custom priceWoocommerce 以自定义价格添加到购物车
【发布时间】:2015-11-28 10:43:10
【问题描述】:

我见过很多以客户价格将商品添加到 WC 购物车的示例,但没有一个是动态添加的。我正在尝试在接收 POST 变量的简码函数中做......

if (isset($_POST['wmnf_add_donation'])) {
    global $woocommerce;
    $cart_object = $woocommerce->cart;
    $custom_price = ($_POST['donation_amount'] > 0 ? $_POST['donation_amount'] : 0);
    $target_product_id = 65986;
    $cart_object->add_to_cart($target_product_id, "1");
    foreach ( $cart_object->cart_contents as $key => $value ) {
        if ( $value['product_id'] == $target_product_id ) {
            $value['data']->price = $custom_price;
        }
    }
}

这当然会将商品添加到购物车,但价格为零,我意识到我需要以某种方式将此数组保存回 WC 购物车数据。这种方法是否可行,还是只能通过过滤器或动作挂钩来完成?如果是这样,我如何将更改后的数组保存回购物车内容或使其能够添加具有发布价格的一件商品?非常感谢任何指导。


感谢 doublesharp 的回答,我无法按照描述的那样工作,因为表单是使用包含我的表单的简码发布到页面,而不是直接发布到购物车。没有看到 $_POST 并且产品最终为零。我确实找到了另一种方法,但使用 wp_redirect 时遇到问题。我将上面的简码更改为:

if (isset($_POST['wmnf_add_donation'])) {
    global $woocommerce;
    $custom_price = ($_POST['donation_amount'] > 0 ? $_POST['donation_amount'] : 0);
    $target_product_id = 65986;
    $_SESSION['donation_amount'] = $custom_price;
    $woocommerce->cart->add_to_cart($target_product_id, "1");
    wp_redirect( site_url() . '/gifts/swag-bag/');
}

然后我在functions.php中添加了以下过滤器:

add_filter('woocommerce_get_price','donation_price', 10, 2);
add_filter('woocommerce_get_regular_price','donation_price', 10, 2);
add_filter('woocommerce_get_sale_price','donation_price', 10, 2);
function donation_price($price, $productd){
     if($productd->id == '65986'){
        $price = $_SESSION['donation_amount'];
     }
     return $price;
}

这不起作用,除非 wp_redirect 被注释掉,因此,不重定向。以上重定向到购物车,但它是空的。如果我注释掉 wp_redirect 行,然后手动转到购物车,则该产品以我的自定义价格存在。实际上,如果可能的话,我想应用自定义价格并直接重定向到结帐页面而不是购物车?

【问题讨论】:

    标签: wordpress woocommerce


    【解决方案1】:

    您可以使用woocommerce_before_calculate_totals 操作挂钩来修改购物车的内容,包括产品价格。

    add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals' );
    function before_calculate_totals( $_cart ){
        // loop through the cart_contents
        foreach ( $_cart->cart_contents as $cart_item_key => &$item ) {
            // you will need to determine the product id you want to modify, only when the "donation_amount" is passed
            if ( $item['id'] == 65986 && isset( $_POST['donation_amount'] ) ){
                // custom price from POST
                $custom_price = $_POST['donation_amount'] > 0 ? $_POST['donation_amount'] : 0;
    
                // save to the cart data
                $item['data']->price = $custom_price;
                // new versions of WooCommerce may require (instead of line above)...
                // $item['data']->set_price($custom_price);
            }
        }
    }
    

    【讨论】:

    • 你是天使吗?用这个真的一针见血。我是一个更快乐的人。
    • 这不起作用,它设置数据->价格,但这不会改变购物车中显示的内容
    • @doublesharp Yeh 可能,只是让您知道以下现在有效: $item['data']->set_price(number_format(DOWNLOAD_PRODUCT_PRICE_EX_VAT,2)); - 显然忽略了我的常量
    • 好像他们把它移到了一个函数中......更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2020-08-11
    • 2017-10-14
    • 2018-05-18
    相关资源
    最近更新 更多