Динамическое оповещение получателя нового заказа в WooCommerce

Вопрос или проблема

У меня есть код, который добавляет электронный адрес, хранящийся в полях ACF, к новому электронному письму заказа в зависимости от того, использует ли пользователь валюту GBP или EUR. Это работает нормально, но проблема в том, что он отправляет дублирующие письма. Сначала на значение ACF, а затем снова на значение, хранящееся в настройках woocommerce, плюс это значение ACF. Я в затруднении, так как думал, что это просто добавит к строке электронного письма в хуке. Или этот хук срабатывает больше одного раза?

add_filter( 'woocommerce_email_recipient_new_order', 'my_new_order_email_recipient', 10, 2 );

function my_new_order_email_recipient( $recipient, $order ) {

    $woocommerce_options = get_field( 'woocommerce', 'option' );

    if ( $woocommerce_options && isset( $woocommerce_options['order_emails'] ) ) {
        $order_emails = $woocommerce_options['order_emails'];

        $currency_emails = [
            'EUR' => $order_emails['euro_orders'] ?? '',
            'GBP' => $order_emails['sterling_orders'] ?? '',
        ];

        $current_currency = get_woocommerce_currency();

        if ( ! empty( $currency_emails[ $current_currency ] ) ) {
            $recipient=", " . $currency_emails[ $current_currency ];
        }

    }

    return $recipient;
}

Ответ или решение

Чтобы решить проблему с дублирующимися уведомлениями о новых заказах в WooCommerce, необходимо разобраться с тем, как работает хук woocommerce_email_recipient_new_order и какие факторы могут влиять на его поведение. Я понимаю, что вы хотите динамически добавлять email-адреса в зависимости от валюты заказа, но при этом столкнулись с ситуацией, когда уведомления идут по нескольким адресам, создавая путаницу.

Анализ текущего кода

Ваш код предназначен для добавления email-адреса, хранящегося в полях ACF (Advanced Custom Fields), на основе выбранной валюты (GBP или EUR). Однако проблема, с которой вы сталкиваетесь, связана с тем, как вы возвращаете получателя и как хук обрабатывает эти данные.

  1. Текущий код:

    add_filter( 'woocommerce_email_recipient_new_order', 'my_new_order_email_recipient', 10, 2 );
    
    function my_new_order_email_recipient( $recipient, $order ) {
        $woocommerce_options = get_field( 'woocommerce', 'option' );
    
        if ( $woocommerce_options && isset( $woocommerce_options['order_emails'] ) ) {
            $order_emails = $woocommerce_options['order_emails'];
    
            $currency_emails = [
                'EUR' => $order_emails['euro_orders'] ?? '',
                'GBP' => $order_emails['sterling_orders'] ?? '',
            ];
    
            $current_currency = get_woocommerce_currency();
    
            if ( ! empty( $currency_emails[ $current_currency ] ) ) {
                $recipient = ", " . $currency_emails[ $current_currency ];
            }
        }
    
        return $recipient;
    }
  2. Проблема дублирования:
    Ваша проблема заключается в том, что вы замещаете переменную $recipient только на адреса, соответствующие текущей валюте. Это приводит к тому, что у вас могут формироваться строки получателей, состоящие только из добавленных адресов, в то время как оригинальный адрес получателя из настроек WooCommerce может быть потерян.

Решение проблемы

Чтобы избежать отправки дублирующих уведомлений, необходимо правильно объединить адреса получателей. Для этого следует модифицировать логику добавления email-адресов в окончательную строку.

Правильный подход

Вот как можно изменить ваш код, чтобы исправить проблему:

add_filter('woocommerce_email_recipient_new_order', 'my_new_order_email_recipient', 10, 2);

function my_new_order_email_recipient($recipient, $order) {
    $woocommerce_options = get_field('woocommerce', 'option');

    if ($woocommerce_options && isset($woocommerce_options['order_emails'])) {
        $order_emails = $woocommerce_options['order_emails'];

        $currency_emails = [
            'EUR' => $order_emails['euro_orders'] ?? '',
            'GBP' => $order_emails['sterling_orders'] ?? '',
        ];

        $current_currency = get_woocommerce_currency();
        $new_recipients = $currency_emails[$current_currency] ?? '';

        if (!empty($new_recipients)) {
            // Объединяем адреса, если они существовали
            $recipient .= ', ' . $new_recipients; 
        }
    }

    return $recipient;
}

Ключевые изменения:

  1. Объединение строк: Вместо замещения значения переменной $recipient, теперь мы добавляем новые адреса к существующим с помощью $recipient .= ', ' . $new_recipients;. Это позволяет сохранить оба адреса — как стандартный, так и добавленный на основе валюты.

  2. Проверка существующих значений: Убедитесь, что при добавлении новых адресов вы не создаете лишних запятых или пробелов, если новая строка пустая.

Заключение

Используя этот подход, вы избежите ситуации с дублированием email-уведомлений. Убедитесь также, что все необходимые email-адреса корректно указаны в настройках и что фильтры WooCommerce работают должным образом. Эти изменения не только улучшат работу вашей системы уведомлений, но и повысят общую эффективность вашего интернет-магазина.

Оцените материал
Добавить комментарий

Капча загружается...