在 WooCommerce 中执行 woocommerce_order_status_completed_notification 挂钩的时间和地点?

问题描述 投票:0回答:1

我的网上商店安装了 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
钩子上触发了一封电子邮件,所以我尝试修改代码:

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_notification
    执行时,钩子
    woocommerce_order_status_completed
    没有执行,可能是什么原因?

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

php wordpress woocommerce hook-woocommerce composite
1个回答
0
投票

挂钩

woocommerce_order_status_completed_notification
是一个多复合挂钩,允许在订单状态更改为“已完成”时触发发送给客户的电子邮件。

在第170行的

WC_Emails
send_transactional_email()
方法中触发:

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

其中

current_filter()
指的是
woocommerce_email_actions
过滤器挂钩参数

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',
)

钩子钩在构造函数第42行的

WC_Email_Customer_Completed_Order中,对于
WC_Email_Customer_Completed_Order
方法
trigger()

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

因此 您只能将此钩子与

remove_action()
如代码片段所示一起使用,以删除当订单状态为“已完成”时发送给客户的电子邮件通知。


请注意,

WC()->mailer()
只是
WC_Emails
类的实例对象,用于加载邮件程序类,类似于
new WC_Emails()

© www.soinside.com 2019 - 2024. All rights reserved.