结帐前更改购物车商品订阅属性值

2023-12-24

这可能是一个菜鸟问题,所以提前道歉。

我有可变的订阅产品,其价格因订阅长度而异。我还有 subscription_length = 0 的简单订阅。当购物车包含这两种类型时,Woocommerce 订阅会创建两个订阅。

我正在尝试修改购物车中所有商品的 subscription_length 元数据,以匹配购物车中的最长长度,因此只会创建一个订阅。

我似乎找不到更新购物车的正确方法。这可能只是人类愚蠢的 PHP 技巧。

这是该声明的最新版本,目前不起作用:

$cart[$item_key]['data']->subscription_length = $maxlength;

我已经尝试了十几个或更多的主题变体来更新 $cart 数据。有些失败,有些成功,但 $cart 中的数据没有改变。

function csi_align_subscription_length() {
    $maxlength = 0;
    $cart = WC()->cart->get_cart();

    //find the longest length
    foreach ( $cart as $item_key => $item ){
        if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
            $length = WC_Subscriptions_Product::get_length( $item['data'] );
            $maxlength = ($length > $maxlength) ?  $length : $maxlength ;   //get the longest length
        }
    }   

    //set all subscription lengths to the longest lengths
    foreach ( $cart as $item_key => $item ){
        if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
            echo '<pre>';
            echo "cart-item before: ". var_dump($cart[$item_key]);
            $cart[$item_key]['data']->subscription_length = $maxlength;
            echo "cart-item after:  ".var_dump($cart[$item_key]);
            echo '</pre>';
        }
    }   
    WC()->cart->set_cart_contents($cart);
}
add_filter( 'woocommerce_subscription_cart_before_grouping', 'csi_align_subscription_length', 10, 1 );

我只需要让购物车中的订阅与公共组保持一致,这样每次结帐时我只有 1 个订单和 1 个订阅。如果我偏离了切线,我愿意接受不同的方法。


终于解决了问题。没有“subscription_length”的设置器。必须使用 update_meta_data 方法。元键是“_subscription_length”。以下代码有效。

function csi_align_subscription_length( $cart ) {
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) )  )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $maxlength = (float) 0;

    // Find the longest subscription length
    foreach ( $cart->get_cart() as $cart_item ){
        if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {
            $length = (float) WC_Subscriptions_Product::get_length( $cart_item['data'] );
            $maxlength = ($length > $maxlength) ?  $length : $maxlength ;   //get the longest length
        }
    } 

    // set the subscription length for everything in the cart
    foreach ( $cart->get_cart() as $item_key => $cart_item ){
        if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' )) {
            $cart_item['data']->update_meta_data( '_subscription_length', $maxlength );
        }
    }
}

add_action( 'woocommerce_before_calculate_totals', 'csi_align_subscription_length', 5, 1 );

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结帐前更改购物车商品订阅属性值 的相关文章

随机推荐

  • 如何在 alpine 中使用最新版本的 chromium 驱动程序

    我们使用 Alpine 作为运行 watir 测试的 docker 容器 我想使用较新的版本 例如 chromium75 0 3770 8 和 chromium chromedriver75 0 3770 8 但 Alpine 最新版本是
  • 从 Silverlight 调用 Javascript 函数

    我正在尝试从 silverlight 控件调用 javascript 函数 在我们的代码中 我试图通过以下方式调用该函数 HtmlPage Window Invoke showPopup new string http www exampl
  • 如何按日期对 SVN LS -R 输出进行排序

    我想列出 svn 中的所有文件 按上次提交日期排序 svn ls Rv列出所有文件 但不接受 t转变 有谁知道如何做到这一点 我看过一个答案类似的问题 https stackoverflow com questions 22235391 s
  • 如何对管道中的布尔值取反?

    考虑以下代码 defmodule T do def does not contain s t do s gt not String contains t end end 这会在编译时出现以下错误 CompileError iex 3 und
  • 屏幕关闭/锁定后手机振动停止工作

    我有一项服务可以检查我的网站上的更新 我希望它能够在发现更新时引起振动 即使屏幕关闭或锁定也是如此 目前 振动仅在屏幕未关闭 锁定时起作用 即使屏幕关闭 锁定 所有其他功能也可以工作 Vibrator vibrator Vibrator g
  • 如何在 perl 中将字符串转换为文件句柄?

    我有一根非常大的绳子 s dfasdfasdfafd 近百万字 我想将其转换为文件句柄 使其看起来像是从文件中读取的字符串 但我不想将其存储到临时文件中并读取它 有人可以给我一些建议吗 打开对字符串的引用 use strict use wa
  • 我可以在 HTML 文件正文中放置 标记以通过电子邮件发送吗?

    由于许多电子邮件客户端忽略 HEAD 标签 我可以在正文中嵌入内联样式表吗 最简洁的答案是不 Gmail 会删除标签及其内容 Hotmail 雅虎 邮件和 Windows Live Mail 不会删除正文元素中的样式标签 但看看适用于 HT
  • 使用 ptrace 提取系统调用名称和参数

    我正在做一项必须执行的任务strace喜欢使用功能ptrace 到目前为止 我已经找到了如何提取系统调用号和返回值 如下所示 In parent process struct user regs struct regs ptrace PTR
  • Python:编译源代码中的导入错误

    我在运行编译的源代码时遇到问题 代码本身是正确的 如果我运行python file py一切顺利 如果我用 pyinstaller 或类似的软件编译它 然后运行它说的编译文件ImportError No module named cffi
  • 撤消从错误的 github 存储库中拉取的操作

    我刚刚从 github 拉取 然后从错误的 github 存储库拉取到我的项目中 我该如何撤消这个操作 Thanks git reset hard HEAD 此命令将您的分支重置为上一个提交 即合并提交之前的提交 这是您要撤消的提交 您的工
  • 作为 std::initializer_list 对象的抽象类

    为了有更清晰的语法 我想使用std 初始化列表将对象列表发送到构造函数 然而 这些对象是抽象的 这会导致一个问题 在 VS 2013 中 它丢失了 vfptr 引用 给出了 R6025 纯虚函数调用 运行时错误 在 g 中它抱怨它 无法分配
  • WordPress 多语言插件 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在 WordPress 上有一个博客 需要在其中提供多种不同语言的内容 我不想翻译这些文章 我只想每
  • PyTorch Lightning:同一 Tensorboard 图中的多个标量(例如训练和有效损失)

    使用 PyTorch Tensorboard 我可以在单个 Tensorboard 图中记录我的训练和有效损失 如下所示 writer torch utils tensorboard SummaryWriter for i in range
  • CDK 将映射模板添加到 LambdaIntegration

    我有一个 Lambda 函数 可以通过 api 网关访问 如何让 CDK 添加映射模板 如下屏幕截图所示 我尝试了多种变体 const restApi new apigateway LambdaRestApi this dyndns api
  • JPanel 对 KeyBindings 没有反应

    我正在开发一个需要 JPanel 对按下的转义键做出反应的应用程序 我很确定我使用了正确的方法将键绑定注册到组件 但显然我仍然做错了一些事情 这是负责注册对上述键绑定做出反应的代码 private void initializeKeyBin
  • 如何更改javafx中任务栏上的默认java徽标exe图标?

    我在 Netbeans 上制作了一个 JavaFX 应用程序 并放置了用于将图标设置到窗口的代码 primaryStage getIcons add new Image file sicadcam png 当我从 Netbeans 运行该项
  • 使用 Google 图表动态数据

    我需要使用动态数据绘制我的 Google 图表 因此我将其存储在变量中 var rowData v Mike f Mike The President v Jim f Jim Vice President Mike VP Alice Mik
  • 这个算法/​​例程的名称是什么?

    我正在编写一个实用程序类 它将字符串从一种字母表转换为另一种字母表 这在您希望使用目标字母表且限制可用字符数的情况下非常有用 例如 如果您可以使用小写字母和数字 但只能使用 12 个字符 则可以压缩字母表中的时间戳01234567989 i
  • 为什么辅助图块的标识符无效?

    我正在尝试使用 XML 直接更新 Windows 8 辅助磁贴 但是 我不断收到一个异常 即我固定的图块的标识符无效 我什至尝试直接从 Windows 中提取标识符 然后将其替换回CreateTileUpdaterForSecondaryT
  • 结帐前更改购物车商品订阅属性值

    这可能是一个菜鸟问题 所以提前道歉 我有可变的订阅产品 其价格因订阅长度而异 我还有 subscription length 0 的简单订阅 当购物车包含这两种类型时 Woocommerce 订阅会创建两个订阅 我正在尝试修改购物车中所有商