
本文深入探讨了WooCommerce自定义页面结账表单在预览模式下正常工作,但在常规访问时显示“购物车为空”的常见问题。核心原因在于WooCommerce购物车会话未被正确加载和初始化。教程将详细介绍如何通过在代码中引入 wc_load_cart() 函数来确保购物车会话的正确加载,从而解决此问题,并提供完整的代码示例及开发注意事项,帮助开发者构建稳定可靠的自定义结账流程。
理解问题根源
在WordPress和WooCommerce环境中,当开发者构建自定义的“页内结账”表单,允许用户直接在产品页面完成支付而无需跳转到购物车页面时,可能会遇到一个奇怪的现象:表单在WordPress的预览模式下运行良好,订单可以正常处理并支付;然而,一旦在新的浏览器窗口、不同的浏览器或移动设备上访问同一页面,点击确认订单按钮后却被重定向到“您的购物车当前为空”的页面,且订单未被处理。
这个问题的核心在于WooCommerce的会话管理机制。在某些特定的加载上下文中(例如WordPress的预览模式),WooCommerce的购物车会话可能已被隐式加载。但在常规的页面请求中,如果自定义代码在操作购物车之前没有明确地初始化或加载购物车会话,那么对 WC()->cart 对象的任何操作(如 empty_cart() 或 add_to_cart())都可能在一个未完全准备好的购物车实例上进行,导致购物车状态无法正确保存或识别,最终表现为“购物车为空”。
解决方案:强制加载购物车会话
解决此问题的关键在于确保在尝试修改购物车内容之前,WooCommerce的购物车会话已被完全加载。WooCommerce提供了一个专门的函数 wc_load_cart() 来实现这一目的。
通过在对购物车进行任何操作(例如清空购物车或添加商品)之前调用 wc_load_cart(),可以强制WooCommerce从会话中加载当前的购物车状态,从而保证后续的购物车操作能够正确地作用于持久化的购物车数据。
代码实现
以下是修改后的自定义结账表单PHP代码,其中关键的改动是添加了 wc_load_cart();。
get_available_variations();$variations = array_map(function ($variation) use ($options) { return [ 'id' => $variation['variation_id'], 'label' => $variation['attributes']['attribute_quantita'], 'price' => $variation['display_price'], 'regular_price' => $variation['display_regular_price'], 'quantity' => strip_tags($variation['variation_description']), 'highlight' => $options['highlight_label_' . $variation['variation_id']] ?? false, 'highlight_color' => $options['highlight_label_color_' . $variation['variation_id']] ?? false, ];}, $variations);$initialVariation = $variations[0];function formatPrice($price){ echo number_format($price, 2, ',', '') . '€';}// 关键改动:在操作购物车之前加载购物车会话wc_load_cart(); WC()->cart->empty_cart();WC()->cart->add_to_cart($productId, 1, $initialVariation['id']);if(class_exists('WC_Gateway_Stripe')) { $stripe = new WC_Gateway_Stripe(); $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; wp_register_style('stripe_styles', plugins_url('assets/css/stripe-styles.css', WC_STRIPE_MAIN_FILE), [], WC_STRIPE_VERSION); wp_enqueue_style('stripe_styles'); wp_register_script('stripe', 'https://js.stripe.com/v3/', '', '3.0', true); wp_register_script('woocommerce_stripe', plugins_url('assets/js/stripe' . $suffix . '.js', WC_STRIPE_MAIN_FILE), ['jquery-payment', 'stripe'], WC_STRIPE_VERSION, true); wp_register_script('woocommerce_gateway_stripe', plugins_url('assets/js/stripe' . $suffix . '.js', WC_STRIPE_MAIN_FILE), ['jquery-payment', 'stripe'], WC_STRIPE_VERSION, true); wp_localize_script( 'woocommerce_stripe', 'wc_stripe_params', apply_filters('wc_stripe_params', $stripe->javascript_params()) ); $stripe->tokenization_script(); wp_enqueue_script('woocommerce_stripe');}wp_enqueue_script('wc-country-select');wp_enqueue_script('selectWoo');wp_enqueue_style('select2');$shippingMethods = WC()->shipping()->get_packages()[0]['rates'];$chosenMethod = isset(WC()->session->chosen_shipping_methods[0]) ? WC()->session->chosen_shipping_methods[0] : '';function business_day($days, $abbrv = false){ if($abbrv) { return utf8_encode(strtolower(strftime('%a %e. %m.', strtotime(" $days weekdays")))); } return utf8_encode(strtolower(strftime('%A', strtotime(" $days weekdays"))));}function add_delivery_payment_info(){ printf(''); printf(''); printf(''); printf('Oggi non paghi niente!'); printf('Paghi alla consegna ?'); printf(''); printf(' '); printf(''); printf('');}add_action('woocommerce_review_order_before_submit', 'add_delivery_payment_info');?><div class="inpage-form" data-product-id=""> Modulo d’ordine
1): ?> <label for="option-"> x a pezzo <form name="checkout" method="post" class="checkout woocommerce-checkout" action="" enctype="multipart/form-data">
<label class="inpage-form__insurance inpage-form__extras" data-product-id=""> <path d="m21.286 5.618-2.75 3.5c-.168.214-.417.351-.688.377l-.098.005c-.237 0-.469-.084-.65-.241l-1.75-1.5c-.42-.359-.469-.991-.108-1.41.359-.419.
以上就是解决WooCommerce自定义结账表单在非预览模式下购物车为空的问题的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1261284.html
微信扫一扫
支付宝扫一扫