Статьи

Расширьте свои комментарии WordPress с помощью функции упоминания

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

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

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

упомянуть комментарии

Кодирование плагина

Все плагины WordPress представляют собой файлы PHP, расположенные в каталоге /wp-content/plugins/ . Здесь мы создаем файл PHP wp -host-plugin.php .

Далее мы включаем заголовок плагина, иначе WordPress не распознает наш плагин.

 <?php  

Теперь мы создаем класс плагина следующим образом:

 class wp_mention_plugin { //codes 

Все наши хуки действий и фильтров перейдут в метод initialize() , так как мы делаем это нашим конструктором, первым методом, вызываемым при создании экземпляра класса.

  public static function initialize() { add_filter( 'comment_text', array ( 'wp_mention_plugin', 'wpmp_mod_comment' ) ); add_action( 'wp_set_comment_status', array ( 'wp_mention_plugin', 'wpmp_approved' ), 10, 2 ); add_action( 'wp_insert_comment', array ( 'wp_mention_plugin', 'wpmp_no_approve' ), 10, 2 ); } 

Код Объяснение

Хук фильтра comment_text фильтрует текст комментариев для отображения. wp_set_comment_status действия wp_set_comment_status запускается сразу после изменения статуса комментария, а wp_insert_comment действия wp_insert_comment запускается сразу после wp_insert_comment комментария.

Мы будем стилизовать любое имя с предшествующим символом ‘@’ без кавычек, и поэтому нам нужен хук фильтра comment_text .

На сайтах WordPress, где комментарии проходят модерацию перед утверждением, нам нужен wp_set_comment_status действия wp_set_comment_status для отслеживания новых утвержденных комментариев для указанных авторов.

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

Теперь давайте создадим функции, вызываемые в нашем методе initialize() . Во-первых, wpmp_mod_comment()

  public static function wpmp_mod_comment( $comment ) { // we set our preferred @mention text color here $color_code = '#00BFFF'; $pattern = "/(^|\s)@(\w+)/"; $replacement = "<span style='color: $color_code;'>$0</span>"; $mod_comment = preg_replace( $pattern, $replacement, $comment ); return $mod_comment; } 

Здесь мы создаем метод wpmp_mod_comment() означающий: WP Mention Plugin Modify Comment . Функция принимает один параметр, который является комментарием, который мы модифицируем. Не беспокойтесь об этом параметре, WordPress обрабатывает его.

Переменная $pattern создает простой шаблон регулярного выражения, который определяет, упоминается ли @any__comment__author__name в каких-либо комментариях. Когда такие вещи, как admin @ sitepoint , включаются в комментарий, они не записываются в качестве действительного упоминания. Действительные упоминания будут оформлены в насыщенном небесно-голубом цвете.

Если вы хотите изменить цвет текста @mention, просто измените значение переменной $color_code .

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

  private static function wpmp_send_mail( $comment ) { $the_related_post = $comment->comment_post_ID; $the_related_comment = $comment->comment_ID; $the_related_post_url = get_permalink( $the_related_post ); $the_related_comment_url = get_comment_link( $the_related_comment ); // we get the mentions here $the_comment = $comment->comment_content; $pattern = "/(^|\s)@(\w+)/"; // if we find a match of the mention pattern if ( preg_match_all( $pattern, $the_comment, $match ) ) { // remove all @s from comment author names to effectively // generate appropriate email addresses of authors mentioned foreach ( $match as $m ) { $email_owner_name = preg_replace( '/@/', '', $m ); $email_owner_name = array_map( 'trim', $email_owner_name ); } /** * This part is for For full names, make comment authors replace spaces them with * two underscores. eg, John Doe would be mentioned as @John__Doe * * PS: Mentions are case insensitive */ if ( preg_match_all( '/\w+__\w+/', implode( '', $email_owner_name ) ) ) { $email_owner_name = str_ireplace( '__', ' ', $email_owner_name ); } // we generate all the mentioned comment author(s) email addresses $author_emails = array_map( 'self::wpmp_gen_email', $email_owner_name ); // ensure at least one valid comment author is mentioned before sending email if ( ! is_null( $author_emails ) ) { $subj = '[' . get_bloginfo( 'name' ) . '] Someone mentioned you in a comment'; $email_body = "Hello, someone mentioned you in a comment($the_related_comment_url)". " at MyBlog.com. Here is a link to the related post: $the_related_post_url"; wp_mail( $author_emails, $subj, $email_body ); } } } 

Код Объяснение

В вышеупомянутом методе мы фильтруем комментарий, чтобы проверить, упоминается ли кто-нибудь. И если true, мы удаляем предыдущий символ ‘@’ перед именем автора комментария, чтобы мы могли генерировать информацию об авторе комментария из базы данных, используя имя.

Иногда авторы комментариев вводят полные имена, например «Джон Доу», или имена с пробелами в качестве имени автора комментария. В подобных случаях любой, кто упоминает их, должен заменить пробелы в имени двойным подчеркиванием. Итак, начиная со строки if ( preg_match_all( '/\w+__\w+/', implode( '', $email_owner_name ) ) ) .... мы гарантируем, что все двойные подчеркивания в тексте @mention преобразуются в пробелы.

Затем мы генерируем указанный адрес электронной почты автора комментария, используя метод wpmp_gen_email() который мы wpmp_gen_email() следующим. $email_body и wp_mail() хранят и отправляют уведомление по электронной почте соответственно со ссылкой на соответствующий комментарий и сообщение.

П р и м е ч а н и е — Если вы заметили в кодах, упомянутые авторы комментариев и их адреса электронной почты хранятся в массиве, это на тот случай, если упоминается более одного автора комментариев.

Не забудьте изменить строку MyBlog.com в $email_body на нужное имя сайта.

  public static function wpmp_gen_email( $name ) { global $wpdb; $name = sanitize_text_field( $name ); $query = "SELECT comment_author_email FROM {$wpdb->comments} WHERE comment_author = %s "; $prepare_email_address = $wpdb->prepare( $query, $name ); $email_address = $wpdb->get_var( $prepare_email_address ); return $email_address; } 

Код Объяснение

Я много говорил об этом методе ранее, он просто генерирует упомянутое письмо автора комментария. Строковый параметр $name он принимает, является именем автора комментария. Затем он получает упомянутую информацию об авторе комментария из базы данных, используя имя автора комментария. Чтобы предотвратить атаку SQL, мы используем функцию WordPress prepare() чтобы обеспечить безопасную обработку запросов.

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

  public static function wpmp_approved( $comment_id, $status ) { $comment = get_comment( $comment_id, OBJECT ); ( $comment && $status == 'approve' ? self::wpmp_send_mail( $comment ) : null ); } public static function wpmp_no_approve( $comment_id, $comment_object ) { ( wp_get_comment_status( $comment_id ) == 'approved' ? self::wpmp_send_mail( $comment_object ) : null ); } 

wpmp_approved() сначала проверяет, wpmp_approved() ли комментарий с $comment_id удерживаемым для модерации, перед вызовом wpmp_send_mail() который отправляет уведомление по электронной почте.

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

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

 } $wp_mention_plugin = new wp_mention_plugin; $wp_mention_plugin->initialize(); ?> 

функция уведомления о плагине

Вывод

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

Вы можете скачать Atmention in Comment здесь , плагин, который я создал, который управляет интеграцией функций упоминания с несколькими дополнительными функциями. В противном случае вы можете проверить плагин: WP Mention Plugin code на GitHub.