我在我的网上store 安装了WooCommerce 8.0.3.简而言之,假设我有一个ID为123的订单,状态为processing.在特定情况下,我运行以下代码:

// Make sure e-mails are initialized.
WC()->mailer();

// Set order status to completed.
$order = wc_get_order( 123 );
$order->update_status( "completed", "", true );

我需要一封customer_completed_order的邮箱才能发送.有时有用,但有时不行.我在WooCommerce管理员中启用了邮箱.

我发现在woocommerce_order_status_completed_notification钩子上触发了一封邮箱,所以我try 修改代码:

WC()->mailer();
$order = wc_get_order( 123 );
$order->update_status( "completed", "", true );

var_dump( did_action( "woocommerce_order_status_completed" ) );
var_dump( did_action( "woocommerce_order_status_completed_notification" ) );

结果:

int(1)
int(0)

这意味着woocommerce_order_status_completed个虎克被处决了,但woocommerce_order_status_completed_notification个没有被处决.

我的问题是:

  1. 在WooCommerce代码中,像woocommerce_order_status_completed_notification这样的钩子是在哪里执行的?
  2. woocommerce_order_status_completed执行时,钩子woocommerce_order_status_completed_notification没有执行的原因可能是什么?

如有任何帮助,我们不胜感激.

推荐答案

挂钩woocommerce_order_status_completed_notificationmulti composite hook,其允许在订单状态被改变为"完成"时触发发送给客户的邮箱.

它在线路170上以WC_Emails send_transactional_email() method触发:

do_action_ref_array( current_filter() . '_notification', $args );

其中current_filter()指的是woocommerce_email_actions filter hook arguments:

array(
    'woocommerce_low_stock',
    'woocommerce_no_stock',
    'woocommerce_product_on_backorder',
    'woocommerce_order_status_pending_to_processing',
    'woocommerce_order_status_pending_to_completed',
    'woocommerce_order_status_processing_to_cancelled',
    'woocommerce_order_status_pending_to_failed',
    'woocommerce_order_status_pending_to_on-hold',
    'woocommerce_order_status_failed_to_processing',
    'woocommerce_order_status_failed_to_completed',
    'woocommerce_order_status_failed_to_on-hold',
    'woocommerce_order_status_cancelled_to_processing',
    'woocommerce_order_status_cancelled_to_completed',
    'woocommerce_order_status_cancelled_to_on-hold',
    'woocommerce_order_status_on-hold_to_processing',
    'woocommerce_order_status_on-hold_to_cancelled',
    'woocommerce_order_status_on-hold_to_failed',
    'woocommerce_order_status_completed', // <=== <=== <=== HERE
    'woocommerce_order_fully_refunded',
    'woocommerce_order_partially_refunded',
    'woocommerce_new_customer_note',
    'woocommerce_created_customer',
)

对于WC_Email_Customer_Completed_Order方法trigger(),钩被钩在WC_Email_Customer_Completed_Order in the constructor function线42中:

// Triggers for this email.
add_action( 'woocommerce_order_status_completed_notification', array( $this, 'trigger' ), 10, 2 );

因此,you can only use this hook with 101 as showed in this code snippet,删除当订单状态为"已完成"时发送给客户的邮箱通知.


请注意,WC()->mailer()只是WC_Emails类的一个实例对象,它加载Mailer类,类似于new WC_Emails().

Php相关问答推荐

添加自定义Metabox到WooCommerce管理订单,启用HPOS

PHP php_mongodb.dll for 32bit

邮箱打开跟踪器不工作时发送邮件使用laravel调度程序

根据未用于变体的产品属性隐藏WooCommerce发货方式

如何在Laravel Model中自定义多个日期属性的日期格式?

PHP SimpleXML:按属性值访问 node

为什么WooCommerce的动作钩子';woocommerce_checkout_update_order_review';包含旧信息?

ANTLR4-lexer如何消耗更多的 token 并停止现有规则?

Mockery在模拟Redis连接时抛出错误:Mockery\Exception\BadMethodCallException

从 XAMPP 运行 shell 脚本时,意外标记(附近出现语法错误

invalid_grant 和无效的 JWT 签名

WooCommerce 相关产品(按 children 类别)作为排名数学主要类别的后备

在 WooCommerce wc_get_products 函数中处理自定义分类法

在PHP WordPress插件中使用变量连接路径时的问题解决方法

如何获取用户之间的最新消息列表

PHP 日期格式:ISO8601 与 ISO8601_EXPANDED

Laravel 查询关系是否为 bool

为什么非贪婪匹配会消耗整个模式,即使后面跟着另一个非贪婪匹配

将参数传递给 laravel 9 工厂

检测字符串是否包含Letter with Tilde或Letter + Combining Tilde