【问题标题】:Avoid order completed notification for parent orders in WooCommerce Dokan避免 WooCommerce Dokan 中父订单的订单完成通知
【发布时间】:2021-06-15 05:40:36
【问题描述】:

我对下面的代码有疑问。我们使用此处的代码:Dokan plugin sends multiple email for customer for single order 以确保系统不会将订单处理邮件发送给客户进行子订单,因此仅针对“父”订单。 (这完全有效!=> 下面代码中的第 1 部分)

问题: 但是,如果此订单有子订单,我们还必须确保不会为父订单发送订单完成邮件。为什么?因为每个子订单完成后,父订单也会自动标记为已完成。如果此父订单已完成,我们不想发送该邮件。

为此,我们更改了钩子以及 IF 语句。但目前,订单完成邮件也会在所有子订单完成后发送。 (下面代码中的第 2 部分)

据我了解,我必须检查订单是否为父订单,如果是,则不要发送已完成订单的邮件。 if (get_post_meta( $order->get_id(), 'has_sub_order', true ) ){ return ''; }

更新:我认为它不起作用,因为使用了钩子woocommerce_email_recipient_customer_completed_order。对于处理邮件,我使用woocommerce_email_recipient_customer_processing_order 并且有效。

// PART 1
// Do not send order processing mail for sub orders
add_filter( 'woocommerce_email_recipient_customer_processing_order', 'conditional_email_notification_order_processing', 10, 2 );
function conditional_email_notification_order_processing( $recipient, $order ) {
    if( is_admin() ) return $recipient;

    if (!get_post_meta( $order->get_id(), 'has_sub_order', true ) && !empty(wp_get_post_parent_id($order->get_id())) ){
        return '';
    }
    return $recipient;
}

// PART 2
// Do not send order completed mail for parent order (IF SUB ORDERS = TRUE)
add_filter( 'woocommerce_email_recipient_customer_completed_order', 'conditional_email_notification_order_completed', 10, 2 );
function conditional_email_notification_order_completed( $recipient, $order ) {
    if( is_admin() ) return $recipient;

    if ( get_post_meta( $order->get_id(), 'has_sub_order', true ) && empty(wp_get_post_parent_id($order->get_id())) ){
        return '';
    }
    return $recipient;
}

【问题讨论】:

  • 这些钩子似乎来自 dokan,因为我在 woocommerce 中找不到它们。我的建议是您还应该检查基本代码。可能就是发送电子邮件的地方。所以你只需要再迎合一个钩子。
  • 刚刚在下面回答,一些反馈将非常感谢@Nik7。
  • 谢谢!我明天会测试这个!非常感谢! :)

标签: php wordpress woocommerce email-notifications dokan


【解决方案1】:

您的代码中的主要错误是empty(wp_get_post_parent_id($order->get_id()) 在您的第二个代码 sn-p 不为空当它是具有子订单的主订单时。在这种情况下,父订单 ID 具有 0(所以不是空的)

尝试以下重新访问的代码:

// Avoid customer processing order notification for children orders
add_filter( 'woocommerce_email_recipient_customer_processing_order', 'filter_email_recipient_customer_processing_order', 10, 2 );
function filter_email_recipient_customer_processing_order( $recipient, $order ) {
    if ( is_a( $order, 'WC_Order' ) ) {
        $has_sub_order = $order->get_meta('has_sub_order');
        $parent_order  = $order->get_parent_id();
        
        if ( ! $has_sub_order && $parent_order > 0 ){
            return '';
        }
    }
    return $recipient;
}


// Avoid customer completed order notification for main parent order
add_filter( 'woocommerce_email_recipient_customer_completed_order', 'filter_email_recipient_customer_completed_order', 10, 2 );
function filter_email_recipient_customer_completed_order( $recipient, $order ) {
    if ( is_a( $order, 'WC_Order' ) ) {
        $has_sub_order = $order->get_meta('has_sub_order');
        $parent_order  = $order->get_parent_id();
        
        if ( $has_sub_order && $parent_order == 0 ){
            return '';
        }
    }
    return $recipient;
}

代码位于活动子主题(或活动主题)的functions.php 文件中。它可以工作。

【讨论】:

  • 完美!非常感谢。
  • 问:我想确保在子订单完成后发送已完成的邮件。所以我尝试: add_filter( 'woocommerce_email_recipient_customer_completed_order', 'filter_email_recipient_customer_completed_order2', 10, 2 );功能 filter_email_recipient_customer_completed_order2( $recipient, $order ) { if ( is_a( $order, 'WC_Order' ) ) { $has_sub_order = $order->get_meta('has_sub_order'); $parent_order = $order->get_parent_id(); if ( ! $has_sub_order && $parent_order > 0 ){ return $recipient; } } 返回 ''; }
  • 但这不起作用?我在这里想念什么?应该是相同的代码 // 避免客户处理子订单的订单通知,只需更改“return $recipient;”和“返回'';”我在这里想念什么?
  • @Nik7 抱歉,我无能为力...正如我的回答所说“它可以工作。” ...对我来说,您的代码中的主要错误是empty(wp_get_post_parent_id($order->get_id())这在您的第二个代码 sn-p 上是错误的,因为它不是空的,因为当它是具有子订单的主订单时,该值是 0
猜你喜欢
  • 2019-09-05
  • 2018-02-06
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2021-06-10
  • 2020-01-17
相关资源
最近更新 更多