Остановить отправку определенного уведомления по электронной почте для определенных пользователей в Woocommerce

Я хочу прекратить отправлять электронную почту Woocommerce для определенного пользователя/электронной почты. это мой пример кода, чтобы остановить отправку электронной почты после завершения заказа.

<?php
add_filter( 'woocommerce_email_headers', 'ieo_ignore_function', 10, 2);

function ieo_ignore_function($headers, $email_id, $order) {
    $list = '[email protected],[email protected]';
    $user_email = (method_exists( $order, 'get_billing_email' ))? $order->get_billing_email(): $order->billing_email;
    $email_class = wc()->mailer();
    if($email_id == 'customer_completed_order'){
        if(stripos($list, $user_email)!==false){
            remove_action( 'woocommerce_order_status_completed_notification', array( $email_class->emails['WC_Email_Customer_Completed_Order'], 'trigger' ) );
        }
    }
}

Но WP продолжает отправлять письмо. Я пытаюсь выполнить поиск в документах и ​​источниках Woocommerce (github), а также в Stackoverflow, но все еще не могу решить эту проблему.


person plonknimbuzz    schedule 28.02.2019    source источник


Ответы (2)


В этом примере уведомление «Клиент выполнил заказ» отключено для определенных адресов электронной почты клиентов:

// Disable "Customer completed order" for specifics emails
add_filter( 'woocommerce_email_recipient_customer_completed_order', 'completed_email_recipient_customization', 10, 2 );
function completed_email_recipient_customization( $recipient, $order ) {
    // Disable "Customer completed order
    if( is_a('WC_Order', $order) && in_array($order->get_billing_email(), array('[email protected]','[email protected]') ) ){
        $recipient = '';
    }
    return $recipient;
}

Код находится в файле function.php вашей активной дочерней темы (активной темы). Проверено и работает.

Примечание. Ловушка-фильтр должна всегда возвращать отфильтрованный аргумент основной функции.


Это также можно сделать с помощью User ID, например:

// Disable "Customer completed order" for specifics User IDs
add_filter( 'woocommerce_email_recipient_customer_completed_order', 'completed_email_recipient_customization', 10, 2 );
function completed_email_recipient_customization( $recipient, $order ) {
    // Disable "Customer completed order
    if( is_a('WC_Order', $order) && in_array($order->get_customer_id(), array(25,87) ) ){
        $recipient = '';
    }
    return $recipient;
}

Код находится в файле function.php вашей активной дочерней темы (активной темы). Проверено и работает.


Аналогично: Остановить электронную почту конкретного клиента уведомление на основе способов оплаты в Woocommerce

person LoicTheAztec    schedule 28.02.2019
comment
Я вижу, ты часто отвечаешь на вопросы WP, ты действительно мастер WP, мой друг. - person plonknimbuzz; 28.02.2019
comment
где я могу найти этот параметр в документах? woocommerce_email_recipient_customer_completed_order - person plonknimbuzz; 28.02.2019
comment
Я обновил свой ответ… Этот хук является составным хуком: woocommerce_email_recipient_{$this->id} - person LoicTheAztec; 28.02.2019
comment
отлично, я читал этот класс раньше, но не заметил, можно ли использовать эту функцию для моей цели. - person plonknimbuzz; 28.02.2019
comment
@plonknimbuzz Я добавил дополнительный код, который делает то же самое с идентификаторами пользователей вместо электронных писем. - person LoicTheAztec; 28.02.2019

Хотя ответ выше работает, это кажется более простым решением:

add_filter( 'woocommerce_email_recipient_customer_completed_order', 'completed_email_recipient_customization', 10, 2 );
function completed_email_recipient_customization( $recipient, $order ) {
    if( in_array($recipient, ['[email protected]', '[email protected]'] ) ) {
        $recipient = '';
    }
    return $recipient;
}
person OnGe    schedule 09.11.2020