wp_mail() — функция отправки email

Функция возвращает true в случае успешной отправки email, однако это не означает, что письмо будет получено и прочтено.

wp_mail( $to, $subject, $message, $headers = '', $attachments = array() )
$to
(строка|массив) получатель или получатели письма (в виде массива или через запятую). Обратите внимание, если вы укажете их через запятую, то каждый получатель письма увидит все email-адреса, на которые было выслано это письмо
$subject
(строка) тема сообщения
$message
(строка) текст сообщения, по умолчанию text/plain, это значит, что HTML-теги не поддерживаются, о том, как включить их поддержку, смотрите в примерах
$headers
(строка|массив) заголовки сообщения
$attachments
(строка|массив) вложения к письму, нужно указывать полный путь к файлам на сервере. Для того, чтобы вложить несколько файлов, используйте массив, либо строку, где путь к каждому файлу начинается с новой строки

Пример. Обычная отправка письма

Самый просто пример:

wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение');

Изменение имени и email отправителя

В WordPress по умолчанию в качестве отправителя письма выставляется «WordPress»,а в качестве его email «wordpress@truemisha.ru».

Я уже писал пост о том, как изменить стандартное имя и email отправителя для всех писем, отправляемых с блога на WordPress, а сейчас рассмотрим пример только для конкретного письма:

$headers = 'From: Миша <misha@truemisha.ru>' . "\r\n"; // в виде строки
wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение', $headers);

Использование HTML-тегов в письме

Для того, чтобы использовать HTML-теги в тексте сообщения, нужно изменить content-type письма на text/html, а это можно сделать двумя способами.

Через фильтр. В таком случае HTML-теги станет возможно использовать в любых письмах, отправляемых с блога, для этого нужно вставить в functions.php следующий код:

add_filter('wp_mail_content_type', create_function('', 'return "text/html";'));

Через заголовки. HTML-теги будут разрешены только для конкретного письма.

$headers[] = 'Content-type: text/html; charset=utf-8'; // в виде массива
wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение', $headers);

Изменение кодировки письма

Кодировка письма по умолчанию соответствует кодировке блога, но ее тоже можно изменить через заголовки (предыдущий пример) или через фильтр:

add_filter('wp_mail_charset', create_function('', 'return "utf-8";'));

В предыдущем примере (и по умолчанию тоже) WordPress отправляет письма юникодом, но таким способом вы спокойно можете изменить кодировку например на Windows-1251.

Отправка письма с измененными заголовками и вложениями

В данном случае обе переменные: $attachments и $headers — заданы в виде массива.

$attachments[] = WP_CONTENT_DIR . '/uploads/file_1.zip';
$attachments[] = WP_CONTENT_DIR . '/uploads/file_2.zip';
 
$headers[] = 'From: Миша <misha@truemisha.ru>';
$headers[] = 'Content-type: text/html; charset=utf-8';
 
wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение', $headers, $attachments);

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

  • Евгений5 ноября 2014 в 06:11 #

    Здравствуйте! очень полезный у Вас сайт! Я делетан в этом деле, но очень нравится! Подскажите правильный путь

    Я написал плагин интернет магазина, есть две проблемы, решаются они одинаково - это wp_update_post и wp_mail.

    Мне нужно что бы при оформлении заказа создавалась статья с контентентом состоящим из корзины товаров:

    Решение которое работает но не устраивает

    if (isset($_POST['buy'])) {
     	foreach ($_SESSION['goods'] as $key => $value) {
     	 	$array[] = get_the_post_thumbnail($key, 'thumbnail');
     	 	$array[] = get_the_title($key);
     	 	 }
     	 $content = serialize($array);
          $buy_post = array(
         'post_title' => '',
         'post_content' => $content,
         'post_status' => 'draft',
         'post_type' => 'orders'
          );
     
        $buy_ID = wp_insert_post( $buy_post );
     
          // Создаем массив данных
            $my_post = array();
            $my_post['ID'] = $buy_ID;
            $my_post['post_title'] = 'Заказ № '.$buy_ID;
          // Обновляем данные в БД
            wp_update_post( $my_post );
     
     }

    если так

    if (isset($_POST['buy'])) {
     	foreach ($_SESSION['goods'] as $key => $value) 
          // Создаем массив данных
            $my_post = array();
            $my_post['ID'] = $buy_ID;
            $my_post['post_title'] = 'Заказ № '.$buy_ID;
            $my_post['post_content'] = $value;
          // Обновляем данные в БД
            wp_update_post( $my_post );
       }
     }

    то соответственно записывает только последний перебор.

    Еще вариант подключить фаил в контент

    require_once SG_PLUGIN_PATH . 'cart/cart_action.php';

    но в контент записывает тупо 1.

    Задача: записать в контент таблицу со значениями из массива, аналогично и для wp_mail может что то подскажете, седых волос уже это прибавило!
    Спасибо!

  • Евгений5 ноября 2014 в 07:11 #

    это был первый вариант всю корзину в сессию но потом понял что достаточно только айди поста записать! Но если в сессию запишу, это же так же будет массив и его как то в разобраном виде нужно будет вставлять в контент! Может быть как то в базу напрямую можно записать? или я что то не знаю о сессиях?

  • Евгений5 ноября 2014 в 07:11 #

    сейчас в

    $_SESSION['goods']

    : кей - это айди поста а валуе - это количество купленного товара

  • Евгений5 ноября 2014 в 07:11 #

    может быть подскажете хук? что бы в базе контент ансерелизовать и разобрать массив!

  • Евгений6 ноября 2014 в 06:11 #

    Спасибо! придумал решение! add_post_meta
    Это не будет нагружать вордпресс? получается я каждый товар в заказе соханяю как произвольное поле! и с помощью джейквери делаю из этого красивую табличку!

  • Евгений6 ноября 2014 в 06:11 #

    не дадите ссылку по этому вопросу! честно говоря не изучал этот вопрос!

    • Миша6 ноября 2014 в 07:11 #

      Просто поставите плагин WP Super Cache и всё будет хорошо — это необходимо в том случае, если у вас будет большой поток посетителей, больше 500 в сутки.

  • Евгений6 ноября 2014 в 08:11 #

    Благодарю!

  • Александр4 декабря 2015 в 11:12 #

    Миша подскажи, отправляю через функцию wp_mail письма приходят на почту с другим временем, не с моим локальным указанным на сервере. Как можно это поправить?
    Чтобы письма приходили по правильному времени?
    Какие настройки указать с временной датой

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Vladislav: Подправил имеющийся у меня код, по вашим рекомендациям, миниатюры начали отображаться, но они стали очень огромными, что...

  • Миша: Лишь предложил решение. Думаю можно нашаманить и так, чтобы чисто для рубрик было, не уверен только, что обойдётся без и...

  • Алексей: так надо комментарии в рубриках, а не на страницах в category.php а не в page.php

  • Миша: Здравствуйте! Сам WordPress это не поддерживает, но можно пойти хитрым путём. Первое, что пришло мне в голову, это:...

  • Алексей: Миша, здравствуйте! Подскажите, пожалуйста, что нужно, чтобы сделать комментарии на страницах рубрик. Я когда то давно...