当前位置:首页 > 文章列表 > 文章 > php教程 > WooCommerce结账异常排查与修复方法

WooCommerce结账异常排查与修复方法

2025-07-15 22:36:26 0浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是文章学习者,那么本文《WooCommerce 结账表单异常排查与修复》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

WooCommerce 自定义内页结账表单中购物车状态异常的排查与修复

本文旨在解决WooCommerce自定义内页结账表单在非预览模式下购物车显示为空的问题。核心在于确保WooCommerce购物车会话数据在自定义环境中被正确加载。通过在购物车操作前调用wc_load_cart()函数,可以强制加载并同步当前会话的购物车数据,从而避免因会话未初始化或数据不同步导致的“购物车为空”错误,确保订单能正常处理。

问题描述与技术背景

在开发WordPress网站上集成的WooCommerce自定义内页结账表单时,开发者可能会遇到一个独特的挑战:当用户在产品页面直接填写表单并尝试支付时,系统在预览模式下能正常处理订单,但在非预览模式下(例如在新的浏览器窗口或设备上访问)却会跳转到“购物车为空”页面,导致订单无法生成。

这种现象通常发生在自定义的结账流程中,尤其是当页面不完全遵循WooCommerce标准模板加载机制时。WooCommerce依赖于其内部会话(session)机制来维护用户的购物车状态。在标准的WooCommerce页面加载流程中,购物车会话数据通常会被自动初始化和加载。然而,在高度定制化的页面或插件中,如果缺少必要的初始化步骤,购物车对象可能无法正确地从用户会话中读取其当前状态,从而导致即使已经通过代码添加了商品,前端依然显示购物车为空。预览模式可能由于WordPress或WooCommerce的调试/开发环境配置,隐式地完成了部分会话初始化,从而掩盖了这一问题。

解决方案:强制加载购物车会话

解决此问题的关键在于确保在执行任何购物车操作(如清空购物车或添加商品)之前,WooCommerce的购物车对象已从当前用户会话中加载了最新的数据。WooCommerce提供了一个专门用于此目的的函数:wc_load_cart()。

wc_load_cart() 函数的作用是显式地加载并初始化WooCommerce的购物车会话数据。当在自定义代码中直接操作 WC()->cart 对象时,如果当前请求的会话尚未完全加载购物车信息,那么对购物车进行的任何操作都可能基于一个空或过时的状态。通过在操作前调用 wc_load_cart(),可以强制系统从会话中检索并填充购物车数据,确保后续操作的准确性。

实现步骤与示例代码

在您的自定义内页结账表单的PHP代码中,找到您执行购物车清空和添加商品操作的部分。通常,这会是类似 WC()->cart->empty_cart(); 和 WC()->cart->add_to_cart(...); 的代码行。

原始代码片段(可能存在问题):

// ... 其他代码 ...

WC()->cart->empty_cart();
WC()->cart->add_to_cart($productId, 1, $initialVariation['id']);

// ... 其他代码 ...

修改后的代码片段(添加 wc_load_cart()):

在 WC()->cart->empty_cart(); 之前,添加一行 wc_load_cart();。

<?php // In page checkout form
setlocale(LC_TIME, "it_IT");

$productId = $GLOBALS['inpage_form_product'];
$options = $GLOBALS['inpage_form_options'];

wp_enqueue_style('inpage-form', get_template_directory_uri() . ($options['inpage_form_style'] ?? '/inpage-form.css'));
wp_enqueue_script('inpage-form', get_template_directory_uri() . '/assets/js/inpage-form.js');

$product = wc_get_product($productId);
$variations = $product->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('<div class="inpage-form__delivery_payment">');
    printf('<div class="inpage-form__delivery_payment__wrapper">');
    printf('<div>');
    printf('<div class="inpage-form__delivery_payment__title">Oggi non paghi niente!</div>');
    printf('<div class="inpage-form__delivery_payment__description">Paghi alla consegna ?</div>');
    printf('</div>');
    printf('
    <svg enable-background="new 0 0 24 24" height="512" viewbox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m19 4.86-8.991 4.383-3.501-1.701-1.458-.711-4.05-1.971 8.991-4.374 3.834 1.864 1.53.738z" fill="#ffa726"></path><path d="m9.99 19.779-9.49-4.939v-9.48l9.49 4.37z" fill="#ffcc80"></path><path d="m19.5 5.36v9.48l-9.49 4.939v-10.049z" fill="#ffb74d"></path><path d="m17.5 23.4c-.142 0-.283-.044-.403-.133-.558-.415-5.447-4.141-5.447-7.302 0-1.855 1.514-3.364 3.375-3.364.957 0 1.848.401 2.475 1.074.627-.673 1.518-1.074 2.475-1.074 1.861 0 3.375 1.509 3.375 3.364 0 3.161-4.89 6.888-5.447 7.302-.12.089-.261.133-.403.133z" fill="#f44336"></path><path d="m17.5 24c-.157 0-.314-.05-.447-.148-.62-.46-6.053-4.601-6.053-8.114 0-2.061 1.682-3.738 3.75-3.738 1.063 0 2.054.446 2.75 1.194.696-.748 1.687-1.194 2.75-1.194 2.068 0 3.75 1.677 3.75 3.738 0 3.513-5.433 7.653-6.053 8.113-.133.099-.29.149-.447.149zm-2.75-10.5c-1.241 0-2.25 1.004-2.25 2.238 0 2.142 3.276 5.191 5 6.564 1.724-1.374 5-4.427 5-6.564 0-1.234-1.009-2.238-2.25-2.238-.897 0-1.707.527-2.062 1.343-.238.547-1.137.547-1.375 0-.356-.816-1.166-1.343-2.063-1.343z"></path><path d="m10.007 10.5c-.278 0-.545-.155-.675-.422-.181-.372-.026-.821.346-1.002l9.244-4.5c.234-.114.507-.099.726.039.219.136.352.377.352.635v4c0 .414-.336.75-.75.75s-.75-.336-.75-.75v-2.801l-8.166 3.975c-.105.052-.217.076-.327.076z"></path><path d="m9.25 20c-.125 0-.25-.03-.366-.096l-8.5-4.75c-.237-.132-.384-.383-.384-.654v-9.25c0-.258.133-.499.353-.636.218-.138.493-.153.726-.039l9.244 4.5c.373.181.527.63.346 1.002-.182.373-.632.525-1.002.346l-8.167-3.974v7.61l8.116 4.536c.362.201.491.658.289 1.021-.137.245-.393.384-.655.384z"></path><path d="m.75 6c-.277 0-.544-.155-.674-.422-.181-.372-.026-.821.346-1.002l9.244-4.5c.207-.101.449-.101.656 0l9.256 4.5c.373.181.527.63.346 1.002s-.629.529-1.002.346l-8.928-4.34-8.916 4.34c-.105.052-.217.076-.328.076z"></path><path d="m5.25 11.99c-.414 0-.75-.336-.75-.75v-3.8c0-.283.16-.542.413-.67l9.09-4.581c.369-.186.82-.038 1.007.333.186.37.038.821-.333 1.007l-8.677 4.373v3.338c0 .414-.336.75-.75.75z"></path></svg>');
    printf('</div>');
    printf('</div>');
}

add_action('woocommerce_review_order_before_submit', 'add_delivery_payment_info');

?>
<div class="inpage-form" data-product-id="<?php echo $productId; ?>">
    <div class="inpage-form__form-card">
        <h4>Modulo d’ordine</h4>
        <div class="inpage-form__total">
            <span class="inpage-form__regular-price"><?php formatPrice($initialVariation['regular_price']); ?></span>
            <span class="inpage-form__price"><?php formatPrice($initialVariation['price']); ?></span>
        </div>
        </div></div>
Golang千万级并发如何实现?epoll与调度器解析Golang千万级并发如何实现?epoll与调度器解析
上一篇
Golang千万级并发如何实现?epoll与调度器解析
HTML5decoding属性优化图片加载性能
下一篇
HTML5decoding属性优化图片加载性能
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • AI边界平台:智能对话、写作、画图,一站式解决方案
    边界AI平台
    探索AI边界平台,领先的智能AI对话、写作与画图生成工具。高效便捷,满足多样化需求。立即体验!
    425次使用
  • 讯飞AI大学堂免费AI认证证书:大模型工程师认证,提升您的职场竞争力
    免费AI认证证书
    科大讯飞AI大学堂推出免费大模型工程师认证,助力您掌握AI技能,提升职场竞争力。体系化学习,实战项目,权威认证,助您成为企业级大模型应用人才。
    428次使用
  • 茅茅虫AIGC检测:精准识别AI生成内容,保障学术诚信
    茅茅虫AIGC检测
    茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
    565次使用
  • 赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新
    赛林匹克平台(Challympics)
    探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
    668次使用
  • SEO  笔格AIPPT:AI智能PPT制作,免费生成,高效演示
    笔格AIPPT
    SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
    577次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码