我一直在网上搜索,阅读文档&但是我无法在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玩了几个星期了,而且我不想让我的努力变得徒劳无功。帮帮我们......
答案 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()
函数在按下确认订单按钮后处理结账。
希望这可以拯救某人的生命,因为我没有任何东西,因为我需要在经过几天燃烧的午夜油后才能睡觉,这会让你感到憎恶。