Статьи

Создание пользовательских комментариев по электронной почте: создание плагина

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

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

Поэтому в этой статье мы собираемся создать плагин, который позволит нам полностью настроить внешний вид электронных писем с комментариями. В конечном счете, это должно дать вам некоторое представление о том, как работают доступные хуки, что необходимо для настройки электронной почты и как вы можете использовать API WordPress для настройки содержимого ваших электронных писем.


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

Хотя весь этот проект доступен на GitHub для справки, я настоятельно рекомендую выполнить действия, описанные в этой статье, перед загрузкой рабочего плагина. В конце концов, оно предназначено для того, чтобы дать представление о том, когда что-то пошло не так, а не чтобы помочь вам прийти к заключению.

Первое, что нам нужно сделать, это настроить каталог для наших плагинов. Мы можем сделать это, создав каталог custom-comment-emails в wp-content/plugins .

Далее создайте следующие каталоги и файлы:

  • lang/
  • lang/plugin.po
  • plugin.php

Обратите внимание, что каталог lang будет использоваться для хранения наших файлов локализации для других, чтобы обеспечить переводы.

В plugin.po добавьте следующий текст:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
msgid «»
msgstr «»
«Project-Id-Version: Custom Comment Emails\n»
«Report-Msgid-Bugs-To: \n»
«POT-Creation-Date: 2012-12-05 14:17-0500\n»
«PO-Revision-Date: 2012-12-05 14:17-0500\n»
«Last-Translator: Tom McFarlin \n»
«Language-Team: Tom McFarlin \n»
«Language: en_US\n»
«MIME-Version: 1.0\n»
«Content-Type: text/plain; charset=UTF-8\n»
«Content-Transfer-Encoding: 8bit\n»
«X-Poedit-KeywordsList: __;_e\n»
«X-Poedit-Basepath: .\n»
«X-Poedit-SourceCharset: utf-8\n»
«X-Generator: Poedit 1.5.4\n»
«X-Poedit-SearchPath-0: ..\n»

Очевидно, вы захотите настроить это в соответствии со своими потребностями, но вы получите общее представление. После этого убедитесь, что вы захватили копию POEdit, так как мы будем использовать эту программу для генерации MO-файлов, которые используются для локализации.

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
Plugin Name: Custom Comment Emails
Plugin URI: http://github.com/tommcfarlin/custom-comment-emails/
Description: A plugin used to demonstrate how to create custom comment email notifications.
Version: 1.0
Author: Tom McFarlin
Author URI: http://tommcfarlin.com
License:
 
  Copyright 2012 Tom McFarlin ([email protected])
 
  This program is free software;
  it under the terms of the GNU General Public License, version 2, as
  published by the Free Software Foundation.
 
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY;
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  GNU General Public License for more details.
 
  You should have received a copy of the GNU General Public License
  along with this program;
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
*/
 
class Custom_Comment_Email {
 
    /*———————————————*
     * Constructor
     *———————————————*/
 
    /**
     * Initializes the plugin by setting localization, filters, and administration functions.
     */
    function __construct() {
        // TODO
    } // end constructor
 
    /*———————————————*
     * Localization
     *———————————————*/
 
    /**
     * Loads the plugin text domain for translation
     */
    function plugin_textdomain() {
        // TODO
    } // end plugin_textdomain
 
    /*———————————————*
     * Filters
     *———————————————*/
 
    /**
     * Sets the headers for the email being sent for the comment notification email.
     *
     * @since 1.0
     */
    function email_headers() {
        // TODO
    } // end email_headers
 
    /**
     * Creates the customized subject for the comment notification email.
     *
     * @param string $subject The content of the subject
     * @param int $comment_id The ID of the comment for which this subject is being sent
     * @return The subject line for the email
     * @since 1.0
     */
    function email_subject( $subject, $comment_id ) {
        // TODO
    } // end email_subject
 
    /**
     * Creates a customized, styled email used to notify users that they have a new comment.
     *
     * @param string $message The content of the email
     * @param int $comment_id The ID of the comment being left
     * @return The customized body content of the email
     * @since 1.0
     */
    function email_text( $message, $comment_id ) {
        // TODO
    } // end email_text
 
} // end class
 
new Custom_Comment_Email();

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


Первое, что нам нужно сделать, это подготовить конструктор. Напомним, что эта часть класса отвечает за инициализацию плагина, настройку информации о локализации и указание любых хуков.

Поскольку мы уже заглушили необходимые функции, должно быть легко следить за тем, что происходит, но для полноты предоставлены комментарии к коду.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
function __construct() {
 
    // Load plugin text domain
    add_action( ‘init’, array( $this, ‘plugin_textdomain’ ) );
 
    /* Set the filters for comment approval and the comment notification email.
     * For purposes of this example plugin, these will be the same email.
     * Though in a production environment, you’d naturally want to include the typical
     * ‘Approve,’ ‘Spam,’ and ‘Trash’ links.
     */
 
    // Moderation
    add_filter( ‘comment_moderation_headers’, array( $this, ’email_headers’ ) );
    add_filter( ‘comment_moderation_subject’, array( $this, ’email_subject’ ), 10, 2 );
    add_filter( ‘comment_moderation_text’, array( $this, ’email_text’ ), 10, 2 );
 
    // Notifications
    add_filter( ‘comment_notification_headers’, array( $this, ’email_headers’ ) );
    add_filter( ‘comment_notification_subject’, array( $this, ’email_subject’ ), 10, 2 );
    add_filter( ‘comment_notification_text’, array( $this, ’email_text’ ), 10, 2 );
 
} // end constructor

Короче говоря, мы указали функцию для установки textdomain плагина для целей локализации, и мы указали хуки, которые мы будем использовать. А именно, для модерации комментариев и уведомлений о комментариях.


Далее, давайте определим функцию, которая будет извлекать файлы локализации плагина из каталога lang который мы создали при инициализации этого плагина.

Это простой однострочный вызов, предоставляемый API WordPress.

1
2
3
4
5
6
/**
 * Loads the plugin text domain for translation
 */
public function plugin_textdomain() {
    load_plugin_textdomain( ‘custom-comment-email-locale’, false, dirname( plugin_basename( __FILE__ ) ) . ‘/lang’ );
} // end plugin_textdomain

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

Помимо этого, локализация хороша.


Перед тем, как мы на самом деле реализуем функциональность наших электронных писем с уведомлением, нам необходимо провести различие в импорте. В частности, нам нужно поговорить о разнице в письмах модераторов и в письмах с уведомлениями.

По умолчанию WordPress требует, чтобы любой оставленный комментарий был связан с адресом электронной почты, который не был распознан авторизованным. Это инициирует отправку электронного письма администратору сайта (или автору блога) для подтверждения комментария. С этого момента комментарии будут автоматически утверждены.

Тем не менее, WordPress позволяет администраторам отключать эту функцию модерации и позволять кому-либо оставлять комментарии независимо от того, сделали ли они это ранее.

Я поднимаю это, потому что это влияет на то, как мы будем разрабатывать этот плагин. Существует шесть хуков — три для модерации и три для уведомления — все они похожи в том, что они связаны с заголовком электронного письма, строкой темы и сообщением.

Крючки являются следующими:

  • comment_moderation_headers
  • comment_moderation_subject
  • comment_moderation_text
  • comment_notification_headers
  • comment_notification_subject
  • comment_notification_text

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

В производственной среде это не обязательно идеально; Тем не менее, чтобы продемонстрировать, как воспользоваться этими хуками и настроить электронную почту, это хорошо работает.

Во-первых, давайте начнем с простой задачи обновления темы письма. Для этого не требуется, чтобы мы работали с какой-либо разметкой (что, как вы скоро увидите, в некоторой степени является проблемой для почтовых клиентов), и это простая функция, которую мы можем легко настроить.

Для нашего примера давайте перепишем строку темы письма, чтобы она читалась так:

[Заголовок сообщения] Привет — Похоже, у вас есть новый комментарий!

Для этого найдите функцию email_subject а затем обновите ее, email_subject в нее следующее. Комментарии к коду предоставлены для полноты, но мы обсудим это чуть подробнее после функции:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
/**
 * Creates the customized subject for the comment notification email.
 *
 * @param string $subject The content of the subject
 * @param int $comment_id The ID of the comment for which this subject is being sent
 * @return The subject line for the email
 * @since 1.0
 */
function email_subject( $subject, $comment_id ) {
 
        // Create the subject line in the following format: «[Post Title] Hey There — Looks like you’ve got a new comment!»
        $subject = __( «[«, ‘custom-comment-email-locale’ ) .
        $subject .= » «;
        $subject .= __( «Hey There — Looks like you’ve got a new comment!», ‘custom-comment-email-locale’ );
 
        return $subject;
 
} // end filter_method_name

Обратите внимание, что функция принимает два параметра — тему и идентификатор комментария. Субъект — это исходный объект, который передается в функцию. Это полезно, если вы хотите добавить или добавить текст к строке темы, но мы собираемся написать наш собственный, чтобы он был перезаписан.

Параметр comment_ID полезен, потому что он позволяет нам извлекать различную информацию, такую ​​как сообщение, заголовок сообщения и т. Д., Просто используя идентификатор комментария.

Фактически, так мы получаем заголовок сообщения для строки темы. Обратите внимание, однако, что в нашем посте мы делаем вызов $this->get_post_title( $comment_id ) .

Это вспомогательная функция, которую мы определили, чтобы помочь нам легко получить заголовок сообщения, связанный с данным комментарием. Мы абстрагировали его в вспомогательную функцию, чтобы мы могли использовать его позже в плагине.

Вспомогательная функция проста:

01
02
03
04
05
06
07
08
09
10
11
12
13
/**
 * Retrieves the ID of the post associated with this comment.
 *
 * @param int $comment_id The ID of the comment that we’re using to get the post title
 * @return string The title of the comment’s post
 * @since 1.0
 */
private function get_post_title( $comment_id ) {
 
    $comment = get_comment( $comment_id );
    return get_the_title( $comment->comment_post_ID );
 
} // end get_post_title

Ясно, верно? Получите ссылку на объект комментария по указанному идентификатору, затем верните заголовок сообщения, связанного с идентификатором сообщения данного комментария.

На данный момент не стесняйтесь тестировать свой код. Предполагая, что вы выполнили действия, описанные в первой статье, у вас должна быть настройка среды разработки, которая отправляет электронные письма на ваш почтовый ящик.

Example Subject Line

Активируйте плагин, оставьте комментарий к записи, и вы должны увидеть новую тему.

Аккуратно, а?

Далее мы готовы начать на самом деле настройку текста электронной почты. В нашем плагине, давайте включим в письмо следующее:

  • Заголовок с надписью «Комментарий для [Заголовок сообщения]»
  • Область для содержимого с надписью «Исходное содержимое этого письма прочитано:», после чего мы добавим исходные комментарии
  • Простой нижний колонтитул, который обозначает, является ли это нормальным комментарием или трекбэком или пингбэком, и включает адрес электронной почты автора комментария

Мы также предоставим некоторые стили, чтобы продемонстрировать, как мы можем легко настроить внешний вид электронного письма.

Итак, найдите функцию email_text и email_text следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * Creates a customized, styled email used to notify users that they have a new comment.
 *
 * @param string $message The content of the email
 * @param int $comment_id The ID of the comment being left
 * @return The customized body content of the email
 * @since 1.0
 */
function email_text( $message, $comment_id ) {
 
    // Retrieve the comment
    $comment = get_comment( $comment_id );
 
    // Define the header
    $message = ‘<h1 style=»font-size 1.5em; display: block;»>’;
 $message .= __( ‘Comment For ‘, ‘custom-comment-email-locale’ );
 $message .= $this->get_post_title( $comment_id );
 $message .= ‘</h1>’;
 
    $message .= ‘<div style=»width: 100%; border-top: 1px solid #ededed; margin-bottom: 12px;»>’;
        $message .= ‘
<h3>’ .
 $message .= $comment->comment_content;
 $message .= ‘</div>
‘;
 
    // Determine what type of comment this is:
    $comment_type = __( ‘normal comment.’, ‘custom-comment-email-locale’ );
    if( » != $comment->comment_type ) {
        $comment_type = __( ‘trackback or a pingback.’, ‘custom-comment-email-locale’ );
    } // end if
 
    // And set the footer
    $message .= ‘<div style=»background: #ededed; border-top: 1px solid #ededed; padding: 4px; text-align: center;»>’;
 $message .= __( ‘This comment was left by ‘, ‘custom-comment-email-locale’ ) .
 $message .= __( ‘ | ‘, ‘custom-comment-email-locale’ );
 $message .= __( ‘This is a ‘, ‘custom-comment-email-locale’ ) .
 $message .= ‘</div>’;
 
    return $message;
 
} // end email_text

Хотя комментарии к коду должны быть относительно четкими, обратите внимание, что мы делаем следующее:

  • Получение комментария
  • Настройка заголовка для электронной почты (где мы также получаем заголовок сообщения, используя нашу вспомогательную функцию)
  • Написание исходного кода комментария
  • Определение нижнего колонтитула, который показывает тип комментария и автора комментария

Обратите внимание, что мы написали несколько встроенных стилей. Я предполагаю, что вы будете использовать Gmail в качестве почтового клиента при тестировании этих писем; однако каждый почтовый клиент обрабатывает стили по-своему, поэтому обязательно просмотрите эту диаграмму, если в конечном итоге вы сделаете это в некоторых из готовых к работе проектов.

Когда закончите, запустите другое письмо, и вы увидите что-то вроде следующего:

Text Based Emails

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

Чтобы отправлять стилизованные HTML-сообщения с использованием WordPress, нам нужно правильно настроить заголовки письма. Для этого обновите функцию email_headers чтобы она выглядела следующим образом:

1
2
3
4
5
6
7
8
/**
 * Sets the headers for the email being sent for the comment notification email.
 *
 * @since 1.0
 */
function email_headers() {
    add_filter( ‘wp_mail_content_type’, create_function( », ‘return «text/html»;’ ) );
} // end email_headers

Это информирует почтовый клиент на визуализацию контента в формате HTML. Если вы сделали это правильно, вы должны увидеть что-то вроде следующего:

HTML Email

Намного лучше!


Очевидно, что мы лишь поверхностно оценили, насколько мощной может быть настройка ваших электронных писем на WordPress, особенно если вы потратите время на создание приятной разметки, сложных стилей и так далее.

На мой взгляд, самая важная вещь, которую нужно понять, это как подключить фильтры, которые позволяют нам делать все вышеперечисленное.

Надеемся, что эта серия предоставила достаточно информации, чтобы начать. Не забудьте проверить плагин на GitHub , и удачи вам в этих электронных письмах!