当前位置: 首页 > 知识库问答 >
问题:

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

周浩淼
2023-03-14

我一直在网上搜索阅读文档

供您参考,我的主产品页面位于主页中,已选择的每个产品都将重定向到签出页面。现在,这里有一个问题。让我解释一下。。。。

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

form-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>

如你所见,在旋转木马中,我包含了

这样,我就可以将添加到购物车中的产品替换为基于活动幻灯片的所选/所选产品,代码如下(位于表单上方):-

<!-- 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个答案

吕昀
2023-03-14

经过几天的思考,30个Chrome标签,50个购买测试

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
     }
}

触发此函数所需的钩子位于包含/class-wc-checkout.php.中的WC_Checkoutprocess_checkout()类中。此woocommerce_checkout_process不存在WooCommerce模板文件,我们将彻底检查。因此,为了在提交订单时向支付网关发送数据之前做任何自定义的事情,我们需要操作woocommerce_checkout_process钩子,因为process_checkout()函数在按下确认订单按钮后处理结帐。

希望这能拯救一些人的生命,因为我没有任何生命,因为我需要在熬夜几天后睡觉,因为我在想这个讨厌的东西。

 类似资料:
  • WooCommerce中,非Ajax情况下,点击加入购物车按钮后跳转到何处可以通过filter:add_to_cart_redirect修改,下面代码可以实现产品加入购物车后直接结账的功能,跳过购物车页面。 如果你希望Shop首页或分类页中的加入购物车按钮也具备这种效果,不要勾选Enable AJAX add to cart buttons on archives功能。否则该代码只在单个产品页面有

  • 我使用Woocommerce插件在wordpress中开发了购物车。我需要按产品价格在购物车订单中显示产品,请帮助我做到这一点 谢啦

  • 如何在Woocommerce购物车页面中的购物车项目名称后添加产品ID? 我知道我需要先不返回,因为这样会把我从函数中拉出来,但我很好奇我该如何去做这件事。

  • 我正在寻找输出相关的产品在我的woocommerce购物车页面。 在查看单个产品时,函数可以很好地工作。 但是在shopping-cart.php上使用这个函数时,会返回一个错误: 中非对象的成员函数get_related() 我尝试将该函数包含在产品循环中: 这产生了同样的错误。 在目前有几种产品存在问题的情况下,是否可以这样做?我会很高兴地从购物车中随机挑选一个产品,并根据它输出建议。

  • 问题内容: 我有上面的代码。 如果我在cart_item上运行print_r,我将得到一个多维数组: 我如何只获得product_id? 我试过$ test = 没用 问题答案: 要获取 foreach循环中的每个购物车商品(对于简单产品): 如果是可变产品,请获取 : 或在两种情况下 ( Woocommerce 3+中 的 Object在哪里) : 更新: 循环外使用产品ID 1)打破循环 (仅

  • 我想在Woocommerce购物车优惠券区域下的Woocommerce购物车页面中添加注释字段。此字段应该类似于Woocommerce结帐页“订单注释”字段,客户可以在其中添加一些注释。 到目前为止,我有一个指示我所需位置的代码: 如何在此区域中添加备注字段,以便这些客户备注也显示在结帐页面的订单详细信息中? 谢谢