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

Довольно удобный способ уведомления пользователей на почту о новых статьях без необходимости подключать какой-либо сервис типо feedburner или smartresponder.

Достаточно лишь того, что пользователь зарегистрирован у вас на блоге.

Никаких дополнительных плагинов не потребуется, достаточно вставить следующий код в functions.php:

function true_send_notification_mails($post_ID)  {
	$wp_user_search = new WP_User_Query( array( 'fields' => array('user_email') ) );
	$users = $wp_user_search->get_results();
	$user_emails = array();
	for ($i = 0; $i < count($users); $i++) {
		$user_emails[] = $users[$i]->user_email;
	} // endfor
	$user_emails = implode(",", $user_emails); // список емаилов через запятую
 
	$subject = "Опубликован новый пост на блоге " . get_bloginfo('name'); // тема
	$message = "Для того, чтобы прочитать новый пост, перейдите по ссылке <a href='" . get_permalink($post_ID) . "'>" . get_permalink($post_ID) . "</a>"; // сообщение
	$headers = "Content-type: text/html; charset=utf-8 \r\n"; // кодировка
	$headers .= "From: ". get_bloginfo('name') ." <no-reply@". ltrim(site_url(),'http://') .">\r\n"; // от
 
	mail($user_emails, $subject, $message, $headers );
	return $post_ID;
}
 
add_action('publish_post', 'true_send_notification_mails');

К содержимому сообщения нет никаких ограничений, если хотите, можете запихать сюда весь пост.

$message = get_the_content($post_ID);

По поводу картинок и прочего HTML из статьи не беспокойтесь — в письме это всё отобразится, но только без внешних CSS-стилей.

Смотрите также

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

  • Ольга16 ноября 2012 в 13:11 #

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

    • Миша16 ноября 2012 в 14:11 #

      Добрый день)
      1. чтобы пользователи были зареганы - нужно добавить либо форму регистрации(куда-нибудь в виджет например), либо ссылку на стандартную форму регистрации;
      2. отписаться сможет - если залогинится на сайте и в профиле своем поменяет email на ненастоящий, НО можно доработать профиль и добавить туда галочку, которая будет включать и отключать подписку :)

      • Ольга16 ноября 2012 в 17:11 #

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

      • Миша16 ноября 2012 в 22:11 #

        на крупных сайтах даже и на регистрацию ограничения бывают - по инвайтам только)

  • Виталий27 мая 2013 в 16:05 #

    Залил этот код в файл functions.php. Так сайт вообще перестал открываться, че за фигня. Пришлось полностью заменять файл functions.php

  • Александр29 июля 2014 в 11:07 #

    Михаил, добавил данный код в функции, но реакции ноль... Может опять что-то не так делаю?

    • Миша30 июля 2014 в 06:07 #

      Добрый день!
      Иногда письма не сразу приходят или попадают в папку спама - проверьте пожалуйста ещё раз, если нет, то видимо что-то в коде.

      • Александр30 июля 2014 в 07:07 #

        Да, Михаил, Вы правы, письма ушли в спам! Я конечно решил все с помощью плагина, но я учусь и хотел бы узнать, а можно как-то это исправить, отправку писем в спам?! Был бы очень признателен!

        Мне вот реализация на Вашем сайте очень нравится, просто и понятно!

        • Миша30 июля 2014 в 13:07 #

          Иногда от хостинга зависит - попробуйте спросить у суппорта.

          Мне вот реализация на Вашем сайте очень нравится, просто и понятно!

          Спасибо:) Реализация чего? Если вы про отправку писем со свежими постами, то они у меня через feedburner.

          • Александр30 июля 2014 в 15:07 #

            Не, я про отправку извещений о новых комментариях! О чек боксе над кнопкой "отправить"!

            • Миша30 июля 2014 в 18:07 #

              А, понятно) сам делал, но вроде и крутые плагины есть.

              Относительно пападания в папку спама — думаю надо либо поработать над содержимым письма, либо порешать что-то с хостингом.

  • Alex13 октября 2014 в 22:10 #

    Приветствую!

    Подскажите пожалуйста, возможно ли оставить в Получателях письма только один адрес получателя?
    Сейчас же получается, что в уведомлении о новом посте в поле "Кому" каждый подписчик видит emal'ы всех остальных подписчиков, через запятую..

    Спасибо.

    • Миша14 октября 2014 в 11:10 #

      Привет!
      Для этого нужно запустить функцию mail() в цикле отдельно для каждого адреса :)

      • Alex14 октября 2014 в 13:10 #

        К сожалению не силен в php, поэтому если не сложно, скажите, куда это вставить в код. Думаю многим вашим читателям будет интересно как это осуществить:)

        • Миша14 октября 2014 в 19:10 #

          Ну примерно вот так:

          function true_send_notification_mails($post_ID)  {
          	$subject = "Опубликован новый пост на блоге " . get_bloginfo('name'); // тема
          	$message = "Для того, чтобы прочитать новый пост, перейдите по ссылке <a href='" . get_permalink($post_ID) . "'>" . get_permalink($post_ID) . "</a>"; // сообщение
          	$headers = "Content-type: text/html; charset=utf-8 \r\n"; // кодировка
          	$headers .= "From: ". get_bloginfo('name') ." <no-reply@". ltrim(site_url(),'http://') .">\r\n"; // от
           
          	$wp_user_search = new WP_User_Query( array( 'fields' => array('user_email') ) );
          	$users = $wp_user_search->get_results();
          	$user_emails = array();
          	for ($i = 0; $i < count($users); $i++) {
          		mail($users[$i]->user_email, $subject, $message, $headers );
          	} // endfor
           
          	return $post_ID;
          }
           
          add_action('publish_post', 'true_send_notification_mails');
          • Alex14 октября 2014 в 21:10 #

            Так гораздо лучше, благодарю:)

          • никита8 марта 2015 в 22:03 #

            Добрый вечер, Михаил. я новичек в этих длах функция полезная и нужная скажите пожалуйста как туда добавить, свой банер, название поста.
            спасибо.

            • Миша9 марта 2015 в 08:03 #

              Добрый день!
              Там есть переменная $message — в неё всё и добавляем.

              • никита9 марта 2015 в 09:03 #

                Спасибо, конечно но как туда её добавить? вы немогли бы туда прописать это все. извините занаглость я полный ноль. Просто вставлял the_title() а уменя белый экран сразу.

                • Миша10 марта 2015 в 07:03 #

                  Если полный ноль, то надо это исправлять :)

                  $message = 'лалала' . get_the_title( $post->ID  ) . 'лалала';

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

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.