如何将自定义选项(如自定义价格)传递给WooCommerce购物车

时间:2019-01-05 23:00:06

标签: php wordpress woocommerce

我试图使用PHP和Ajax从普通的WordPress页面向woocommerce购物车传递自定义价格/自定义属性,但是我无法动态完成工作。

我正在使用我们开发站点上嵌入的AJAX应用程序,该应用程序本质上是根据配置的产品变化来计算总数。我正在尝试从那里获取总金额,然后将产品提交到Woocommerce购物车(默认价格为0.00),然后在此处替换价格。

我一直在使用此处提供的类似情况的PHP工作,但我认为我缺少了一些东西:Adding a product to cart with custom info and price

我可以使用woocommerce_before_calculate_totals挂钩设置静态价格,但是使用上面链接中概述的代码,我似乎无法使用AJAX按钮将自定义价格“传递”到购物车。 POST数据永远不会到达PHP函数。我现在尝试的方式是使用带有一些AJAX代码的按钮来制作帖子,但是我一直在碰壁。我想我对这里的事情有一个错误的想法。我在下面的ajax中使用静态价格。

jQuery(function(){
jQuery('#newQuoteBtn').on('click', function(e){
    e.preventDefault();

    jQuery.ajax({
        url: '/wp-content/plugins/override_price.php',
        type: 'post',
        data: { 'custom_options': {'action': 'newquote', 'newprice': '555.55', 'quotenum': '1234567890'}},
        success: function(data, status) {
            /* Product added and redirect to cart */
            console.log('success');
        },
        error: function(xhr, desc, err) {
            console.log(xhr);
            console.log("Details: " + desc + "\nError:" + err);
        }
    }); // end ajax call
});
});

我希望数据能够传递到PHP,PHP负责从那里重写价格,但是我无法将变量传递给PHP。作者的评论说要将该代码放在functions.php文件中,但是如何在其中发布数据?这里某处断开连接,我需要帮助来阐明解决此问题的正确方法。

2 个答案:

答案 0 :(得分:0)

或多或少地想出了这部分。我必须使用一个表单发布将产品添加到购物车,这将允许我的函数拾取表单(包括价格)中输入的变量并在购物车中覆盖它们。或多或少,我的设置如下:

HTML表单

<form method="POST" enctype="multipart/form-data" id="outer-quote-form">
    <label class="quote_number">Quote Number: 
        <input type="text" id="quote_number" name="quote_number" value="">
    </label>
    <label class="custom_price">price:
        <input type="text" id="custom_price" name="custom_price" value="">
    </label>
    <button type="submit" class="btn btn-primary" name="ws-add-to-cart">Add to Cart</button>
</form>

然后我有一些PHP函数。这个人侦听表单发布,然后将产品添加到购物车。

if (isset($_REQUEST['ws-add-to-cart'])) {
    add_action( 'init', 'add_product_to_cart' );
    function add_product_to_cart() {
        global $woocommerce;
        global $product;
        $product_id = 138;
        $woocommerce->cart->add_to_cart($product_id);
    }
    header("Location:https://www.devsite.com/checkout/");
}

此函数与“ woocommerce_add_cart_item_data”挂钩,以获取自定义价格并将该值添加到产品数据中。

add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 3 );
function add_cart_item_data( $cart_item_data, $product_id ) {
    if( ! empty( $_POST['custom_price'] ) ) {
        $product = wc_get_product( $product_id );
        $price = $product->get_price();
        $newprice = $_POST['custom_price'];
        $cart_item_data['custom_price'] = $newprice;
    }
    return $cart_item_data;
}

最后,我们使用“ woocommerce_before_calculate_totals”挂钩实际覆盖购物车中产品的价格。

add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals', 10, 1 );
function before_calculate_totals( $cart_object ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }
    foreach( $cart_object->get_cart() as $key=>$value ) {
        if( isset( $value['custom_price'] ) ) {
            $price = $value['custom_price'];
            $value['data']->set_price( ( $price ) );
        }
    }
}

值得注意的是,此设置到目前为止仅适用于购物车中的一种产品,而这就是我现在所需要的。

答案 1 :(得分:0)

这是使用 javascript 添加内容的想法:

var form = document.querySelector('button[name*=add-to-cart]').closest('form')
form.onsubmit = function(){
  var input = document.createElement("input")
  input.name = "custom_attribute"
  input.value = "my value"
  input.type = "hidden"
  form.appendChild(input)
  return true
}