0

0

解决WooCommerce自定义结账表单在非预览模式下购物车为空的问题

DDD

DDD

发布时间:2025-07-01 15:28:05

|

814人浏览过

|

来源于php中文网

原创

解决woocommerce自定义结账表单在非预览模式下购物车为空的问题

本文深入探讨了WooCommerce自定义页面结账表单在预览模式下正常工作,但在常规访问时显示“购物车为空”的常见问题。核心原因在于WooCommerce购物车会话未被正确加载和初始化。教程将详细介绍如何通过在代码中引入 wc_load_cart() 函数来确保购物车会话的正确加载,从而解决此问题,并提供完整的代码示例及开发注意事项,帮助开发者构建稳定可靠的自定义结账流程。

理解问题根源

在WordPress和WooCommerce环境中,当开发者构建自定义的“页内结账”表单,允许用户直接在产品页面完成支付而无需跳转到购物车页面时,可能会遇到一个奇怪的现象:表单在WordPress的预览模式下运行良好,订单可以正常处理并支付;然而,一旦在新的浏览器窗口、不同的浏览器或移动设备上访问同一页面,点击确认订单按钮后却被重定向到“您的购物车当前为空”的页面,且订单未被处理。

这个问题的核心在于WooCommerce的会话管理机制。在某些特定的加载上下文中(例如WordPress的预览模式),WooCommerce的购物车会话可能已被隐式加载。但在常规的页面请求中,如果自定义代码在操作购物车之前没有明确地初始化或加载购物车会话,那么对 WC()->cart 对象的任何操作(如 empty_cart() 或 add_to_cart())都可能在一个未完全准备好的购物车实例上进行,导致购物车状态无法正确保存或识别,最终表现为“购物车为空”。

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

解决此问题的关键在于确保在尝试修改购物车内容之前,WooCommerce的购物车会话已被完全加载。WooCommerce提供了一个专门的函数 wc_load_cart() 来实现这一目的。

AITDK
AITDK

免费AI SEO工具,SEO的AI生成器

下载

通过在对购物车进行任何操作(例如清空购物车或添加商品)之前调用 wc_load_cart(),可以强制WooCommerce从会话中加载当前的购物车状态,从而保证后续的购物车操作能够正确地作用于持久化的购物车数据。

代码实现

以下是修改后的自定义结账表单PHP代码,其中关键的改动是添加了 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 d="m9.99 19.779-9.49-4.939v-9.48l9.49 4.37z" fill="#ffcc80"/><path d="m19.5 5.36v9.48l-9.49 4.939v-10.049z" fill="#ffb74d"/><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 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 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 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 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 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"/></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>
        <?php if(count($variations) > 1): ?>
        <ul class="inpage-form__options">
            <?php foreach ($variations as $variation) :
                $singlePrice = $variation['price'] / (float) $variation['quantity'];
            ?>
                <li class="inpage-form__option <?php echo $variation['highlight'] ? 'inpage-form__option-highlight' : ''; ?>">
                    <input
                            type="radio"
                            name="quantity"
                            id="option-<?php echo $variation['id']; ?>" value="<?php echo $variation['id']; ?>"
                            data-regular-price="<?php echo $variation['regular_price']; ?>"
                            data-price="<?php echo $variation['price']; ?>"
                    />
                    <?php if ($variation['highlight']) { ?>
                        <div class="inpage-form__option-top" <?php echo $variation['highlight_color'] ? 'style="background-color:'. $variation['highlight_color'].'"' : ''; ?>>
                            <?php echo $variation['highlight']; ?>
                        </div>
                    <?php } ?>
                    <label for="option-<?php echo $variation['id']; ?>">
                        <span class="inpage-form__quantity"><?php echo $variation['quantity']; ?><small>x</small></span>
                        <span class="inpage-form__option-main">
                        <span class="inpage-form__single-price"><?php formatPrice($singlePrice); ?></span>
                        <span class="inpage-form__quantity-info">a pezzo</span>
                    </span>
                    </label>
                </li>
            <?php endforeach; ?>
        </ul>
        <?php endif; ?>
        <div class="inpage-form__checkout">
            <form name="checkout" method="post" class="checkout woocommerce-checkout"
                  action="<?php echo esc_url(wc_get_checkout_url()); ?>" enctype="multipart/form-data">

                <div class="woocommerce-billing-fields__field-wrapper">
                    <p class="form-row form-row-wide validate-required validate-email" id="billing_email_field"
                       data-priority="110">
                        <input type="email" class="input-text" name="billing_email" id="billing_email"
                               placeholder="Indirizzo email " value="" autocomplete="email username"/>
                        <label for="billing_email" class="">Indirizzo email</label>
                    </p>
                    <p class="form-row form-row-wide validate-required validate-phone" id="billing_phone_field"
                       data-priority="100">
                        <input type="tel" class="input-text "
                               name="billing_phone" id="billing_phone"
                               placeholder="Telefono" value=""
                               autocomplete="tel"/>
                        <label for="billing_phone" class="">Telefono</label>
                    </p>
                    <div class="inpage-form__form-row-online">
                        <p class="form-row form-row-first validate-required" id="billing_first_name_field"
                           data-priority="10">
                            <input type="text" class="input-text " name="billing_first_name" id="billing_first_name"
                                   placeholder="Nome" value="" autocomplete="given-name"/>
                            <label for="billing_first_name" class="">Nome</label>
                        </p>
                        <p class="form-row form-row-last validate-required" id="billing_last_name_field"
                           data-priority="20">
                            <input type="text" class="input-text " name="billing_last_name" id="billing_last_name"
                                   placeholder="Cognome" value="" autocomplete="family-name"/>
                            <label for="billing_last_name" class="">Cognome</label>
                        </p>
                    </div>
                </div> 

                <?php
                    if($options['insurance_product'] ?? false) :
                      $insuranceProduct = wc_get_product($options['insurance_product']);
                    ?>
                    <label class="inpage-form__insurance inpage-form__extras" data-product-id="<?php echo $options['insurance_product']; ?>">
                        <svg id="color" 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="m23.491 1.826-5.25-1.786c-.156-.054-.326-.054-.482 0l-5.25 1.786c-.305.103-.509.388-.509.71v4.018c0 4.904 5.474 7.288 5.707 7.387.094.039.193.059.293.059s.199-.02.293-.06c.233-.099 5.707-2.482 5.707-7.386v-4.018c0-.322-.204-.607-.509-.71z" fill="#4caf50"/><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.

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
wordpress seo
wordpress seo

WordPress网站SEO优化方法有:1、选择一个SEO友好的主题,具有清晰的代码结构,快速的加载速度和响应式设计;2、使用SEO插件,优化你的标题标签,元描述,关键字,XML站点地图等;3、优化你的内容,内容是SEO优化的核心;4、优化你的网站速度;5、创建友好的URL;6、使用内部链接;7、优化图像;8、使用社交媒体;9、定期更新你的网站;10、监控和分析你的网站等等。

435

2023.09.18

wordpress下载后怎么安装
wordpress下载后怎么安装

安装前准备:确保服务器满足要求、获取安装文件、创建数据库。上传 wordpress 文件。创建数据库和用户。运行安装程序:选择语言、输入数据库信息、网站标题和管理员信息。安装 wordpress。安装后配置:设置永久链接、安装主题、安装插件、创建内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.04.15

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十三期_前端开发
第二十三期_前端开发

共98课时 | 8.4万人学习

WordPress视频教程
WordPress视频教程

共23课时 | 9.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号