Вопрос или проблема
Я хотел бы настроить получателя нового заказа в WooCommerce. Согласно документации и различным примерам, я могу сделать это следующим образом:
function wc_change_admin_new_order_email_recipient( $recipient, $order ) {
global $woocommerce;
//некоторый код
return $recipient;
}
add_filter('woocommerce_email_recipient_new_order', 'wc_change_admin_new_order_email_recipient', 10, 2);
Однако я не могу заставить этот фильтр сработать на своем локальном компьютере для разработки, и не могу заставить сайт отправлять электронные письма о заказе, даже если этот код удален.
У меня есть рабочий локальный отладчик, и код останавливается в различных точках класса wc_email, однако он доходит до функции get_recipient только при изменении электронной почты администратора в админке.
Вот что я попробовал:
- отключил все остальные плагины
- убедился, что WordPress, WooCommerce, тема обновлены
- Некоторые файлы темы отображаются как не обновленные, но admin-new-order.php не включен в этот список
- admin-new-order.php в папке переопределений идентичен версии WooCommerce, поэтому я также пытался полностью удалить переопределение
- Функция сброса пароля отправляет мне электронное письмо на локальной системе (через Интернет), поэтому доставка электронной почты работает
Есть ли задача cron, используемая для доставки электронного письма администратора о новом заказе, и если да, как я могу ее запустить?
Есть ли еще идеи?
Уведомление о заказе для администратора отправляется как часть процесса уведомления о платеже – в данном случае Paypal IPN.
Чтобы протестировать это на локальном домене, самым лучшим способом было бы сгенерировать электронное письмо о заказе из списка заказов в админке.
Указанный выше код работает отлично.
Версия WordPress: 5.2.2
Версия WooCommerce: 3.7.0
Чтобы отправить статического получателя (переопределить по умолчанию)
add_filter( 'woocommerce_email_headers', 'hasan_headers_filter_function', 10, 2);
function hasan_headers_filter_function( $headers, $object ) {
$headers="Тестовый Дилер <[email protected]>";
return $headers;
}
Чтобы отправить дополнительного статического получателя вместе с администратором
add_filter( 'woocommerce_email_headers', 'hasan_headers_filter_function', 10, 2);
function hasan_headers_filter_function( $headers, $object ) {
$headers .= 'CC: Тестовый Дилер <[email protected]>' . "\r\n";
return $headers;
}
если вы хотите отправлять только когда заказ завершен
add_filter( 'woocommerce_email_headers', 'hasan_headers_filter_function', 10, 2);
function hasan_headers_filter_function( $headers, $object ) {
if ($object == 'customer_completed_order') {
$headers .= 'CC: Тестовый Дилер <[email protected]>' . "\r\n";
}
return $headers;
}
Ответ или решение
Проблемы с триггером woocommerce_email_recipient_new_order
Когда вы работаете с WooCommerce, возможность изменения получателя нового заказа через фильтр woocommerce_email_recipient_new_order
может быть крайне полезной. Однако, как вы уже заметили, данный фильтр может не срабатывать по различным причинам, которые мы попробуем разобрать в данной статье.
Возможные причины не срабатывания фильтра
-
Отсутствие триггера события отправки письма:
- Убедитесь, что событие, которое вызывает данный фильтр, действительно происходит. Например, фильтр
woocommerce_email_recipient_new_order
вызывается только при создании нового заказа и отправке уведомления. Если заказы создаются, но уведомления не отправляются, стоит проверить настройки уведомлений в WooCommerce.
- Убедитесь, что событие, которое вызывает данный фильтр, действительно происходит. Например, фильтр
-
Отладка конфигурации WooCommerce:
- Убедитесь, что ваше окружение настроено корректно. Вы упомянули, что другой электронный адрес (например, для восстановления пароля) отправляется, что указывает на работоспособность почтовой системы. Попробуйте создать тестовый заказ через интерфейс администратора и проверьте журнал заказов для поиска возможных ошибок.
-
Конфликт с другими плагинами:
- Хотя вы отключили все плагины, стоит еще раз проверить, не остался ли включённым какой-либо плагин, который обрабатывает уведомления о заказах. Некоторые плагины могут переопределять стандартные методы WooCommerce, включая отправку уведомлений.
-
Кастомные изменения темы:
- Если в вашей теме есть переопределения WooCommerce, такие как
admin-new-order.php
, убедитесь, что они не содержат ошибок и соответствуют стандартам платформы. Вы уже упоминали, что содержимое этого файла идентично стандартной версии, но стоит проверить другие файлы, которые могут влиять на логику отправки электронных писем.
- Если в вашей теме есть переопределения WooCommerce, такие как
-
Крон задачи и доступность расписаний:
- WooCommerce использует WP Cron для планирования задач, включая отправку электронных писем. Если вы работаете на локальном сервере, убедитесь, что WP Cron активен и работает корректно. Иногда необходимо выполнить тестовый заказ вручную или запустить крон-задачи. Вы можете воспользоваться плагинами, такими как WP Crontrol, для проверки задач WP Cron.
-
Логика обработки писем:
- Для дальнейшего исследования, добавьте временные сообщения в ваши хук-функции, чтобы понять, когда функция
wc_change_admin_new_order_email_recipient
вызывается. Например, используйтеerror_log
для записи сообщений в файл журнала:
function wc_change_admin_new_order_email_recipient( $recipient, $order ) { error_log('Triggered wc_change_admin_new_order_email_recipient!'); // Добавлено для отладки // Ваш код здесь return $recipient; }
- Для дальнейшего исследования, добавьте временные сообщения в ваши хук-функции, чтобы понять, когда функция
Альтернативные решения
Вместо того, чтобы зависеть от фильтра, можно попробовать непосредственно изменить заголовки электронных писем. Использование фильтра woocommerce_email_headers
может помочь вам гибко настраивать получателей:
add_filter( 'woocommerce_email_headers', 'customize_email_recipients', 10, 2 );
function customize_email_recipients( $headers, $object ) {
if ( $object instanceof WC_Order ) {
$headers .= 'CC: test@example.com' . "\r\n"; // Добавление дополнительного получателя
}
return $headers;
}
Заключение
Если фильтр woocommerce_email_recipient_new_order
не срабатывает, важно проверить все предыдущие этапы обработки заказов в WooCommerce. Внимательное внимание к деталям и методическая отладка помогут вам найти решение вашей проблемы. Не забывайте также о регулярном обновлении компонентов вашего окружения и наличии необходимых резервных копий.