Отправка административных email-уведомлений на несколько адресов

19 дек. 2014 г., 01:35:12
Просмотры: 14.2K
Голосов: 5

Есть ли хук, который позволит отправлять административные email-уведомления по умолчанию на несколько email-адресов?

Я хотел бы создать массив:

$adminEmails = array('me1@example.com', 'me2@example.com');

И чтобы все административные письма (например, уведомления о новых пользователях) отправлялись на адреса из $adminEmails

Возможно ли это?

1
Комментарии

Здесь есть обсуждение - похоже, решения пока нет: https://core.trac.wordpress.org/ticket/10726

Pat Gilmour Pat Gilmour
19 дек. 2014 г. 01:42:35
Все ответы на вопрос 3
1

Это можно сделать, отфильтровав функцию wp_mail, проверив, установлен ли параметр to на email администратора, и если да, добавить дополнительные email-адреса, а затем вернуть аргументы обратно в wp_mail

add_filter( 'wp_mail', 'my_custom_to_admin_emails' );

/**
 * Фильтр функции WP_Mail для добавления нескольких email-адресов администратора
 *
 *
 *
 * @param array $args Компактный массив аргументов wp_mail(), включая значения "to" email,
 *                    subject, message, headers и attachments.
 *
 * @return array
 */
function my_custom_to_admin_emails( $args ) {
    // Если параметр to не установлен (непонятно, почему так может быть), возвращаем аргументы
    if( ! isset($args['to']) || empty($args['to']) ) return $args;

    // Если TO является массивом email-адресов, значит, это, вероятно, не email администратора
    if( is_array( $args['to'] ) ) return $args;

    $admin_email = get_option( 'admin_email' );

    // Проверяем, найден ли email администратора в строке, так как TO может быть форматирован как 'Администратор <admin@domain.com>',
    // и если мы просто проверим, совпадает ли он с email, то можем пропустить некоторые email администратора.
    if( strpos( $args['to'], $admin_email ) !== FALSE ){
        // Устанавливаем параметр TO как массив, включая существующий email администратора и любые дополнительные email-адреса
        //
        // Все email-адреса, передаваемые в wp_mail() как параметр $to, должны соответствовать RFC 2822. Некоторые допустимые примеры:
        // user@example.com
        // Пользователь <user@example.com>
        $args['to'] = array( $args['to'], 'another@domain.com', 'Админ4 <admin4@domain.com>' );
    }

    return $args;
}

Мы возвращаем TO в виде массива, так как wp_mail обработает массив и при необходимости разобьёт его для отправки письма

16 мар. 2016 г. 23:24:51
Комментарии

Одна вещь, на которую стоит обратить внимание: если вы запрашиваете сброс пароля, и ваш email совпадает с опцией admin_email, то другие письма также будут приходить на этот адрес... просто имейте это в виду, система проверяет только поле TO при отправке писем, но не проверяет, должно ли это быть письмо для администратора (так как я пока не знаю, как это правильно реализовать)

sMyles sMyles
17 мар. 2016 г. 02:43:01
5

Попробуйте так:

update_option( 'admin_email', 'me1@example.com, me2@example.com' );

Обратите внимание, что значение должно быть строкой; используйте открывающие и закрывающие кавычки только один раз!

19 дек. 2014 г. 02:23:21
Комментарии

Спасибо @shanebp - но это не работает. Опция просто объединяет их в одну строку, поэтому отправка идет на: me1@example.comme2@example.com

Pat Gilmour Pat Gilmour
19 дек. 2014 г. 04:30:34

Жаль... Что касается уведомлений администратора о новых пользователях, эта функция заменяемая. Вы можете создать версию, которая отправляет письма на несколько жестко заданных email адресов. http://codex.wordpress.org/Function_Reference/wp_new_user_notification

shanebp shanebp
19 дек. 2014 г. 17:17:48

Спасибо shanebp - думаю, ваше предложение действительно лучшее решение для моей задачи.

Pat Gilmour Pat Gilmour
20 дек. 2014 г. 01:24:28

@PatGilmour Тогда, пожалуйста, отметьте это как решение.

kaiser kaiser
17 мар. 2016 г. 02:21:28

@PatGilmour Если исходный ответ неверен, вероятно, его не следует отмечать как правильный. Я бы либо отметил ответ sMyles как верный, либо обновил ответ shanebp с решением, предложенным в комментариях.

Simon East Simon East
12 янв. 2017 г. 03:52:33
0

Вот моё решение, которое использует фильтр update_option_*. Я считаю, что это правильный подход в данном случае. Добавьте этот код в плагин или файл functions.php вашей темы, затем вы сможете безопасно указывать несколько адресов электронной почты администратора через запятую в настройках (Настройки → Общие).

add_filter('pre_update_option_admin_email','sanitize_multiple_emails',10,2);

function sanitize_multiple_emails($value,$oldValue)
{
    // Если что-то подозрительное, доверяем WordPress продолжить как обычно
    if(!isset($_POST["admin_email"]))
        return $value;

    $result = "";
    $emails = explode(",",$_POST["admin_email"]);
    foreach($emails as $email)
    {
        $email = trim($email);
        $email = sanitize_email( $email );

        // Опять же, если что-то не так - позволим WordPress обработать как обычно
        if(!is_email($email))
            return $value;
        $result .= $email.",";

    }

    if(strlen($result == ""))
        return $value;
    $result = substr($result,0,-1);

    return $result;
}
1 апр. 2017 г. 00:22:14