我见过很多以顾客价格向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行然后手动转到购物车,那么产品就是我的定制价格。实际上,如果可能的话,我想申请自定义价格并直接重定向到结帐页面而不是购物车?
答案 0 :(得分:3)
您可以使用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);
}
}
}