WooCommerce 挂钩 woocommerce_cancelled_order

2024-04-22

再会,

这是我第一次使用 stackoverflow,很高兴认识大家。

不管怎样,我正在为 WooCommerce 编写一个插件,当订单取消时我会自动退款。当我在没有钩子的情况下在单独的文件中手动执行它时,我的代码工作正常,但是,使用我的钩子它似乎无法执行。我正在执行以下操作:

add_action('woocommerce_cancelled_order','change_status_to_refund', 10, 1);
function change_status_to_refund( $order_id ) {
wp_redirect( home_url() );
   $order = new WC_Order( $order_id );

if( 'refunded' == $order->get_status() ) {
     return false;
 }


if(!($order->is_paid())) {
    return false;
}


$noRefundLimit = 24 * 60; //in minutes until booking
$customer_orders = get_posts( array(
 'numberposts' => 1,
 'post_parent' => $order_id,
 'post_type'   => 'wc_booking', // WC orders post type
 'post_status' => 'paid, complete' // Only paid, completed bookings
 ) );
 $bookingId = current($customer_orders)->ID;

 $bookingStart = current(get_post_meta($bookingId, "_booking_start"));
 $time = (new DateTime($bookingStart, new 
 DateTimeZone("America/Los_Angeles")))->getTimestamp();
 $nowTime = (new DateTime())->getTimestamp();
 $difference = round(($time - $nowTime)/60);//in minutes

 if($difference >= $noRefundLimit) {
     $refundPercentage = 1; //how much will we give back? fraction of 1.
     // Get Items
     $order_items   = $order->get_items();

     // Refund Amount
       $refund_amount = 0;
     // Prepare line items which we are refunding
     $line_items = array();

     if ( $order_items ) {
       foreach( $order_items as $item_id => $item ) {
        $refund_amount += $item->get_total();
       }
     }
     $refund_amount = ($refund_amount * $refundPercentage);
     $refund_reason = "Order Cancelled";
     $refund = wc_create_refund( array(
       'amount'         => $refund_amount,
       'reason'         => $refund_reason,
       'order_id'       => $order_id,
       'line_items'     => $line_items,
       'refund_payment' => true
       ));

       var_dump($refund);

       $order->update_status('wc-refunded', 'Order Cancelled And Completely 
Refunded');
       $order->save();
}

我添加了第一个重定向行,其唯一目的是测试它是否重定向,但事实并非如此!知道为什么这个钩子没有触发吗?


感谢您的评论。看来 woocommerce_order_status_cancelled 钩子很好,但参数是 $order_id。经过大量的调试后,我得到以下结果:

add_action( 'woocommerce_order_status_cancelled', 'change_status_to_refund', 
21, 1 );
function change_status_to_refund( $order_id ) {

$order = new WC_Order( $order_id );      

$noRefundLimit = 24 * 60; //in minutes until booking

global $wpdb;
$querystr = "
SELECT $wpdb->posts.* 
FROM $wpdb->posts 
WHERE $wpdb->posts.post_parent = $order_id
";

$pageposts = $wpdb->get_results($querystr, OBJECT);

 $bookingId = current($pageposts)->ID;

 $bookingStart = current(get_post_meta($bookingId, "_booking_start"));
 $time = (new DateTime($bookingStart, new 
 DateTimeZone("America/Los_Angeles")))->getTimestamp();
 $nowTime = (new DateTime())->getTimestamp();
 $difference = round(($time - $nowTime)/60);//in minutes

 if($difference >= $noRefundLimit) {
     $refundPercentage = 1; //how much will we give back? fraction of 1.
     // Get Items
     $order_items   = $order->get_items();

     // Refund Amount
       $refund_amount = 0;
     // Prepare line items which we are refunding
     $line_items = array();

     if ( $order_items ) {
       foreach( $order_items as $item_id => $item ) {
        $refund_amount += $item->get_total();
       }
     }
     $refund_amount = ($refund_amount * $refundPercentage);
     $refund_reason = "Order Cancelled";
     $refund = wc_create_refund( array(
       'amount'         => $refund_amount,
       'reason'         => $refund_reason,
       'order_id'       => $order_id,
       'line_items'     => $line_items,
       'refund_payment' => true
       ));

       $order->update_status('wc-refunded', 'Order Cancelled And Completely 
        Refunded');
     }
}

我遇到了一些问题。即使订单已付款, $order->is_paid() 返回 false (我认为这是因为状态从已付款更改为已取消/退款),所以我的代码甚至没有达到那么远。然后 get_posts 没有按预期工作。我被迫使用$wpdb。之后我的代码就起作用了。

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

WooCommerce 挂钩 woocommerce_cancelled_order 的相关文章

  • 如何在 Python 中包含 PHP 脚本?

    我有一个 PHP 脚本 news generator php 当我包含它时 它会抓取一堆新闻项并打印它们 现在 我在我的网站 CGI 中使用 Python 当我使用 PHP 时 我在 新闻 页面上使用了这样的内容 为了简单起见 我删掉了这个
  • Smarty输出空白页

    已解决 模板文件错误 我有这样的 Smarty 设置 require once smarty Smarty class php smarty new Smarty smarty gt compile dir compile dir smar
  • 如何复制 ArrayIterator 以保留其当前迭代位置?

    因为这似乎是我必须做的才能达到这种效果 arr a gt first b gt second iter new ArrayIterator arr Do a bunch of iterations iter gt next new iter
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p
  • 如何解决此错误:属性 rel 的原始源值错误

    我正在尝试使用 w3c 验证我的网站 但出现错误 Bad value original source for attribute rel on element link The string original source is not a
  • PHP - 获取base64图像字符串解码并保存为jpg(生成空图像)

    嗨 我实际上是通过 ajax 发送一个 base64 图像字符串到一个 php 脚本 该脚本只是解码字符串并将内容保存为 jpg 文件 但结果是一张空图像 这怎么可能 PHP脚本 uploadedPhotos array photo 1 p
  • 如何将 HTML 转换为 Markdown?

    我有一个类似 stackoverflow 的网站 有一个文本区域 人们可以在其中写答案 我用这个 PHP 库 http parsedown org 转换降价 我的意思是我使用该函数来转换 italic to i italic i inclu
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 使用 php 在多维数组中按键排序[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中对多维数组进行排序 https stackoverflow com questions 2059255 sorting multidimensional array in php 如何在
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么
  • 使用先前的反向引用作为命名捕获组的名称

    有没有办法使用对先前捕获组的反向引用作为捕获组的名称命名捕获组 这可能不可能 如果不可能 那么这就是一个有效的答案 下列 data description some description preg match data matches p
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • 限制自己超载外部 API 的速率

    我发现了很多信息和脚本示例 展示了如何对 API 用户进行速率限制 但我无法找到任何示例来说明在施加这些限制时如何对您自己的 API 请求进行速率限制 我总是用诸如以下的代码来限制我的脚本sleep or usleep命令 但感觉这是一种低
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

    我想允许用户从两个不同的模型登录 配置文件 user gt identityClass gt app models User one more class here enableAutoLogin gt false authTimeout
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • phpunit测试调用其他需要mock的类方法的方法

    我正在尝试创建一个非常标准的单元测试 在其中调用一个方法并断言它的响应 但是我正在测试的方法调用同一类中的另一个方法 该方法做了一些繁重的工作 我想模拟该方法 但仍按原样执行我正在测试的方法 仅使用从调用另一种方法返回的模拟值 我简化了示例
  • Sonata DateTimePickerType 类默认日期显示错误的日期时间格式

    我陷入困境 我不知道如何使用 sonata DateTimePickerType 类正确设置默认日期和时间 我尝试了不同的方法 但到目前为止 没有一种方法没有帮助 在下面的截图中 help 键显示正确的日期和时间 但是当我使用 dp 默认日
  • WordPress 插件中的类自动加载器

    我想编写一个类自动加载器以在 WordPress 插件中使用 该插件将安装在多个站点上 我想尽量减少与其他插件发生冲突的机会 自动加载器将是这样的 function autoload name some code here 我的主要问题是

随机推荐

  • 将git管理的子目录切换到子模块

    我们曾经在Rails应用程序中对delayed job进行了本地破解 位于vendor plugins delayed job中 它作为一次性事件安装并签入主应用程序存储库中的 git 现在我们决定在 github 上分叉 Delayed
  • java从当前目录读取文件

    我有一个 java 项目 我正在其中读取文件 由于该文件位于当前目录中 我正在这样做 String dataset myFile dat 但我得到 java io FileNotFoundException说找不到该文件 如何解决这个问题
  • 如何开发 Eclipse 搜索插件?

    我想开发一个插件视图 它将自动调用Eclipse中的搜索插件并显示包中调用特定函数的所有位置 帮我 我该怎么办 谢谢 这是另一个很好的插件开发教程http www vogella de articles EclipsePlugIn arti
  • matplotlib savefig() 大小控制

    我编写了一个函数 它采用 Pandas 生成的数据帧并生成热图 def drawHeatMap df city province collector classtype color titleposy try thePlot pl mats
  • TinyMCE 和 Laravel

    我正在尝试在我的 Laravel 项目中使用tinyMCE 问题是当我存储新文章时 html 标签不起作用 它们像纯文本一样显示在我的 laravel 视图上 这是在create blade php中实现的代码
  • cygwin g++ std::stoi“错误:‘stoi’不是‘std’的成员

    I have Windows 7 32 位上的 cygwin 1 7 25 g 版本 gt g GCC 4 8 2 libstdc a gt gcc g 4 8 2 1 试图制作一个c 你好世界 include
  • React Context API - 在页面刷新时保留数据

    假设我们设置了一个上下文提供程序以及一些初始数据属性值 在此过程中 假设消费者随后修改了这些属性 页面重新加载时 这些更改将丢失 保存数据以便我们可以保留这些数据修改的最佳方法是什么 除了本地存储之外还有其他方法吗 是的 如果您希望数据在重
  • 为什么需要在 createToken 方法中传递一个字符串?

    为了在 Laravel Sanctum 中创建访问令牌 需要在createToken方法 我觉得这很奇怪 因为您传入的任何内容都会使用 SHA 256 进行哈希处理 或者您可以获取纯文本令牌 为什么访问令牌不是基于随机字符串创建的 它可以很
  • 从非 UI 线程更新 Windows 窗体上的标签?

    我已经尝试了 2 天来做到这一点 我查看了大量的 stackoverflow 答案并尝试了所有答案 但仍然遇到同样的问题 我在 Windows 窗体上有一个标签 此 Windows 窗体上的唯一代码是 var thread1 new Thr
  • PowerShell参数值建议

    我用 C 编写了一个 Cmdlet 是否可以为特定字符串参数提供所有可能的值 此示例为 PackageId public sealed class InstallPackageCommand PSCmdlet Parameter Posit
  • c++17 有效地将参数包参数与 std::array 元素相乘

    我想有效地将 参数包中的参数与 std array 的元素相乘 int index auto Is std array
  • 散景布局的背景颜色

    我正在玩散景滑块演示 https demo bokehplots com apps sliders 源代码here https github com bokeh bokeh blob master examples app sliders
  • 在WPF中设置鼠标位置[重复]

    这个问题在这里已经有答案了 我打算用 Kinect 手势替换我的鼠标 但我找不到为 WPF 应用程序设置鼠标位置的方法 无法使用 NET BCL 但是 如果您确实想要它 您可以使用本机SetCursorPos in User32 dll D
  • 使用 JPA 和 Hibernate 将 Java 布尔值映射到 Oracle Number 列

    我在我的模型中创建了这样的属性 public class Client private Boolean active 我的 RDBMS 是 Oracle active列的类型NUMBER 1 0 如何使用Restrictions API实现
  • MySQL:具有授予选项的用户无法授予创建用户

    我创建了一个具有 root 的用户 new user 如下所示 GRANT ALL ON labor TO new user WITH GRANT OPTION GRANT ALL ON labor TO new user localhos
  • 姜戈 - 403 禁止。 CSRF 令牌缺失或不正确

    我尝试为我的模型添加 ModelForm 但每次 POST 尝试都以 403 Forbidden CSRF 验证失败 请求中止 失败原因给出 CSRF 令牌丢失或不正确 结束 我没有 render to response 方法 因此无法通过
  • 如何禁用/覆盖 PowerShell 点表示法

    PowerShell 中的命令几乎与 Bash 类似 但点符号扩展给我带来了很多工作 目前我必须将很多命令参数用引号引起来 mvnw cmd Dmaven repo local m2 repository deploy deploy fil
  • winkler的Python性能改进请求

    我是一个 python n00b 我想要一些关于如何改进算法的建议 以提高计算两个名字的 Jaro Winkler 距离的方法的性能 def winklerCompareP str1 str2 Return approximate stri
  • 为什么 ng-mouseover 不能与 ng-if 一起使用

    我试图在具有 ng if 的图像上使用 ng mouseover 指令 但它不起作用 但如果我使用 ng show 指令它起作用 每个人都可以告诉我为什么吗 或者这是 AngularJS 的问题 在 AngularJS 文档中 我无法阅读任
  • WooCommerce 挂钩 woocommerce_cancelled_order

    再会 这是我第一次使用 stackoverflow 很高兴认识大家 不管怎样 我正在为 WooCommerce 编写一个插件 当订单取消时我会自动退款 当我在没有钩子的情况下在单独的文件中手动执行它时 我的代码工作正常 但是 使用我的钩子它