我不想在这里发帖,但我找不到我想要的答案,而且我没有足够的声誉来评论其他非常类似的问题以获得我的确切答案。
我从这篇文章中找到了一个近乎完美的答案:WooCommerce: Add product to cart with price override?
使用代码:
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price');
function add_custom_price( $cart_object ) {
$custom_price = 10; // This will be your custome price
foreach ( $cart_object->cart_contents as $key => $value ) {
$value['data']->price = $custom_price;
}
}
并且效果很好......如果您设置了硬编码的自定义价格。
我的问题是:如何根据用户输入设置自定义价格?
我已经尝试过每一种我能想到的方式来传递信息(我甚至尝试过使用cookie,全局,会话),而且没有一个能按照我想要的方式工作,所有这些都是最好的,黑客攻击。
有问题的特定产品是捐赠,客户希望用户能够设定捐赠价格(而不仅仅是创建具有设定价格点的可变产品)。
在捐赠页面上,当用户提交捐赠表格时,我将捐赠产品添加到购物车中,如下所示:
$donation_success = $woocommerce->cart->add_to_cart($donation_id);
我的捐款产品的定价为0.00,所以当它被添加到购物车时它的价格为0.00(我不知道价格是在此时或之后设定的)
我已尝试使用add_to_cart方法中的最后一个变量传递信息,该方法接受一组参数,但我似乎无法使其工作。
我确信答案很简单,但我已经尝试了几个小时才能做到这一点,我无法让它发挥作用。我没有想法。
我现在使用的实际代码与上述帖子的回答者略有不同,但工作方式基本相同:
add_action( 'woocommerce_before_calculate_totals', 'woo_add_donation');
function woo_add_donation() {
global $woocommerce;
$donation = 10;
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
if($cart_item['data']->id == 358 || $cart_item['data']->id == 360){
$cart_item['data']->set_price($donation);
}
}
}
提前感谢任何有用的建议!
答案 0 :(得分:11)
我找到了一个不优雅的解决方案,但却符合我的目的。
我之前尝试使用过Cookie,但我没有设置Cookie路径,所以它只能用于设置的页面。
我现在用捐赠价格设置一个cookie:
setcookie("donation", $_GET['donation'], 0, "/");
然后我就这样定价:
add_action( 'woocommerce_before_calculate_totals', 'woo_add_donation');
function woo_add_donation() {
global $woocommerce;
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
if($cart_item['data']->id == 358 && ! empty($_COOKIE['donation'])){
$cart_item['data']->set_price($_COOKIE['donation']);
}
}
}
答案 1 :(得分:3)
我一直在寻找完全相同的东西。我找到了这个
的WooCommerce插件(不是免费的)最初,我不确定使用哪些搜索字词来查找这样的插件,但看起来像“WooCommerce name your price”会显示其他类似插件来源的链接。
答案 2 :(得分:1)
[这是评论]你在哪里设置cookie?我的第一个猜测是使用GET方法在同一页面刷新,并使用$ _GET ['捐赠']提供PHP代码块来设置cookie。 然后,一旦设置了cookie,您就会将页面重定向到Woocommerce Cart页面以继续购物过程。如果您更轻松地做到这一点,请告诉我。感谢。
抱歉,由于缺少积分,我无法将此作为对所选答案的评论发布。
答案 3 :(得分:0)
此代码将创建具有自定义价格的订单:
$product = wc_get_product($product_id);
$order = wc_create_order();
try {
$order->add_product($product);
//$order->set_customer_id($user->ID);
$order->set_billing_email($customer_email);
} catch (WC_Data_Exception $e) {
wp_send_json_error("Failed to create order");
}
$order->calculate_totals();
try {
$order->set_total($custom_price); // $custom_price should be float value
} catch (WC_Data_Exception $e) {
wp_send_json_error("Failed to change order details");
}
$order->save();
$order->update_status( 'completed' );