WooCommerce拆分订单后自定义状态订单管理员通知失效求助
问题:自定义订单状态的管理员通知无法触发
我有一段WooCommerce代码,可实现拆分订单并创建带有自定义状态wc-shipping-progress的新订单,但新订单生成时,针对该自定义状态的管理员通知始终无法生效。以下是我使用的订单拆分代码及自定义状态注册代码:
订单拆分代码
function action_woocommerce_checkout_order_processed( $order_id, $posted_data, $order ) { // Initialize $check_for_back_orders = false; // Loop through order items foreach ( $order->get_items() as $item_key => $item ) { // Get product $product = $item->get_product(); // Product is on backorder if ( $product->is_on_backorder() ) { // Will only be executed once if the order contains back orders if ( $check_for_back_orders == false ) { $check_for_back_orders = true; // Create new order with backorders $backorder_order = wc_create_order(); } // Add product to 'backorder' order $backorder_order->add_product( $product, $item['quantity'] ); // Delete item from original order $order->remove_item( $item->get_id() ); } } // If current order contains backorders, retrieve the necessary data from the existing order and apply it in the new order if ( $check_for_back_orders ) { // Recalculate and save original order $order->calculate_totals(); $order->save(); // Obtain necessary information // Get address $address = array( 'first_name' => $order->get_billing_first_name(), 'last_name' => $order->get_billing_last_name(), 'email' => $order->get_billing_email(), 'phone' => $order->get_billing_phone(), 'address_1' => $order->get_billing_address_1(), 'address_2' => $order->get_billing_address_2(), 'city' => $order->get_billing_city(), 'state' => $order->get_billing_state(), 'postcode' => $order->get_billing_postcode(), 'country' => $order->get_billing_country() ); // Get shipping $shipping = array( 'first_name' => $order->get_shipping_first_name(), 'last_name' => $order->get_shipping_last_name(), 'address_1' => $order->get_shipping_address_1(), 'address_2' => $order->get_shipping_address_2(), 'city' => $order->get_shipping_city(), 'state' => $order->get_shipping_state(), 'postcode' => $order->get_shipping_postcode(), 'country' => $order->get_shipping_country() ); // Get order currency $currency = $order->get_currency(); // Get order payment method $payment_gateway = $order->get_payment_method(); // Required information has been obtained, assign it to the 'backorder' order // Set address $backorder_order->set_address( $address, 'billing' ); $backorder_order->set_address( $shipping, 'shipping' ); // Set the correct currency and payment gateway $backorder_order->set_currency( $currency ); $backorder_order->set_payment_method( $payment_gateway ); // Calculate totals $backorder_order->calculate_totals(); // Set order note with original ID $backorder_order->add_order_note( 'Pedido a confirmar stock automatizado. Creado a partir del ID de pedido original: ' . $order_id ); // Optional: give the new 'backorder' order the correct status $backorder_order->update_status( 'wc-shipping-progress' ); // $backorder_order->update_status( 'on-hold' ); } } add_action( 'woocommerce_checkout_order_processed', 'action_woocommerce_checkout_order_processed', 10, 3 );
自定义状态注册代码
// Register New Order Statuses function wpex_wc_register_post_statuses() { register_post_status( 'wc-shipping-progress', array( 'label' => _x( 'Confirmar Stock', 'WooCommerce Order status', 'text_domain' ), 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Approved (%s)', 'Approved (%s)', 'text_domain' ) ) ); } add_filter( 'init', 'wpex_wc_register_post_statuses' ); // Add New Order Statuses to WooCommerce function wpex_wc_add_order_statuses( $order_statuses ) { $order_statuses['wc-shipping-progress'] = _x( 'Confirmar Stock', 'WooCommerce Order status', 'text_domain' ); return $order_statuses; } add_filter( 'wc_order_statuses', 'wpex_wc_add_order_statuses' );
解决方案
WooCommerce不会自动为自定义订单状态绑定邮件通知,需要手动配置钩子和触发逻辑,具体步骤如下:
1. 为自定义状态启用邮件通知支持
添加代码让WooCommerce识别该状态的邮件触发器:
// 允许自定义状态触发邮件通知 function enable_custom_status_email_support( $statuses ) { $statuses[] = 'wc-shipping-progress'; return $statuses; } add_filter( 'woocommerce_email_enabled_order_status', 'enable_custom_status_email_support', 10, 1 ); // 添加自定义状态对应的邮件动作钩子 function add_custom_status_email_action( $actions ) { $actions[] = 'woocommerce_order_status_wc-shipping-progress'; return $actions; } add_filter( 'woocommerce_email_actions', 'add_custom_status_email_action' );
2. 关联管理员通知模板
将自定义状态与管理员的新订单通知模板绑定,触发邮件发送:
// 绑定自定义状态到管理员新订单通知 function trigger_admin_notification_on_custom_status( $email_class ) { // 当订单变为wc-shipping-progress状态时,触发管理员新订单邮件 add_action( 'woocommerce_order_status_wc-shipping-progress', array( $email_class->emails['WC_Email_New_Order'], 'trigger' ), 10, 1 ); } add_action( 'woocommerce_email', 'trigger_admin_notification_on_custom_status' );
3. 优化订单状态更新逻辑
在原拆分代码中,更新状态时需明确触发通知钩子,将:
$backorder_order->update_status( 'wc-shipping-progress' );
替换为:
// 第三个参数设为true,强制触发状态变更的相关钩子(包括邮件) $backorder_order->update_status( 'wc-shipping-progress', '', true );
4. 验证基础配置
- 登录WooCommerce后台,进入WooCommerce > 设置 > 邮件,确认"新订单"通知已启用,且收件人设置为管理员邮箱。
- 若邮件仍未发送,检查服务器邮件配置,或启用WooCommerce邮件日志排查触发记录。
内容的提问来源于stack exchange,提问作者Agustina Gonzalez
相关产品推荐
相关产品推荐

