以编程方式向 Woocommerce 3.2+ 中的订单添加折扣

2024-01-12

在 woocommerce 中,我们可以使用优惠券功能为任何订单添加折扣(固定金额、百分比金额……)。

是否可以以编程方式向任何订单添加折扣金额,其中折扣金额可以是任意金额?

任何帮助将不胜感激。


以编程方式为订单提供折扣的唯一可用功能,正在欺骗Fee API. 作为信息,woocommerce 不推荐此技巧,但是被很多人使用因为 Woocommerce 中除优惠券外没有折扣功能。

以下功能将允许您进行任意金额的固定折扣或百分比折扣。订单需要存在(之前要保存).

功能代码(适用于 Woocommerce 版本 3.2+):

/**
 * Add a discount to an Orders programmatically
 * (Using the FEE API - A negative fee)
 *
 * @since  3.2.0
 * @param  int     $order_id  The order ID. Required.
 * @param  string  $title  The label name for the discount. Required.
 * @param  mixed   $amount  Fixed amount (float) or percentage based on the subtotal. Required.
 * @param  string  $tax_class  The tax Class. '' by default. Optional.
 */
function wc_order_add_discount( $order_id, $title, $amount, $tax_class = '' ) {
    $order    = wc_get_order($order_id);
    $subtotal = $order->get_subtotal();
    $item     = new WC_Order_Item_Fee();

    if ( strpos($amount, '%') !== false ) {
        $percentage = (float) str_replace( array('%', ' '), array('', ''), $amount );
        $percentage = $percentage > 100 ? -100 : -$percentage;
        $discount   = $percentage * $subtotal / 100;
    } else {
        $discount = (float) str_replace( ' ', '', $amount );
        $discount = $discount > $subtotal ? -$subtotal : -$discount;
    }

    $item->set_tax_class( $tax_class );
    $item->set_name( $title );
    $item->set_amount( $discount );
    $item->set_total( $discount );

    if ( '0' !== $item->get_tax_class() && 'taxable' === $item->get_tax_status() && wc_tax_enabled() ) {
        $tax_for   = array(
            'country'   => $order->get_shipping_country(),
            'state'     => $order->get_shipping_state(),
            'postcode'  => $order->get_shipping_postcode(),
            'city'      => $order->get_shipping_city(),
            'tax_class' => $item->get_tax_class(),
        );
        $tax_rates = WC_Tax::find_rates( $tax_for );
        $taxes     = WC_Tax::calc_tax( $item->get_total(), $tax_rates, false );
        print_pr($taxes);

        if ( method_exists( $item, 'get_subtotal' ) ) {
            $subtotal_taxes = WC_Tax::calc_tax( $item->get_subtotal(), $tax_rates, false );
            $item->set_taxes( array( 'total' => $taxes, 'subtotal' => $subtotal_taxes ) );
            $item->set_total_tax( array_sum($taxes) );
        } else {
            $item->set_taxes( array( 'total' => $taxes ) );
            $item->set_total_tax( array_sum($taxes) );
        }
        $has_taxes = true;
    } else {
        $item->set_taxes( false );
        $has_taxes = false;
    }
    $item->save();

    $order->add_item( $item );
    $order->calculate_totals( $has_taxes );
    $order->save();
}

代码位于活动子主题(活动主题)的 function.php 文件中。经过测试并有效。


用法示例:

1) 固定折扣 of $12(带有动态$order_id):

wc_order_add_discount( $order_id, __("Fixed discount"), 12 );

2) 百分比折扣 of 5%(带有动态$order_id):

wc_order_add_discount( $order_id, __("Discount (5%)"), '5%' );

金额(或百分比)也可以是动态变量......

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

以编程方式向 Woocommerce 3.2+ 中的订单添加折扣 的相关文章

  • 理想的 PHP 会话大小?

    我有一个 PHP 表单 抵押应用程序 大约有 400 个字段 该网站的流量会很低 对于进入 MySQL 数据库的 400 个字段 理想的会话大小是多少 In php ini我要设置什么 我应该设置我缺少的任何内容吗 会话的大小没有限制 但
  • 在Windows上安装php Composer时出现错误

    在安装 Composer 以使用 Laravel 框架时 我遇到了一些错误 Download failed file get contents SSL operation failed with code 1 OpenSSL Error m
  • 使用php在html页面中显示bbcode

    我已经有一个 bbcode 字符串 mybbcode b Hello word b 使用 php 我想在 html 页面中以 html 格式显示它 例如 div gt b hello word b div 基本上其他人已经对你说过了 但是如
  • Zend 如何使用 mod_rewrite 解析前端控制器中的 URL?

    我不明白 Zend Framework 如何控制路由 我实际上正在尝试创建自己的控制器 路由类 编写了与 Zend 建议的 htaccess 相同的代码 以重写位于网站根目录的index php RewriteEngine On Rewri
  • TCPDF / FPDI 可以接受 PDF 作为字符串吗?

    是否可以将 TCPDF 或 FPDI PDF 作为字符串提供 我有一个传入的 PDF 数组作为字符串 但无法写入磁盘 我在文档中找不到与此相关的任何内容 如果没有 是否有一种有效的方法来从内存或作为对象存储 读取这些 PDF 将它们喂给 F
  • 如何在 PHP 中将默认日期设置为波斯日期?

    如何在 PHP 中将默认日期设置为波斯日期 说吧 如果我echo这个功能date Y m d 然后它会显示2018 03 05但我想要1396 12 14波斯日期 请检查 http php net manual en intldatefor
  • 打印一个模式以显示最多 5 行 5 列的数字,例如 5 4 3 2 1 和下一行 4 3 2 1 5 直到第 5 行

    这是一个正方形图案 每行有 5 列 共有 5 行 图案如下所示 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 我的代码如下以获得模式 但当计数器达到 1 并显示在相应的列值中时 我无法重
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • 根据类别 woocommerce 更改同一产品的默认变体值

    我正在研究一种根据其所属类别显示同一产品的默认变体值的方法 例如 我出售一张带有蓝色和红色选项的卡 当用户进入 一 类别时 我希望默认值为蓝色 如果他属于第二类 则该值将为红色 我发现了一个钩子woocommerce product def
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • MySQL 中布尔值的 TINYINT 与 ENUM(0, 1)

    MyISAM 表和 MySQL 5 1 中具有 0 和 1 值的 Tinyint 或 ENUM 0 1 哪个更好 您可以使用BIT 1 如中提到的MySQL 5 1 参考 http dev mysql com doc refman 5 1
  • phpstorm xdebug 与 symfony2 项目

    我正在尝试使用 xdebug 和 phpstorm 调试 symfony2 应用程序 我的本地开发环境是Ubuntu 14 04 with apache2 Xdebug版本是2 2 7 我在另一个 php 不是 symfony2 项目上使用
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • 使用 html5 分块上传文件

    我正在尝试使用 html5 的文件 API 分块上传文件 然后在服务器端用 php 重新组装它 我正在上传视频 但是当我在服务器端合并文件时 大小增加了 并且它变成了无效文件 请注意 以下 html5 代码仅适用于 chrome 浏览器 在
  • 表单提交后显示 $_FILES['image']

    提交表单后如何显示上传的图片 提交表单后 它将是一个预览页面 因此我不会在 MySQLet 中存储图像类型 BLOB 如何显示 FILES image
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • PHP 中的坏词过滤器?

    我正在用 PHP 编写一个坏词过滤器 我在数组中有一个坏词列表 方法 clean text 的写法如下 public static function cleanse text originalstring if self is sorted
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我

随机推荐

  • 在 Android 上检测显着的设备运动

    我一直在试图弄清楚如何制作一个应用程序来检测设备是否已被大量移动 而不仅仅是晃动 我试图检测至少一英尺的距离 阅读官方 Android 开发网站上的培训部分 我最好的猜测是我应该使用重大运动传感器 http developer androi
  • 显示 R 中汇总函数的所有条目?

    所以我有一个非常非常大的数组 当我对其运行摘要 var 时 如何才能看到所列出的内容之外的内容 即扩展 其他 位 这是一个示例输出 var foo1 5908364 foot 1419481 foop 1214379 billy 83301
  • C 语言中 x32 和 x64 的 LVM_GETITEMTEXT

    我一直在尝试在另一个进程中获取列表视图中的项目文本 我发现了一个很棒的教程代码项目 http www codeproject com KB threads int64 memsteal aspx 感谢这篇文章 我能够在 x32 上做到这一点
  • 固定元素如何仅使用 CSS 将内容推送到页面?

    我以前见过类似的问题 但答案通常包括 Jquery 等 我是菜鸟 我只想使用 CSS 我有一个网页 上面显示一段文字 p yes yes yes p p yes yes yes p p class move Moving part p 当屏
  • 获取 Flask 请求的引用 URL

    当用户访问我们的网站并注册时 我如何捕获他们来自哪个网站 无论是搜索 公关网站等 我不在乎他们访问了我们网站的哪个页面 我只想知道哪些营销活动为我们带来了最多的注册量 我知道 Google Analytics 可能可以做到这一点 但我也希望
  • 如何让手风琴区域扩展到(垂直)动态内容?

    我有一个主数据网格 然后在它下面有一个手风琴控件 在其中一个手风琴项目中 我有另一个数据网格 它绑定到第一个数据网格的选定项目 简单的xaml是
  • 通过 Django 使用 RESTful API

    我正在构建一个 Django 应用程序 需要与第三方 RESTful API 交互 对该资源进行各种 GET PUT 等 我正在寻找一种在 Django 中表示该 API 的好方法 最明显但可能不太优雅的解决方案似乎是创建一个模型 该模型具
  • 当 Iterator::map 返回 Result::Err 时,如何停止迭代并返回错误?

    我有一个函数返回一个Result fn find id Id gt Result
  • 使用 Selenium WebDriver 的 Spring Boot Web 应用程序

    我正在尝试了解 Spring Boot 但在尝试将 Selenium 集成到我的 Spring Boot 应用程序中时遇到了一些问题 我正在尝试实现一个简单的网页 其中有一个输入框和按钮 输入框将包含一个 URL 然后该按钮将启动一个 se
  • 将键值列分组为一行

    我正在尝试从在双列中存储键值对的 SQLite 表中提取数据 例如 用键foo bar man and row 该表将如下所示 id external id key value 1 12345 foo cow 2 12345 bar moo
  • 请对家庭版本控制系统提出建议

    我有一个真正需要纳入源代码管理的家庭项目 我尝试安装 Subversion 我对此有一些经验 但无法运行 我不是特别想使用 SourceSafe 我对 Git Mercury 有点紧张 因为它有点神秘 尽管这只是基于意见而不是我的经验 主要
  • 编译时浮动打包/双关

    我正在为 PIC32MX 编写 C 语言 使用 Microchip 的 PIC32 C 编译器 基于 GCC 3 4 进行编译 Added我遵循的标准是 GNU99 带有 GNU 扩展的 C99 编译器标志 std gnu99 我的问题是
  • Rails 助手无法在测试环境中工作

    我已按照以下网址提供的教程进行操作http railscasts com episodes 221 subdomains in rails 3 http railscasts com episodes 221 subdomains in r
  • 配置文件 WPF 控件实例化性能

    有没有一种好方法来测试实例化控件的性能 特别是在以下方面DataBinding and Templates表现 我想知道需要多少时间应用模板 and 初始化数据绑定 takes 我正在使用 WPF Performance Suite 和 A
  • 将 UIView 绕其中心旋转几次

    我正在尝试旋转一些UIView围绕它的中心 所以简单的代码是这样的 伪代码 UIView beginAnimations crazyRotate context nil UIView setAnimationDuration 1 0 som
  • 如何在 Python 中让用户选择要更新的键,然后选择新值来更新字典值?

    我正在尝试编写一个程序 我和我的兄弟可以输入和编辑足球比赛名单中的信息 以比较球队和管理球员等 这是我尝试过的第一个 大 项目 我在字典中有一个嵌套字典 我可以让用户创建字典等 但是当我尝试让 用户 通过 raw input 返回编辑它们时
  • Kubernetes:minikube 持久卷本地文件系统存储位置

    我已经阅读了所有文档和一些 SO 帖子 但找不到这个问题的答案 minikube 将其持久卷保存在我的本地 Mac 文件系统中的什么位置 Thanks 首先请记住 Kubernetes 运行在Minikube https minikube
  • NodeJS Express req.session 未定义

    就是想不通这个 我发现的关于快速会话的所有内容都表明它确实有效 但对我来说并非如此 我的整个应用程序配置 app configure gt app set port process env PORT 3000 app set views p
  • 通过同级子视图传播触摸事件?

    我有一堆子视图 它们都有用户交互部分 子级 并且全屏 问题是 如果我触及堆栈顶部的非交互式部分 它不会将该触摸传播到堆栈的其余部分 我的设置 视图A view B 全屏容器 本身不是交互式的 但具有交互式子视图 视图B1 互动 查看B2 互
  • 以编程方式向 Woocommerce 3.2+ 中的订单添加折扣

    在 woocommerce 中 我们可以使用优惠券功能为任何订单添加折扣 固定金额 百分比金额 是否可以以编程方式向任何订单添加折扣金额 其中折扣金额可以是任意金额 任何帮助将不胜感激 以编程方式为订单提供折扣的唯一可用功能 正在欺骗Fee