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

时间:2016-05-10 06:18:35

标签: wordpress woocommerce

我一直在网上搜索,阅读文档&但是我无法在Checkout Page中找到更换产品。

为了您的信息,我的主要产品页面位于主页中,并且已选择的每个产品将重定向到结帐页面。现在,这里有一个问题。让我解释一下......

你知道,我在Checkout页面有一个旋转木马滑块,用户可以在付款之前更改/替换他们的产品(已经添加到购物车中)。

形状checkout.php

global $woocommerce;
global $product;
$items = $woocommerce->cart->get_cart();
foreach ($items as &$item){
     $id = $item['product_id'];
}
echo $id;

<div id="carousel-example-generic" class="carousel slide" data-ride="carousel" data-interval="false">
     <div class="carousel-inner" role="listbox">
     <?php
          // Querying of product information retrieval
          $args = array( 'post_type' => 'product', 'posts_per_page' => 4, 'orderby' =>'menu_order', 'order' =>'ASC');
          $loop = new WP_Query( $args );

          // Display each retrieved product
               while ( $loop->have_posts() ) : 
               $loop->the_post();
               // WooCommerce global product variable. Refer: https://docs.woothemes.com/document/class-reference/
               global $product;
               global $woocommerce;
     ?>
<div class="item <?php if ($product->id == $id) { ?> active <?php } ?>">
     <div class="p-big" id="p-custom-color">
          <strong><?php the_title(); ?></strong>
     </div>
     <div class="p-light-black">CANDIDATES</div>
     <input type="hidden" id="product" name="productid" value="<?php echo $product->id; ?>">
</div>
     <?php
               endwhile;
               wp_reset_query(); // After the loop ended, quit the custom loop and reset back the main loop
     ?>
     </div>
</div>


<!-- Upon form submission -->
if (isset($_POST['woocommerce_checkout_place_order'])){

     global $woocommerce;
     $woocommerce->cart->empty_cart(); // Empty the cart

     $selectedproduct = $_POST['selectedproductid']; // Get the selected product
     do_shortcode('[add_to_cart id="' . $selectedproduct . '"]'); // Insert the selected product in the the cart
     return esc_url( wc_get_checkout_url() ); // Redirect to Payment Gateway Page
}

<form name="checkout" method="post" class="checkout woocommerce-checkout" action="" enctype="multipart/form-data">

     <?php if ( sizeof( $checkout->checkout_fields ) > 0 ) : ?>

     <?php do_action( 'woocommerce_checkout_before_customer_details' ); ?>

     <?php do_action( 'woocommerce_checkout_billing' ); ?>

     <?php do_action( 'woocommerce_checkout_after_customer_details' ); ?>

     <?php endif; ?>


          <h3 id="order_review_heading"><?php _e( 'Your order', 'woocommerce' ); ?></h3>

     <?php do_action( 'woocommerce_checkout_before_order_review' ); ?>

          <div id="order_review" class="woocommerce-checkout-review-order">
               <!-- Checkout Review -->
               <input type="hidden" id="selectedproduct" name="selectedproductid" value="">
               <?php do_action( 'woocommerce_checkout_order_review' ); ?>
          </div>

     <?php do_action( 'woocommerce_checkout_after_order_review' ); ?>

</form>

正如您所看到的,在旋转木马中,我已经包含<input type="hidden" id="product" name="productid" value="<?php echo $product->id; ?>">来获取每个产品ID和我的jQuery(我没有在这里显示),我采用了该产品当前的任何产品ID在活动幻灯片上,将其填入表单中的<input type="hidden" id="selectedproduct" name="selectedproductid" value="">

通过这些,我可以根据活动幻灯片使用这些代码(位于表单上方)替换已添加到购物车中的产品与选定/选择的产品: -

<!-- Upon form submission -->
if (isset($_POST['woocommerce_checkout_place_order'])){

     global $woocommerce;
     $woocommerce->cart->empty_cart(); // Empty the cart

     $selectedproduct = $_POST['selectedproductid']; // Get the selected product
     do_shortcode('[add_to_cart id="' . $selectedproduct . '"]'); // Insert the selected product in the the cart
     return esc_url( wc_get_checkout_url() ); // Redirect to Payment Gateway Page
}

这里的问题是,无法用旧产品替换旧产品它只是重定向到支付网关页面

我希望在下订单时用新选择的产品替换产品。可能吗?我希望是这样,因为我已经和WooCommerce玩了几个星期了,而且我不想让我的努力变得徒劳无功。帮帮我们......

1 个答案:

答案 0 :(得分:1)

经过几天的计算,使用30多个Chrome标签,50多个购买测试&amp; 10加仑的咖啡,终于找到了答案......

add_action('woocommerce_checkout_process', 'change_product_upon_submission');
function change_product_upon_submission() {
     if ( !empty( $_POST['_wpnonce'] ) && !empty($_POST['selectedproductid']) ) {
     $selectedproduct = $_POST['selectedproductid']; // Get the selected product
     WC()->cart->empty_cart(); //Empty the cart
     WC()->cart->add_to_cart( $selectedproduct ); // Insert the selected product in the cart
     }
}

触发此功能所需的钩子位于 includes / class-wc-checkout.php 中的WC_Checkout process_checkout()类内。这个woocommerce_checkout_process不存在WooCommerce模板文件,我们会彻底的。因此,在下订单提交之前,在将数据发送到支付网关之前,要做任何自定义内容,我们将需要操作woocommerce_checkout_process挂钩,因为process_checkout()函数在按下确认订单按钮后处理结账。

希望这可以拯救某人的生命,因为我没有任何东西,因为我需要在经过几天燃烧的午夜油后才能睡觉,这会让你感到憎恶。