当前位置: 首页 > 知识库问答 >
问题:

当订单状态更改为自定义订单状态时,从WooCommerce发送电子邮件

汝跃
2023-03-14

我在我的WooCommerce安装中创建了一个自定义订单状态,称为Quote。

/* 
* Change order status on new orders depending on order contents:
*  If any product in the order is availble for quote, return 'quote' status. 
*  Otherwise the order status will be set to processing.
*/
add_filter ('woocommerce_payment_complete_order_status', 'change_status_to_quote_if_applicable', 10, 2);
function change_status_to_quote_if_applicable($order_status, $order_id) { 
    $order = new WC_Order($order_id);
    $items = $order->get_items();
    foreach ($items as $item) {
        $product = get_product($item['product_id']);
        if(product_available_for_quote($product)){
            return 'quote';
        }
    }
    return $order_status;
}

现在我想收到一封电子邮件,每当收到一个订单,已经给出了状态栏。我根据这篇有用的文章创建了一个插件:http://www.skyverge.com/blog/how-to-add-a-custom-woocommerce-email/

我的插件基本上是从文章复制的,我只是更改了电子邮件的内容。我想改变的是什么触发了电子邮件。

本文中的插件具有以下功能:

// Trigger on new paid orders
add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) );
add_action( 'woocommerce_order_status_failed_to_processing_notification',  array( $this, 'trigger' ) );

并且我希望电子邮件被触发时,一个订单获得状态‘报价’。我是这样做的:

// Trigger on new quote orders
add_action( 'woocommerce_order_status_pending_to_quote', array( $this, 'trigger' ) );

当订单获得“报价”状态时,什么也不会发生。我检查了class-wc-order.php,特别是函数update_status,因为这是woocommerce_order_status_.$this->status._to_.$new_status->slug被激发的地方。我执行了error_log以查看woocommerce_order_status_pending_to_quote操作是否存在,并且确实存在。但我的插件中的触发器功能从来没有运行过。

有什么想法吗?我已经尝试了不同的钩子,但似乎无法使触发器函数运行。

多谢!

共有3个答案

沈龙光
2023-03-14

多亏了@helgatheviking,现在有了一个钩子,但是我还必须添加一个对WC()->mailer()的调用。因此上面的一些代码被更改为:

if ( product_available_for_quote( $product ) ){
  $order->update_status('quote');
  // load email classes
  WC()->mailer();
  // send notification email
 do_action( 'woocommerce_order_status_pending_to_quote', $order_id );
  // no need to process any other products
  break;
 }
杜翰林
2023-03-14

我发现电子邮件操作是在woocommerce.phpinit函数中定义的。

// Email Actions
$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_pending_to_on-hold',
    'woocommerce_order_status_failed_to_processing',
    'woocommerce_order_status_failed_to_completed',
    'woocommerce_order_status_completed',
    'woocommerce_new_customer_note',
    'woocommerce_created_customer'
);

这就是我的woocommerce_order_status_pending_to_quote操作钩子不工作的原因。

我不想对核心woocommerce文件进行更改,所以我最终使用Woocommerce_Order_Status_Pending_To_Processing_Notification操作来挂钩我的触发器函数。我还更改了我的筛选器,以便订单总是在我的自定义“报价”状态之前获得状态pending和processing。我以前的解决方案给订单的状态是“报价”,而不是“处理”,所以我也必须更改它。

add_filter ('woocommerce_order_status_pending_to_processing', 'change_status_to_quote_if_applicable', 10, 2);
function change_status_to_quote_if_applicable($order_id) { 
    $order = new WC_Order($order_id);
    $items = $order->get_items();
    foreach ($items as $item) {
        $product = get_product($item['product_id']);
        if(product_available_for_quote($product)){
            $order->update_status('quote');
        }
    }
}
鲜于允晨
2023-03-14

我相信您可以使用您的自定义钩子,但首先您必须注册它。我有一个挂起WooThemes的拉请求,允许过滤您在core中发现的电子邮件操作。但如果/直到它被接受,则应这样做:

/**
 * Register the "woocommerce_order_status_pending_to_quote" hook which is necessary to
 * allow automatic email notifications when the order is changed to refunded.
 * 
 * @modified from http://stackoverflow.com/a/26413223/2078474 to remove anonymous function
 */
add_action( 'woocommerce_init', 'so_25353766_register_email' );
function so_25353766_register_email(){
    add_action( 'woocommerce_order_status_pending_to_quote', array( WC(), 'send_transactional_email' ), 10, 10 );
}

通过这个提交,WooCommerce允许您过滤电子邮件操作。因此,理论上,您现在应该可以通过以下操作将操作注册为电子邮件触发器:

/**
 * Register "woocommerce_order_status_pending_to_quote" as an email trigger
 */
add_filter( 'woocommerce_email_actions', 'so_25353766_filter_actions' );
function so_25353766_filter_actions( $actions ){
    $actions[] = "woocommerce_order_status_pending_to_quote";
    return $actions;
}
 类似资料:
  • 我添加了自定义状态: 我添加了自定义电子邮件: 我可以在电子邮件设置中看到电子邮件,在订单状态下拉菜单中看到状态。现在,每当订单状态更改为时,我就需要发送我的新电子邮件。过渡钩似乎从未开火。 我也试过: 这似乎也不起作用...有什么想法吗?

  • 我创建了一个自定义电子邮件类并将其添加到Woocommerce中。当我转到WooCommerce中的电子邮件设置时,我可以在那里看到我的模板,当我手动触发它时,电子邮件就会到达目标电子邮件帐户。现在我遇到的问题是,我在我的类中添加了一个动作,该动作应该检测订单状态更改,并在订单被设置为我的自定义状态时执行我的触发器功能: add_action('woocommerce_order_status_w

  • 我已经在我的WooCommerce回拨订单()中创建了自定义订单状态: 现在我想收到一封电子邮件,每当收到一个订单,已经给出了状态栏。我根据这篇有用的文章创建了一个插件:如何添加自定义的WooCommerce电子邮件 这个链接包含我的插件源代码和functions.php代码。 我在function.php中添加了钩子: 当订单更改为“延迟订单”状态时,不会发生任何情况。 有什么想法吗? 我已经尝

  • 我正试图阻止woo-commerce发送邮件时,订单状态更改。这些订单是亚马逊的,我的插件从亚马逊同步到Woo-Commerce。在这样做的时候,亚马逊和woo-commerce的邮件都收到了,这激怒了客户。因此,我想停止电子邮件功能停止时,状态从我的插件更改。要更改状态的代码是 有没有可以设置的标志来避免发送邮件? 任何种类的帮助都是非常感谢的。

  • 我已成功更改了Woocommerce处理订单的电子邮件主题(使用此线程): 但我想发送处理订单电子邮件与新的主题后,订单状态改变,所以我遵循这一步调整主题等。 但只接受第一次电子邮件主题更改。有办法让它一起工作吗? 是否有权使用?

  • 在以前的Woocommerce版本中,当订单从挂起状态更改为取消状态时,会自动发送电子邮件通知(在我的例子中,这发生在admin的inventory部分中设置的分配时间之后)。 在WooCommerce 3.0.8中,他们删除了这种自动化,并将其标记为修补程序:https://github.com/WooCommerce/WooCommerce/blob/master/changelog.txt