Избегайте уведомления о завершении заказа для родительских заказов в WooCommerce Dokan

У меня есть вопрос по поводу моего кода ниже. Мы используем код отсюда: Плагин Dokan отправляет несколько электронных писем для клиента для одного заказа, чтобы система не отправляла клиенту электронные письма с обработкой заказов для подзаказа и, следовательно, только для родительского заказа. (Это полностью работает! = ›Часть 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;
}

person Nik7    schedule 17.03.2021    source источник
comment
Эти хуки кажутся от dokan, так как я не могу найти их в woocommerce. Я предлагаю вам также проверить базовый код. Может быть, именно сюда отправляется электронное письмо. Так что вам просто нужно обслужить еще один крючок.   -  person shazyriver    schedule 24.03.2021
comment
Ответив ниже, мы будем очень благодарны @ Nik7 за обратную связь.   -  person LoicTheAztec    schedule 28.03.2021
comment
Спасибо! Я проверю это завтра! Большое спасибо! :)   -  person Nik7    schedule 28.03.2021


Ответы (1)


Основная ошибка в вашем коде - empty(wp_get_post_parent_id($order->get_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 активной дочерней темы (или активной темы). Это могло сработать.

person LoicTheAztec    schedule 26.03.2021
comment
Отлично! M Большое спасибо. - person Nik7; 29.03.2021
comment
В: Я хочу убедиться, что отправляю заполненное письмо для дочернего заказа, когда они будут выполнены. Поэтому я пробую: add_filter ('woocommerce_email_recipient_customer_completed_order', 'filter_email_recipient_customer_completed_order2', 10, 2); function 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; } } возвращение ''; } - person Nik7; 29.03.2021
comment
Но это не работает? Что мне здесь не хватает? Должен быть тот же код, что и // Избегайте уведомления о заказах на обработку для дочерних заказов и просто измените return $ recipient; и вернуться ''; Что мне здесь не хватает? - person Nik7; 29.03.2021
comment
@ Nik7 Извините, я ничем не могу помочь ... Как сказано в моем ответе , это может сработать. ... Для меня главной ошибкой в ​​вашем коде было empty(wp_get_post_parent_id($order->get_id()), что было неправильно во втором фрагменте кода, поскольку он не пустой потому что значение 0, когда это основной заказ, имеющий подзаказы. - person LoicTheAztec; 29.03.2021