我在我的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
操作是否存在,并且确实存在。但我的插件中的触发器功能从来没有运行过。
有什么想法吗?我已经尝试了不同的钩子,但似乎无法使触发器函数运行。
多谢!
多亏了@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;
}
我发现电子邮件操作是在woocommerce.php
和init
函数中定义的。
// 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');
}
}
}
我相信您可以使用您的自定义钩子,但首先您必须注册它。我有一个挂起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