WooCommerce更新订单状态时会发送邮件,系统默认的邮件有自己的触发条件,当触发条件满足时,邮件就会自动发送。本文大体描述了这个过程。

发送过程

2013XXLfreshman,swag精品视频在线观看订单状态由pending变为processing并发送admin new order的过程:

1. 2013XXLfreshman,swag精品视频在线观看调用$order->update_status( 'processing' )更新状态,触发提示状态变化的action,如下所示

// abstract-wc-order.php
public function update_status( $new_status, $note = '', $manual = false ) {
    ...
    do_action( 'woocommerce_order_status_' . $new_status, $this->id );
    do_action( 'woocommerce_order_status_' . $old_status . '_to_' . $new_status, $this->id );
    do_action( 'woocommerce_order_status_changed', $this->id, $old_status, $new_status );
    ...
}

这时会触发woocommerce_order_status_pending_to_processing这个action

2. 触发send_transactional_email()函数

// class-wc-emails.php
public static function init_transactional_emails() {
    $email_actions = apply_filters( 'woocommerce_email_actions', array(
        ...
        'woocommerce_order_status_pending_to_processing',
        ...
    ) );

    foreach ( $email_actions as $action ) {
        add_action( $action, array( __CLASS__, 'send_transactional_email' ), 10, 10 );
    }
}

代码执行了add_action( 'woocommerce_order_status_pending_to_processing', array( __CLASS__, 'send_transactional_email' ), 10, 10 );
2013XXLfreshman,swag精品视频在线观看 进而触发send_transactional_email()函数。

3. 触发发送邮件的action

// class-wc-emails.php
public static function send_transactional_email() {
    self::instance();
    $args = func_get_args();
    do_action_ref_array( current_filter() . '_notification', $args );
}

相当于执行了do_action( 'woocommerce_order_status_pending_to_processing_notification' );

4. 发送邮件

WooCommerce会加载所有注册过的email classes,但只有满足触发条件的才能执行。

// class-wc-email-new-order.php
add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) );
add_action( 'woocommerce_order_status_pending_to_completed_notification', array( $this, 'trigger' ) );
add_action( 'woocommerce_order_status_pending_to_on-hold_notification', array( $this, 'trigger' ) );
add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ) );
add_action( 'woocommerce_order_status_failed_to_completed_notification', array( $this, 'trigger' ) );
add_action( 'woocommerce_order_status_failed_to_on-hold_notification', array( $this, 'trigger' ) );

admin new order执行了add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) ),trigger()函数负责发送邮件,当运行do_action( 'woocommerce_order_status_pending_to_processing_notification' )时,该函数会被执行,进而邮件被发给管理员。

2013XXLfreshman,swag精品视频在线观看综上所述,更新订单状态时,如果状态变化符合某个邮件的触发条件,该邮件就会被发送。

实际执行顺序

  1.  init_transactional_emails
  2.  update_status
  3.  send_transactional_email
  4.  trigger

发送邮件的函数

function wc_mail( $to, $subject, $message, $headers = "Content-Type: text/html\r\n", $attachments = "" ) {
	$mailer = WC()->mailer();

	$mailer->send( $to, $subject, $message, $headers, $attachments );
}

 

21条留言

  1. 不知道博主还在不,想问一个问题,就是我的woo在用户使用paypal支付成功以后,订单状态还是不变,依旧是未支付,要手动去改变才行

    1. paypal的状态需要通过接受伊布通知来实现,可能是你服务器配置有问题,或者拦截了来自paypal的请求。
      去woocommerce的系统工具里看看,里面会显示必须安装的服务是否装了,如果没有装全就用不了paypal。

  2. 2013XXLfreshman,swag精品视频在线观看/?add-to-cart=28 是添加 ID 为 28 的商品到购物车的URL参数,那么能否同时添加两个商品呢?比如 ID 为 28 和 26 的这两个商品。

  3. 说道:
·

半年多没更新了,去哪了,呵呵。

  • 说道: