Вопрос или проблема
У меня есть код, который добавляет электронный адрес, хранящийся в полях 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). Однако проблема, с которой вы сталкиваетесь, связана с тем, как вы возвращаете получателя и как хук обрабатывает эти данные.
-
Текущий код:
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; }
-
Проблема дублирования:
Ваша проблема заключается в том, что вы замещаете переменную$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;
}
Ключевые изменения:
-
Объединение строк: Вместо замещения значения переменной
$recipient
, теперь мы добавляем новые адреса к существующим с помощью$recipient .= ', ' . $new_recipients;
. Это позволяет сохранить оба адреса — как стандартный, так и добавленный на основе валюты. -
Проверка существующих значений: Убедитесь, что при добавлении новых адресов вы не создаете лишних запятых или пробелов, если новая строка пустая.
Заключение
Используя этот подход, вы избежите ситуации с дублированием email-уведомлений. Убедитесь также, что все необходимые email-адреса корректно указаны в настройках и что фильтры WooCommerce работают должным образом. Эти изменения не только улучшат работу вашей системы уведомлений, но и повысят общую эффективность вашего интернет-магазина.