对具有自定义状态的订单禁用 WooCommerce 订单电子邮件通知

BTB*_*BTB 4 php wordpress orders email-notifications woocommerce

我搜索了网络并检查了WooCommerce 文档,以找到禁用在 WooCoomerce 下订单时发送给客户的“确认电子邮件”的解决方案。

我还想禁用发送给管理员的“新订单”邮件。

但前提是订单具有自定义状态“mystatus”,某些订单会根据客户的订购内容获得该状态。

尝试像这样添加它,但它不起作用:

remove_action( 'woocommerce_order_status_mystatus_notification', array($email_class->emails['WC_Email_New_Order'], 'trigger' ) );?>

有什么建议吗?


这是我更改特定订单的订单状态的方法:

add_action( 'woocommerce_thankyou','woocommerce_thankyou_change_order_status', 10, 1 );
function woocommerce_thankyou_change_order_status( $order_id ){
if( ! $order_id ) return;

$order = wc_get_order( $order_id );
$user_id = $order->get_user_id();

if( ($order->get_status() == 'processing'  || $order->get_status() == 'pending' || $order->get_status() == 'on-hold' ) && dokan_is_user_seller( $user_id ) && is_user_logged_in()) {
    $order->update_status( 'mystatus' );
  }
}
Run Code Online (Sandbox Code Playgroud)

7uc*_*f3r 7

不需要对 WooCommerce 设置进行任何更改。

除非您有效提供,否则不会发送有关自定义订单状态的电子邮件通知

但是,会发送默认的电子邮件通知,因为woocommerce_thankyou挂钩是在发送电子邮件通知后执行的。

因此,使用woocommerce_checkout_order_created相反的钩子(在发送电子邮件通知之前执行)woocommerce_thankyou来更改订单状态,无论如何都不会发送电子邮件。

function action_woocommerce_checkout_order_created( $order ) {
    // Get user ID
    $user_id = $order->get_user_id();
    
    // Compare
    if ( ( $order->get_status() == 'processing'  || $order->get_status() == 'pending' || $order->get_status() == 'on-hold' ) && dokan_is_user_seller( $user_id ) && is_user_logged_in() ) {
        // Update status
        $order->update_status( 'mystatus' );
    }
}
add_action( 'woocommerce_checkout_order_created', 'action_woocommerce_checkout_order_created', 10, 1 );
Run Code Online (Sandbox Code Playgroud)

注意:如果您想在任何其他情况下禁用电子邮件,您可以使用woocommerce_email_recipient_{$email_id}过滤器复合挂钩,并设置正确的电子邮件 ID,您可以选择禁用电子邮件通知。

例如:

// Admin - new order email notification
// Customer - on hold
// Customer - processing
// Customer - pending
function filter_woocommerce_email_recipient( $recipient, $order, $email ) { 
    if ( ! $order || ! is_a( $order, 'WC_Order' ) ) return $recipient;
    
    // Has order status
    if ( $order->has_status( 'your-order-status' ) ) {
        $recipient = '';
    }

    return $recipient;
}
add_filter( 'woocommerce_email_recipient_new_order', 'filter_woocommerce_email_recipient', 10, 3 );
add_filter( 'woocommerce_email_recipient_customer_on_hold_order', 'filter_woocommerce_email_recipient', 10, 3 );
add_filter( 'woocommerce_email_recipient_customer_processing_order', 'filter_woocommerce_email_recipient', 10, 3 );
add_filter( 'woocommerce_email_recipient_customer_pending_order', 'filter_woocommerce_email_recipient', 10, 3 );
Run Code Online (Sandbox Code Playgroud)