从结帐页面 woocommerce 更新购物车中的产品

Posted

技术标签:

【中文标题】从结帐页面 woocommerce 更新购物车中的产品【英文标题】:Update product in cart from checkout page woocommerce 【发布时间】:2018-06-17 13:24:37 【问题描述】:

我正在尝试在使用 ajax 进行付款(来自订单审核表)之前从结帐页面更新购物车中的产品。

但我做不到。

    首先,我将使用自定义元功能“存储自定义字段”添加到购物车。

    add_filter('woocommerce_add_cart_item_data', 'save_custom_data_with_add_to_cart', 10, 2); 功能 save_custom_data_with_add_to_cart( $cart_item_meta, $product_id ) 全球$woocommerce; $category_id = urldecode(base64_decode($_GET['c'])); $board_id = urldecode(base64_decode($_GET['b'])); $board_name = get_the_title($board_id); $cart_item_meta['slot_id'] = $category_id; $cart_item_meta['board_id'] = $board_id; $cart_item_meta['board_title'] = $board_name; 返回 $cart_item_meta;

    然后我想在结帐页面更改产品(订单评论选择)

    购物车->get_cart());

            foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) 
                $_product     = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );           
    
                if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_checkout_cart_item_visible', true, $cart_item, $cart_item_key ) ) 
                    ?>
                    <tr class="<?php echo esc_attr( apply_filters( 'woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) ); ?>">
    
                        <td class="product-name">   
                            <a href="#" class="edit_product"><i class="fa fa-pencil" aria-hidden="true"></i></a> &nbsp; <?php echo apply_filters( 'woocommerce_cart_item_name', $_product->get_name(), $cart_item, $cart_item_key ) . '&nbsp;'; ?>
                            <?php echo apply_filters( 'woocommerce_checkout_cart_item_quantity', ' <strong class="product-quantity">' . sprintf( '&times; %s', $cart_item['quantity'] ) . '</strong>', $cart_item, $cart_item_key ); ?>
                            <?php echo WC()->cart->get_item_data( $cart_item ); ?>  
                        <!--haredra code here -->
                        <select name="plan" id="plan" class="plan" >                        
                        <option >change product</option>
                        <option value="1">gold</option>
                        <option value="2">sliver</option>
                        <option value="3">bronze</option>
                        </select>
                        <input type="hidden" class="board_id" value="<?php echo $cart_item['board_id'] ;?>">
                        <input type="hidden" class="slot_id" value="<?php echo $cart_item['slot_id'] ;?>">
                        <input type="hidden" class="cart_item_key" value="<?php echo $cart_item['key'] ;?>"> 
                        </td>                       
    
                        <td class="product-total">
                            <?php echo apply_filters( 'woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal( $_product, $cart_item['quantity'] ), $cart_item, $cart_item_key ); ?>
    
                        </td>
    
                    </tr>
                    <?php
                
             
        ?>
    

    JQuery 帮助发送数据并获得响应..

    $('body').on('click', '.edit_product', function(e) $('#plan').show(); ); /// js 用于订单审核更新产品 jQuery(文档).ready(函数($) $('body').on('change', '#plan', function(e) var product_id = $('.plan').val(); var board_id = $('.board_id').val(); var slot_id = $('.slot_id').val(); var cart_item_key = $('.cart_item_key').val(); var ajaxurlsb = "" $.ajax( 类型:“发布”, url: ajaxurlsb+"?action=update_order_review", 数据:“product_id="+product_id+"&board_id="+board_id+"&slot_id="+slot_id+"&cart_item_key="+cart_item_key, 成功:函数(数据) 警报(数据); ); ); );

    更新功能

    //==============结帐订单审核更新===========// 功能更新订单审查() $product_id = $_POST['product_id']; $board_id = $_POST['board_id']; $board_name = get_the_title($board_id); $slot_id = $_POST['slot_id']; $cart_item_key = $_POST['cart_item_key']; if ( !empty($product_id) && !empty($board_id ) ) //这里我想更新产品ID print_r($product_); 死(); add_action('wp_ajax_update_order_review', 'update_order_review'); add_action('wp_ajax_nopriv_update_order_review', 'update_order_review');

问。给出一个解决方案来改变products id和item custom meta data.in this function.??

【问题讨论】:

什么不起作用?你的错误是什么?你的要求是什么?提问时要清楚。 也许this 会有所帮助 你好感谢重播.. 嗨,实际上我正在尝试将产品添加到购物车并在购物车元数据中保存一些额外的数据以及购物车中的每个产品。我想在结帐页面的订单审核部分选择一个选项,以便用户可以在结帐页面更改购物车中的产品,如果他们想更改的话。我希望该用户只能更改购物车中的产品,但其他购物车元保持不变。 woo commerce 可以做到这一点吗? 如果我理解正确,您的每个购物车商品都附加了自定义数据,并且在订单审核页面上,客户可以更改商品,但您希望保留之前添加的自定义数据以复制到这些新商品(替换产品)购物车物品。我对吗?如果是,那么您首先如何将自定义数据添加到购物车商品中,以及您在 order_review 页面上允许更改购物车商品(产品)的代码是什么? 【参考方案1】:

更新功能代码

//+++==============chackout oder review upadte===========//

function update_order_review() 
    global $woocommerce;
    global $wpdb;
      $product_id = $_POST['product_id'];
      $_product = wc_get_product( $product_id );
      $price = $_product->get_price();
      $cart_item_key = $_POST['cart_item_key']; 
        /*===set value in cart====*/
        WC()->cart->cart_contents[$cart_item_key]['product_id'] = $product_id ;
        WC()->cart->cart_contents[$cart_item_key]['line_subtotal'] = $price ;
        WC()->cart->cart_contents[$cart_item_key]['line_total'] = $price ;
        $woocommerce->cart->set_session();

die();

add_action('wp_ajax_update_order_review', 'update_order_review');
add_action('wp_ajax_nopriv_update_order_review', 'update_order_review');

【讨论】:

以上是关于从结帐页面 woocommerce 更新购物车中的产品的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 的结帐时禁用 AJAX

Woocommerce 在结帐页面下订单后替换购物车中的产品

在 Woocommerce 购物车、结帐页面、订单和电子邮件通知中的产品标题上方显示品牌名称

在 Woocommerce 结帐页面中将产品添加到购物车的复选框字段

从 WooCommerce 中的订单总额中删除运费总额

根据 WooCommerce 中的运输类别自定义计算的运输成本