Вопрос или проблема
Вот более точная версия вашего вопроса для ясности и публикации на форумах, таких как Stack Overflow:
Заголовок:
“Дублирование новых заказов по электронной почте при добавлении получателей динамически с помощью woocommerce_email_recipient_new_order
хука”
Суть:
Я использую фильтр woocommerce_email_recipient_new_order
для динамического добавления адреса электронной почты из поля ACF в зависимости от валюты заказа (EUR или GBP). Хотя дополнительный адрес электронной почты добавляется правильно, проблема заключается в том, что отправляются дублирующие письма:
- Одно письмо приходит только на динамически добавленный адрес электронной почты.
- Другой адрес электронной почты отправляется как на адрес, установленный в настройках WooCommerce, так и на динамически добавленный адрес электронной почты.
Вот мой код:
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_email_recipient_new_order
несколько раз? - Почему переменная
$recipient
вызывает дублирование электронной почты вместо того, чтобы добавлять новый адрес электронной почты?
Что мне нужно:
Как гарантировать, что динамически добавленный адрес электронной почты не приведет к дублированию писем и будет правильно работать вместе с настройками электронной почты по умолчанию WooCommerce?
Ответ или решение
Чтобы динамически добавлять адреса электронной почты для уведомлений о новых заказах в WooCommerce, можно использовать фильтр woocommerce_email_recipient_new_order
. Однако, как показано в вашем вопросе, при добавлении получателей могут возникнуть проблемы с дублированием писем. В данной статье мы разберем, как избежать этих проблем и добиться корректной работы вашего кода.
Ваш Исходный Код
Ваш код выглядит следующим образом:
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;
}
Проблема
Как вы отметили, проблема заключается в том, что функция my_new_order_email_recipient
вызывает дублирование адресов электронной почты. Это происходит потому, что функция возвращает адреса, но вы не учитываете, что recipient
уже содержит адреса, заданные в настройках WooCommerce. При этом код добавляет новые адреса, что приводит к отправке дополнительных писем.
Решение
Проще говоря, это можно исправить, убедившись, что функция добавляет новые адреса к уже существующим, а не заменяет их. Попробуйте следующую модификацию вашего кода:
add_filter( 'woocommerce_email_recipient_new_order', 'my_new_order_email_recipient', 10, 2 );
function my_new_order_email_recipient( $recipient, $order ) {
// Получаем настройки WooCommerce
$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
$recipient_addresses = explode( ',', $recipient );
$recipient_addresses = array_map( 'trim', $recipient_addresses );
// Добавляем новый адрес только если его нет в списке
$new_email = trim( $currency_emails[ $current_currency ] );
if ( ! in_array( $new_email, $recipient_addresses ) ) {
$recipient_addresses[] = $new_email;
}
// Объединяем адреса обратно в строку
$recipient = implode( ', ', $recipient_addresses );
}
}
return $recipient;
}
Что Изменилось?
-
Проверка на дубликаты: Код теперь разбивает строку
$recipient
на массив адресов с помощьюexplode()
, а затем проверяет, существует ли уже новый адрес в этом массиве с помощью функцииin_array()
. -
Сборка итогового адреса: Новые адреса добавляются к массиву и затем собираются обратно в строку с помощью
implode()
, что гарантирует, что дубликатов не будет.
Заключение
Теперь, когда вы будете добавлять адреса, динамически определяемые на основе валюты, ваши письма не будут дублироваться. Этот подход позволяет четко управлять получателями для уведомлений о новых заказах, улучшая функциональность вашего WooCommerce магазина.
Если у вас возникнут вопросы по коду или вы захотите добавить другие настройки, не стесняйтесь обращаться за помощью.