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

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

本文深入探讨了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): ?>
    <li class="inpage-form__option "> <input type="radio" name="quantity" id="option-" value="" data-regular-price="" data-price="" /> <div class="inpage-form__option-top" >
<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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月10日 06:50:27
下一篇 2025年12月8日 02:26:52

相关推荐

  • PHP怎样处理多语言编码 PHP多语言编码转换实战教程

    php处理多语言编码的核心在于确保数据在存储、传输和处理过程中使用一致的编码。1. 数据存储方面,推荐统一使用utf-8编码,并在数据库连接时设置编码为utf-8,如mysql中使用set names utf8;2. http头设置方面,在php脚本开头使用header(‘content…

    2025年12月10日 好文分享
    000
  • PHP怎样获取网页HTML PHP抓取网页内容的3种高效方式分享

    php获取网页html内容主要有以下几种方式:1.file_get_contents()函数,优点是简单易用,代码量少,缺点是功能有限,无法设置请求头、超时时间等,容易被反爬虫机制拦截;2.curl扩展,功能强大,可以设置各种http选项,支持https,但代码相对复杂且需要安装curl扩展;3.g…

    2025年12月10日 好文分享
    000
  • PHP中的SOAP:如何调用Web服务接口

    php中调用web服务接口需启用soap扩展、获取wsdl文件、创建soap客户端、调用方法并处理结果。1. 确认php.ini中extension=soap未被注释,重启服务器;2. 从服务提供方获取wsdl文件url;3. 使用soapclient类实例化客户端并传入wsdl;4. 调用服务方法…

    2025年12月10日 好文分享
    000
  • PHP中header和setcookie的设置差异

    header()用于发送任意http标头,如重定向、设置内容类型、缓存控制等;setcookie()专用于设置cookie。1.header()可实现页面重定向、指定内容类型、控制缓存、设置状态码等;2.setcookie()用于存储客户端数据,需指定名称、值、过期时间、路径、域等参数;3.两者都必…

    2025年12月10日 好文分享
    000
  • PHP 中实现连续重定向:先跳转感谢页,再跳转 API 返回地址

    本文将介绍如何在 PHP 中实现两次连续重定向,即用户提交表单后,先跳转到感谢页面,等待一段时间后再自动跳转到 API 返回的地址。通过将重定向逻辑拆分到不同的页面,可以有效解决在同一 PHP 脚本中连续使用 header() 函数进行重定向的问题。 实现连续重定向的步骤 在 PHP 中直接使用多个…

    2025年12月10日
    000
  • MySQL数据插入错误排查:PHP解决方案

    mysql数据插入失败的原因通常包括数据类型不匹配、唯一性约束冲突、字段长度超限、权限不足等。1.首先查看mysql返回的错误信息,明确具体问题所在;2.检查php代码中sql语句构建是否正确,推荐使用预处理语句防止注入并提升可维护性;3.验证前端输入数据,使用filter_var和password…

    2025年12月10日 好文分享
    000
  • 使用 PHP 在 HTML 页面中执行 Shell 脚本

    本文档旨在指导开发者如何使用 PHP 在 HTML 页面中执行 Shell 脚本。我们将通过一个简单的示例,讲解如何配置 HTML 表单、PHP 脚本和 Shell 脚本,以及如何处理路径问题和调试潜在的错误。通过学习本文,你将能够掌握在 Web 环境中安全可靠地执行系统命令的基本方法。 概述 在 …

    2025年12月10日
    000
  • PHP怎样处理SAML元数据 处理SAML元数据的6个核心技巧

    处理saml元数据的方法包括解析、验证、存储和使用,确保安全交互。1. 安全解析:使用php的domdocument类并禁用外部实体加载防止xxe攻击;2. 验证签名:利用xmlseclibs库验证xml签名确保来源可信;3. 限制元素:仅允许预期的saml元素和属性提升安全性;4. 转义输出:防范…

    2025年12月10日 好文分享
    000
  • PHP中的文件压缩:如何生成ZIP文件

    php生成zip文件的核心方法是使用ziparchive类。首先确保启用ziparchive扩展,linux下用sudo apt-get install php-zip或sudo yum install php-zip安装,windows则在php.ini中取消extension=zip注释。接着创…

    2025年12月10日 好文分享
    000
  • PHP如何获取摄像头画面 PHP捕获摄像头画面技巧分享

    php本身无法直接获取摄像头画面,因为它是服务器端语言,而摄像头是客户端硬件。1. 解决方案需前端javascript使用getusermedia api获取摄像头画面;2. 将画面绘制到canvas并转换为base64字符串;3. 通过fetch api将数据post到php后端;4. php接收…

    2025年12月10日 好文分享
    000
  • PHP怎么解析JSON数据 PHP处理JSON数据的完整技巧解析

    php解析json数据的核心方法是使用json_decode()函数,它能将json字符串转换为php数组或对象。具体步骤包括:1. 使用json_decode()解码json字符串,通过设置第二个参数为true返回数组形式;2. 利用json_encode()将php变量编码为json字符串,并可…

    2025年12月10日 好文分享
    000
  • PHP中的API文档:如何使用OpenAPI规范生成文档

    使用openapi规范生成php api文档的核心方法包括:1.选择合适工具,如swagger ui、swagger editor及zircote/swagger-php等;2.编写openapi规范文件,定义api基本信息、端点、参数、响应和数据模型;3.可选地通过代码注释生成规范文件,利用工具扫…

    2025年12月10日 好文分享
    000
  • PHP路由解析:自定义URL处理器

    要自定义php的url处理器,需通过拦截请求、解析url并调用对应控制器和方法。具体步骤如下:1. 创建.htaccess文件,启用rewriteengine并将请求重定向到index.php;2. 编写index.php作为入口文件,获取并解析url参数,确定控制器、方法及参数并调用;3. 创建控…

    2025年12月10日 好文分享
    000
  • PHP中的XSS防护:如何过滤恶意脚本输入

    php中如何有效防止xss攻击?1. 输入验证与过滤:使用filter_var()函数对用户输入进行验证和清理,例如验证邮箱格式;2. 输出转义:使用htmlspecialchars()函数将特殊字符转义为html实体,确保输出安全;3. 使用模板引擎:如twig、blade自动处理变量转义;4. …

    2025年12月10日 好文分享
    000
  • PHP性能优化:提升代码执行效率

    php性能优化的核心在于提升代码执行效率与资源利用率。主要策略包括:1.减少数据库查询次数,通过缓存(如memcached、redis)、索引优化、连接池及读写分离等方式降低数据库负载;2.使用zend opcache实现opcode缓存,避免重复编译php代码,配置参数启用并调优缓存机制;3.在代…

    2025年12月10日 好文分享
    000
  • PHP加密解密:OpenSSL使用指南

    php中使用openssl进行加密解密,关键在于理解算法、密钥管理及填充模式。1. 使用aes-256-cbc等安全算法进行加密解密;2. 生成随机密钥并避免硬编码,推荐使用kms或环境变量存储;3. 每次加密使用唯一iv以增强安全性;4. 加密数据通常base64编码便于传输;5. 安全措施包括正…

    2025年12月10日 好文分享
    000
  • PHP消息队列:RabbitMQ实战

    php结合rabbitmq构建异步处理系统需安装rabbitmq和amqp扩展1,通过amqp类连接服务器2,声明交换机和队列并绑定路由键3,使用publish方法发布消息4,利用consume消费消息并调用ack确认5,为避免消息丢失应启用持久化、发布者确认或事务机制6,可通过rabbitmq m…

    2025年12月10日 好文分享
    000
  • PHP如何实现用户登录 PHP用户登录的完整安全方案

    防止php用户登录被sql注入攻击的核心方法是使用预处理语句和参数绑定。1. 使用预处理语句(prepared statements)和参数绑定(parameter binding),将sql查询结构与数据分离,确保用户输入不会被执行为恶意代码;2. 在必要情况下对输入进行过滤和转义,如htmlsp…

    2025年12月10日 好文分享
    000
  • PHP中htmlentities和htmlspecialchars的差异

    htmlspecialchars 和 htmlentities 的主要区别在于转义范围。1. htmlspecialchars 仅转义 html 中具有特殊含义的字符(如 、&、’、”),主要用于防止 xss 攻击,保持文本可读性;2. htmlentities 则会…

    2025年12月10日 好文分享
    000
  • PHP如何调试代码错误 PHP调试的5个实用技巧分享

    要快速定位php错误需开启错误报告并读取信息。1. 使用error_reporting(e_all)和ini_set(‘display_errors’, 1)显示所有错误;2. 利用var_dump()和print_r()检查变量值与类型;3. 安装xdebug扩展配合ide…

    2025年12月10日 好文分享
    000

发表回复

登录后才能评论
关注微信