Better Notifications for WordPress - Version 1.5.2

Version Description

  • 6th September 2016 =
  • Fixed: Custom User Roles were showing 0 users in the 'To' field.
  • Added: Generic CSS classes to BNFW admin.
  • Updated: German Translation to show English in certain places where translation text breaks the WP Admin UI.
  • Full code review and submission to WordPress VIP!
Download this release

Release Info

Developer voltronik
Plugin Icon 128x128 Better Notifications for WordPress
Version 1.5.2
Comparing to
See all releases

Code changes from version 1.5.1 to 1.5.2

README.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: voltronik
3
  Donate link: https://betternotificationsforwp.com/donate/
4
  Tags: notifications, email, mail, alerts, roles, user, users, admin, HTML, plain, wp_mail, shortcode, customize, post, page, updated, pending review, scheduled, category, tag, term, custom post type, comment, akismet, trackback, pingback, lost password, welcome, new user, bulk, notice, trigger, CC, BCC, from, author
5
  Requires at least: 3.5
6
- Tested up to: 4.5.3
7
- Stable tag: 1.5.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -178,6 +178,12 @@ An older version might work but this is untested. A lot of the newer features re
178
 
179
  == Changelog ==
180
 
 
 
 
 
 
 
181
  = 1.5.1 - 5th August July 2016 =
182
  * Fixed: 'Text' mode in the WYSIWYG editor didn't show any buttons when the BNFW Per-post Override Add-on was activated.
183
 
3
  Donate link: https://betternotificationsforwp.com/donate/
4
  Tags: notifications, email, mail, alerts, roles, user, users, admin, HTML, plain, wp_mail, shortcode, customize, post, page, updated, pending review, scheduled, category, tag, term, custom post type, comment, akismet, trackback, pingback, lost password, welcome, new user, bulk, notice, trigger, CC, BCC, from, author
5
  Requires at least: 3.5
6
+ Tested up to: 4.6
7
+ Stable tag: 1.5.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
178
 
179
  == Changelog ==
180
 
181
+ = 1.5.2 - 6th September 2016 =
182
+ * Fixed: Custom User Roles were showing 0 users in the 'To' field.
183
+ * Added: Generic CSS classes to BNFW admin.
184
+ * Updated: German Translation to show English in certain places where translation text breaks the WP Admin UI.
185
+ * Full code review and submission to WordPress VIP!
186
+
187
  = 1.5.1 - 5th August July 2016 =
188
  * Fixed: 'Text' mode in the WYSIWYG editor didn't show any buttons when the BNFW Per-post Override Add-on was activated.
189
 
assets/css/bnfw.css CHANGED
@@ -1,12 +1,20 @@
 
 
 
 
 
 
 
 
 
1
  #user-password-msg {
2
  display: none;
3
  }
4
 
5
- #user-password-msg div {
6
- background: #FFFFE1;
7
- padding: 15px;
8
- }
9
-
10
 
11
  /* Fix 'jump' when hovering over 'x' in select2 box */
12
  /*ul.select2-choices li.select2-search-choice a {
@@ -23,6 +31,6 @@
23
  line-height: 0;
24
  }
25
 
26
- ul.select2-selection__rendered {
27
- line-height: 1.3;
28
- }
1
+ /* Generic classes */
2
+ .hidden {
3
+ display: none;
4
+ }
5
+
6
+ .show {
7
+ display: block;
8
+ }
9
+
10
  #user-password-msg {
11
  display: none;
12
  }
13
 
14
+ #user-password-msg div {
15
+ background: #FFFFE1;
16
+ padding: 15px;
17
+ }
 
18
 
19
  /* Fix 'jump' when hovering over 'x' in select2 box */
20
  /*ul.select2-choices li.select2-search-choice a {
31
  line-height: 0;
32
  }
33
 
34
+ ul.select2-selection__rendered {
35
+ line-height: 1.3;
36
+ }
bnfw.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Better Notifications for WordPress
4
  * Plugin URI: https://wordpress.org/plugins/bnfw/
5
  * Description: Send customisable emails to your users for different WordPress notifications.
6
- * Version: 1.5.1
7
  * Author: Voltronik
8
  * Author URI: https://betternotificationsforwp.com/
9
  * Author Email: hello@betternotificationsforwp.com
@@ -188,7 +188,7 @@ class BNFW {
188
  public function plugin_action_links( $links, $file ) {
189
  $plugin_file = 'bnfw/bnfw.php';
190
  if ( $file == $plugin_file ) {
191
- $settings_link = '<a href="' . admin_url( 'edit.php?post_type=bnfw_notification&page=bnfw-settings' ) . '">' . 'Settings' . '</a>';
192
  array_unshift( $links, $settings_link );
193
  }
194
  return $links;
@@ -345,7 +345,8 @@ class BNFW {
345
  * @since 1.0
346
  */
347
  function on_lost_password() {
348
- $user = get_user_by( 'login', trim( $_POST['user_login'] ) );
 
349
  if ( $user ) {
350
  $this->send_notification( 'admin-password', $user->ID );
351
  }
@@ -355,6 +356,12 @@ class BNFW {
355
  * Change the title of the password reset email that is sent to the user.
356
  *
357
  * @since 1.1
 
 
 
 
 
 
358
  */
359
  public function change_password_email_title( $title, $user_login = '', $user_data = '' ) {
360
  $notifications = $this->notifier->get_notifications( 'user-password' );
@@ -378,6 +385,13 @@ class BNFW {
378
  * Change the message of the password reset email.
379
  *
380
  * @since 1.1
 
 
 
 
 
 
 
381
  */
382
  public function change_password_email_message( $message, $key, $user_login = '', $user_data = '' ) {
383
  $notifications = $this->notifier->get_notifications( 'user-password' );
3
  * Plugin Name: Better Notifications for WordPress
4
  * Plugin URI: https://wordpress.org/plugins/bnfw/
5
  * Description: Send customisable emails to your users for different WordPress notifications.
6
+ * Version: 1.5.2
7
  * Author: Voltronik
8
  * Author URI: https://betternotificationsforwp.com/
9
  * Author Email: hello@betternotificationsforwp.com
188
  public function plugin_action_links( $links, $file ) {
189
  $plugin_file = 'bnfw/bnfw.php';
190
  if ( $file == $plugin_file ) {
191
+ $settings_link = '<a href="' . esc_url( admin_url( 'edit.php?post_type=bnfw_notification&page=bnfw-settings' ) ) . '">' . esc_html__( 'Settings', 'bnfw' ) . '</a>';
192
  array_unshift( $links, $settings_link );
193
  }
194
  return $links;
345
  * @since 1.0
346
  */
347
  function on_lost_password() {
348
+ $user_login = sanitize_text_field( $_POST['user_login'] );
349
+ $user = get_user_by( 'login', $user_login );
350
  if ( $user ) {
351
  $this->send_notification( 'admin-password', $user->ID );
352
  }
356
  * Change the title of the password reset email that is sent to the user.
357
  *
358
  * @since 1.1
359
+ *
360
+ * @param string $title
361
+ * @param string $user_login
362
+ * @param string $user_data
363
+ *
364
+ * @return string
365
  */
366
  public function change_password_email_title( $title, $user_login = '', $user_data = '' ) {
367
  $notifications = $this->notifier->get_notifications( 'user-password' );
385
  * Change the message of the password reset email.
386
  *
387
  * @since 1.1
388
+ *
389
+ * @param string $message
390
+ * @param string $key
391
+ * @param string $user_login
392
+ * @param string $user_data
393
+ *
394
+ * @return string
395
  */
396
  public function change_password_email_message( $message, $key, $user_login = '', $user_data = '' ) {
397
  $notifications = $this->notifier->get_notifications( 'user-password' );
includes/admin/bnfw-settings.php CHANGED
@@ -11,13 +11,14 @@ function bnfw_admin_menu() {
11
  // New Notifications Sub-menu
12
  add_submenu_page(
13
  'edit.php?post_type=bnfw_notification',
14
- __( 'Notification Settings', 'bnfw' ),
15
- __( 'Settings', 'bnfw' ),
16
  'manage_options',
17
  'bnfw-settings',
18
  'bnfw_settings_page'
19
  );
20
  }
 
21
  // Add the Admin pages to the WordPress menu
22
  add_action( 'admin_menu', 'bnfw_admin_menu' );
23
  add_action( 'admin_menu', 'bnfw_menu_item_links', 12 );
@@ -33,22 +34,21 @@ add_action( 'admin_head', 'bnfw_menu_item_link_targets' );
33
  function bnfw_settings_page() {
34
  ob_start(); ?>
35
 
36
- <div class="wrap">
37
- <?php screen_icon(); ?>
38
- <h2><?php _e( 'BNFW Settings', 'bnfw' ); ?></h2>
39
 
40
- <form method="post" action="options.php" class="bnfw-form">
41
  <?php
42
- settings_errors();
43
- settings_fields( 'bnfw-settings' );
44
- do_settings_sections( 'bnfw-settings' );
45
 
46
- submit_button( 'Save Settings' );
47
  ?>
48
- </form>
49
- </div>
50
 
51
- <?php echo ob_get_clean();
52
  }
53
 
54
  /**
@@ -75,25 +75,25 @@ function bnfw_menu_item_links() {
75
  }
76
 
77
  function bnfw_menu_item_link_targets() {
78
- ?>
79
  <script type="text/javascript">
80
- jQuery(document).ready(function($) {
81
- // Documentation Link
82
- $('#bnfw-menu-item-documentation').parent().attr('target', '_blank');
83
- $('#bnfw-menu-item-documentation').hover(function() {
84
- $(this).css('color', '#a0e6f1');
85
- }, function() {
86
- $(this).css('color', '#73daeb');
87
- });
88
 
89
  // Add-ons Link
90
- $('#bnfw-menu-item-addons').parent().attr('target', '_blank');
91
- $('#bnfw-menu-item-addons').hover(function() {
92
- $(this).css('color', '#ff9b8c');
93
- }, function() {
94
- $(this).css('color', '#ff6f59');
95
- });
96
- });
97
  </script>
98
  <?php }
99
 
@@ -122,12 +122,12 @@ function bnfw_general_options() {
122
  // Suppress notifications for SPAM comments
123
  add_settings_field(
124
  'bnfw_suppress_spam', // Field ID
125
- __( 'Suppress SPAM comment notification', 'bnfw' ), // Label to the left
126
  'bnfw_suppress_spam_checkbox', // Name of function that renders options on the page
127
  'bnfw-settings', // Page to show on
128
  'bnfw_general_options_section', // Associate with which settings section?
129
  array(
130
- __( "Don't send notifications for comments marked as SPAM by Akismet", 'bnfw' )
131
  )
132
  );
133
 
@@ -140,16 +140,17 @@ function bnfw_general_options() {
140
  // Suppress notifications for SPAM comments
141
  add_settings_field(
142
  'bnfw_email_format', // Field ID
143
- __( 'Default Email Format', 'bnfw' ), // Label to the left
144
  'bnfw_email_format_radio', // Name of function that renders options on the page
145
  'bnfw-settings', // Page to show on
146
  'bnfw_general_options_section', // Associate with which settings section?
147
  array(
148
- __( 'This will apply to all emails sent out via WordPress, even those from other plugins. For more details, please see the <a href="https://wordpress.org/plugins/bnfw/faq/" target="_blank">FAQ</a>.', 'bnfw' )
149
  )
150
  );
151
 
152
  }
 
153
  add_action( 'admin_init', 'bnfw_general_options', 10 );
154
 
155
  /* ------------------------------------------------------------------------ *
@@ -159,7 +160,8 @@ add_action( 'admin_init', 'bnfw_general_options', 10 );
159
  /**
160
  *
161
  */
162
- function bnfw_general_options_callback() {}
 
163
 
164
  /* ------------------------------------------------------------------------ *
165
  * Settings Page - Settings Field Callbacks
@@ -169,31 +171,36 @@ function bnfw_general_options_callback() {}
169
  * Suppress SPAM checkbox.
170
  *
171
  * @since 1.0
172
- * @param unknown $args
 
173
  */
174
  function bnfw_suppress_spam_checkbox( $args ) {
175
- ?>
176
- <input type="checkbox" id="bnfw_suppress_spam" name="bnfw_suppress_spam" value="1" <?php checked( 1, get_option( 'bnfw_suppress_spam' ), true );?>>
177
- <label for="bnfw_suppress_spam"><?php echo $args[0]; ?></label>
178
- <?php
 
179
  }
180
 
181
  /**
182
  * Show email format radio
183
  *
184
  * @since 1.4
 
185
  * @param array $args
186
  */
187
  function bnfw_email_format_radio( $args ) {
188
  $email_format = get_option( 'bnfw_email_format', 'html' );
189
- ?>
190
  <label>
191
- <input type="radio" value="html" name="bnfw_email_format" <?php checked( $email_format, 'html', true ); ?>><?php _e( 'HTML Formatting', 'bnfw' ); ?>
 
192
  </label>
193
- <br />
194
  <label>
195
- <input type="radio" value="text" name="bnfw_email_format" <?php checked( $email_format, 'text', true ); ?>><?php _e( 'Plain Text', 'bnfw' ); ?>
 
196
  </label>
197
- <p><i><?php echo $args[0]; ?></i></p>
198
- <?php
199
  }
11
  // New Notifications Sub-menu
12
  add_submenu_page(
13
  'edit.php?post_type=bnfw_notification',
14
+ esc_html__( 'Notification Settings', 'bnfw' ),
15
+ esc_html__( 'Settings', 'bnfw' ),
16
  'manage_options',
17
  'bnfw-settings',
18
  'bnfw_settings_page'
19
  );
20
  }
21
+
22
  // Add the Admin pages to the WordPress menu
23
  add_action( 'admin_menu', 'bnfw_admin_menu' );
24
  add_action( 'admin_menu', 'bnfw_menu_item_links', 12 );
34
  function bnfw_settings_page() {
35
  ob_start(); ?>
36
 
37
+ <div class="wrap">
38
+ <h2><?php esc_html_e( 'BNFW Settings', 'bnfw' ); ?></h2>
 
39
 
40
+ <form method="post" action="options.php" class="bnfw-form">
41
  <?php
42
+ settings_errors();
43
+ settings_fields( 'bnfw-settings' );
44
+ do_settings_sections( 'bnfw-settings' );
45
 
46
+ submit_button( 'Save Settings' );
47
  ?>
48
+ </form>
49
+ </div>
50
 
51
+ <?php echo ob_get_clean();
52
  }
53
 
54
  /**
75
  }
76
 
77
  function bnfw_menu_item_link_targets() {
78
+ ?>
79
  <script type="text/javascript">
80
+ jQuery( document ).ready( function ( $ ) {
81
+ // Documentation Link
82
+ $( '#bnfw-menu-item-documentation' ).parent().attr( 'target', '_blank' );
83
+ $( '#bnfw-menu-item-documentation' ).hover( function () {
84
+ $( this ).css( 'color', '#a0e6f1' );
85
+ }, function () {
86
+ $( this ).css( 'color', '#73daeb' );
87
+ } );
88
 
89
  // Add-ons Link
90
+ $( '#bnfw-menu-item-addons' ).parent().attr( 'target', '_blank' );
91
+ $( '#bnfw-menu-item-addons' ).hover( function () {
92
+ $( this ).css( 'color', '#ff9b8c' );
93
+ }, function () {
94
+ $( this ).css( 'color', '#ff6f59' );
95
+ } );
96
+ } );
97
  </script>
98
  <?php }
99
 
122
  // Suppress notifications for SPAM comments
123
  add_settings_field(
124
  'bnfw_suppress_spam', // Field ID
125
+ esc_html__( 'Suppress SPAM comment notification', 'bnfw' ), // Label to the left
126
  'bnfw_suppress_spam_checkbox', // Name of function that renders options on the page
127
  'bnfw-settings', // Page to show on
128
  'bnfw_general_options_section', // Associate with which settings section?
129
  array(
130
+ esc_html__( "Don't send notifications for comments marked as SPAM by Akismet", 'bnfw' )
131
  )
132
  );
133
 
140
  // Suppress notifications for SPAM comments
141
  add_settings_field(
142
  'bnfw_email_format', // Field ID
143
+ esc_html__( 'Default Email Format', 'bnfw' ), // Label to the left
144
  'bnfw_email_format_radio', // Name of function that renders options on the page
145
  'bnfw-settings', // Page to show on
146
  'bnfw_general_options_section', // Associate with which settings section?
147
  array(
148
+ esc_html__( 'This will apply to all emails sent out via WordPress, even those from other plugins. For more details, please see the ', 'bnfw' ) . '<a href="https://wordpress.org/plugins/bnfw/faq/" target="_blank">FAQ</a>.'
149
  )
150
  );
151
 
152
  }
153
+
154
  add_action( 'admin_init', 'bnfw_general_options', 10 );
155
 
156
  /* ------------------------------------------------------------------------ *
160
  /**
161
  *
162
  */
163
+ function bnfw_general_options_callback() {
164
+ }
165
 
166
  /* ------------------------------------------------------------------------ *
167
  * Settings Page - Settings Field Callbacks
171
  * Suppress SPAM checkbox.
172
  *
173
  * @since 1.0
174
+ *
175
+ * @param $args
176
  */
177
  function bnfw_suppress_spam_checkbox( $args ) {
178
+ ?>
179
+ <input type="checkbox" id="bnfw_suppress_spam" name="bnfw_suppress_spam"
180
+ value="1" <?php checked( 1, get_option( 'bnfw_suppress_spam' ), true ); ?>>
181
+ <label for="bnfw_suppress_spam"><?php echo esc_html( $args[0] ); ?></label>
182
+ <?php
183
  }
184
 
185
  /**
186
  * Show email format radio
187
  *
188
  * @since 1.4
189
+ *
190
  * @param array $args
191
  */
192
  function bnfw_email_format_radio( $args ) {
193
  $email_format = get_option( 'bnfw_email_format', 'html' );
194
+ ?>
195
  <label>
196
+ <input type="radio" value="html"
197
+ name="bnfw_email_format" <?php checked( $email_format, 'html', true ); ?>><?php esc_html_e( 'HTML Formatting', 'bnfw' ); ?>
198
  </label>
199
+ <br/>
200
  <label>
201
+ <input type="radio" value="text"
202
+ name="bnfw_email_format" <?php checked( $email_format, 'text', true ); ?>><?php esc_html_e( 'Plain Text', 'bnfw' ); ?>
203
  </label>
204
+ <p><i><?php echo esc_html( $args[0] ); ?></i></p>
205
+ <?php
206
  }
includes/admin/class-bnfw-notification.php CHANGED
@@ -1,21 +1,20 @@
1
  <?php
 
2
  /**
3
  * BNFW Notification.
4
  *
5
  * @since 1.0
6
  */
7
-
8
  class BNFW_Notification {
9
 
10
- const POST_TYPE = 'bnfw_notification';
11
  const META_KEY_PREFIX = 'bnfw_';
12
- const TEST_MAIL_ARG = 'test-mail';
13
 
14
  /**
15
  *
16
  */
17
  public function __construct() {
18
-
19
  add_action( 'init', array( $this, 'register_post_type' ) );
20
  add_action( 'do_meta_boxes', array( $this, 'remove_meta_boxes' ) );
21
  add_action( 'add_meta_boxes_' . self::POST_TYPE, array( $this, 'add_meta_boxes' ) );
@@ -41,62 +40,62 @@ class BNFW_Notification {
41
  */
42
  public function register_post_type() {
43
  register_post_type( self::POST_TYPE, array(
44
- 'labels' => array(
45
- 'name' => __( 'Notifications', 'bnfw' ),
46
- 'singular_name' => __( 'Notification', 'bnfw' ),
47
- 'add_new' => __( 'Add New', 'bnfw' ),
48
- 'menu_name' => __( 'Notifications', 'bnfw' ),
49
- 'name_admin_bar' => __( 'Notifications', 'bnfw' ),
50
- 'add_new_item' => __( 'Add New Notification', 'bnfw' ),
51
- 'edit_item' => __( 'Edit Notification', 'bnfw' ),
52
- 'new_item' => __( 'New Notification', 'bnfw' ),
53
- 'view_item' => __( 'View Notification', 'bnfw' ),
54
- 'search_items' => __( 'Search Notifications', 'bnfw' ),
55
- 'not_found' => __( 'No Notifications found', 'bnfw' ),
56
- 'not_found_in_trash' => __( 'No Notifications found in trash', 'bnfw' ),
57
- 'all_items' => __( 'All Notifications', 'bnfw' )
58
- ),
59
- 'public' => false,
60
- 'show_in_nav_menus' => true,
61
- 'show_in_admin_bar' => true,
62
- 'has_archive' => false,
63
- 'show_ui' => true,
64
- 'show_in_menu' => true,
65
- 'menu_icon' => 'dashicons-email-alt',
66
- 'menu_position' => 100,
67
- 'rewrite' => false,
68
- 'map_meta_cap' => false,
69
- 'capabilities' => array(
70
-
71
- // meta caps (don't assign these to roles)
72
- 'edit_post' => 'manage_options',
73
- 'read_post' => 'manage_options',
74
- 'delete_post' => 'manage_options',
75
-
76
- // primitive/meta caps
77
- 'create_posts' => 'manage_options',
78
-
79
- // primitive caps used outside of map_meta_cap()
80
- 'edit_posts' => 'manage_options',
81
- 'edit_others_posts' => 'manage_options',
82
- 'publish_posts' => 'manage_options',
83
- 'read_private_posts' => 'manage_options',
84
-
85
- // primitive caps used inside of map_meta_cap()
86
- 'read' => 'manage_options',
87
- 'delete_posts' => 'manage_options',
88
- 'delete_private_posts' => 'manage_options',
89
- 'delete_published_posts' => 'manage_options',
90
- 'delete_others_posts' => 'manage_options',
91
- 'edit_private_posts' => 'manage_options',
92
- 'edit_published_posts' => 'manage_options',
93
- ),
94
 
95
- // What features the post type supports.
96
- 'supports' => array(
97
- 'title',
98
- ),
99
- ) );
100
  }
101
 
102
  /**
@@ -137,252 +136,298 @@ class BNFW_Notification {
137
  * Render the settings meta box.
138
  *
139
  * @since 1.0
140
- * @param unknown $post
 
141
  */
142
  public function render_settings_meta_box( $post ) {
143
- wp_nonce_field(
144
- // Action
145
- self::POST_TYPE,
146
- // Name.
147
- self::POST_TYPE . '_nonce'
148
- );
149
 
150
  $setting = $this->read_settings( $post->ID );
151
- ?>
152
- <table class="form-table">
153
- <tbody>
154
- <tr valign="top">
155
- <th scope="row">
156
- <label for="notification"><?php _e( 'Notification For', 'bnfw' ); ?></label>
157
- </th>
158
- <td>
159
- <select name="notification" id="notification" class="select2" data-placeholder="Select the notification type" style="width:75%">
160
- <optgroup label="WordPress Defaults">
161
- <option value="new-comment" <?php selected( 'new-comment', $setting['notification'] );?>><?php _e( 'New Comment / Awaiting Moderation', 'bnfw' ); ?></option>
162
- <option value="new-trackback" <?php selected( 'new-trackback', $setting['notification'] );?>><?php _e( 'New Trackback', 'bnfw' );?></option>
163
- <option value="new-pingback" <?php selected( 'new-pingback', $setting['notification'] );?>><?php _e( 'New Pingback', 'bnfw' );?></option>
164
- <option value="admin-password" <?php selected( 'admin-password', $setting['notification'] );?>><?php _e( 'Lost Password - For Admin', 'bnfw' );?></option>
165
- <option value="admin-user" <?php selected( 'admin-user', $setting['notification'] );?>><?php _e( 'New User Registration - For Admin', 'bnfw' );?></option>
166
- </optgroup>
167
- <optgroup label="Transactional">
168
- <option value="user-password" <?php selected( 'user-password', $setting['notification'] );?>><?php _e( 'Lost Password - For User', 'bnfw' );?></option>
169
- <option value="new-user" <?php selected( 'new-user', $setting['notification'] );?>><?php _e( 'New User Registration - For User', 'bnfw' );?></option>
170
- <option value="welcome-email" <?php selected( 'welcome-email', $setting['notification'] );?>><?php _e( 'New User - Post-registration Email', 'bnfw' );?></option>
171
- <option value="admin-role" <?php selected( 'admin-role', $setting['notification'] );?>><?php _e( 'User Role Changed - For Admin', 'bnfw' );?></option>
172
- <option value="user-role" <?php selected( 'user-role', $setting['notification'] );?>><?php _e( 'User Role Changed - For User', 'bnfw' );?></option>
173
- <option value="reply-comment" <?php selected( 'reply-comment', $setting['notification'] );?>><?php _e( 'Comment Reply', 'bnfw' );?></option>
174
- </optgroup>
175
- <optgroup label="Posts">
176
- <option value="new-post" <?php selected( 'new-post', $setting['notification'] );?>><?php _e( 'New Post Published', 'bnfw' );?></option>
177
- <option value="update-post" <?php selected( 'update-post', $setting['notification'] );?>><?php _e( 'Post Updated', 'bnfw' );?></option>
178
- <option value="pending-post" <?php selected( 'pending-post', $setting['notification'] );?>><?php _e( 'Post Pending Review', 'bnfw' );?></option>
179
- <option value="future-post" <?php selected( 'future-post', $setting['notification'] );?>><?php _e( 'Post Scheduled', 'bnfw' );?></option>
180
- <option value="newterm-category" <?php selected( 'newterm-category', $setting['notification'] );?>><?php _e( 'New Category', 'bnfw' ); ?></option>
181
- <option value="newterm-post_tag" <?php selected( 'newterm-post_tag', $setting['notification'] );?>><?php _e( 'New Tag', 'bnfw' ); ?></option>
182
- <?php do_action( 'bnfw_after_notification_options', 'post', 'Post', $setting ); ?>
183
- </optgroup>
184
- <optgroup label="Page">
185
- <option value="new-page" <?php selected( 'new-page', $setting['notification'] );?>><?php _e( 'New Page Published', 'bnfw' );?></option>
186
- <option value="update-page" <?php selected( 'update-page', $setting['notification'] );?>><?php _e( 'Page Updated', 'bnfw' );?></option>
187
- <option value="pending-page" <?php selected( 'pending-page', $setting['notification'] );?>><?php _e( 'Page Pending Review', 'bnfw' );?></option>
188
- <option value="future-page" <?php selected( 'future-page', $setting['notification'] );?>><?php _e( 'Page Scheduled', 'bnfw' );?></option>
189
- <option value="comment-page" <?php selected( 'comment-page', $setting['notification'] );?>><?php _e( 'Page - New Comment', 'bnfw' );?></option>
190
- <option value="commentreply-page" <?php selected( 'commentreply-page', $setting['notification'] );?>><?php _e( 'Page - Comment Reply', 'bnfw' );?></option>
191
- <?php do_action( 'bnfw_after_notification_options', 'page', 'Page', $setting ); ?>
192
- </optgroup>
193
- <?php
194
- $types = get_post_types( array(
195
- 'public' => true,
196
- '_builtin' => false,
197
- ), 'names'
198
- );
199
-
200
- foreach ( $types as $type ) {
201
- if ( $type != self::POST_TYPE ) {
202
- $post_obj = get_post_type_object( $type );
203
- $label = $post_obj->labels->singular_name;
204
- ?>
205
- <optgroup label="<?php printf( "%s - '%s'", __( 'Custom Post Type', 'bnfw' ), $label ); ?>">
206
- <option value="new-<?php echo $type; ?>" <?php selected( 'new-' . $type, $setting['notification'] );?>><?php echo __( 'New ', 'bnfw' ), "'$label'"; ?></option>
207
- <option value="update-<?php echo $type; ?>" <?php selected( 'update-' . $type, $setting['notification'] );?>><?php echo "'$label' " . __( 'Update ', 'bnfw' ); ?></option>
208
- <option value="pending-<?php echo $type; ?>" <?php selected( 'pending-' . $type, $setting['notification'] );?>><?php echo "'$label' ", __( 'Pending Review', 'bnfw' ); ?></option>
209
- <option value="future-<?php echo $type; ?>" <?php selected( 'future-' . $type, $setting['notification'] );?>><?php echo "'$label' ", __( 'Scheduled', 'bnfw' ); ?></option>
210
- <option value="comment-<?php echo $type; ?>" <?php selected( 'comment-' . $type, $setting['notification'] );?>><?php echo "'$label' ", __( 'New Comment', 'bnfw' ); ?></option>
211
- <option value="commentreply-<?php echo $type; ?>" <?php selected( 'commentreply-' . $type, $setting['notification'] );?>><?php echo "'$label' ", __( 'Comment Reply', 'bnfw' ); ?></option>
212
- <?php do_action( 'bnfw_after_notification_options', $type, $label, $setting ); ?>
213
- </optgroup>
214
- <?php
215
- }
216
- }
217
-
218
- $taxs = get_taxonomies( array(
219
- 'public' => true,
220
- '_builtin' => false,
221
- ), 'objects'
222
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
- if ( count( $taxs ) > 0 ) {
225
- ?>
226
- <optgroup label="<?php _e( 'Custom Taxonomy', 'bnfw' );?>">
227
- <?php
228
- foreach ( $taxs as $tax ) {
229
- $tax_name = 'newterm-' . $tax->name;
230
- ?>
231
- <option value="<?php echo $tax_name; ?>" <?php selected( $tax_name, $setting['notification'] );?>><?php printf( "%s '%s'", __( 'New', 'bnfw' ), $tax->labels->name ); ?></option>
232
- <?php
233
- }
234
- ?>
235
- </optgroup>
236
- <?php
237
- }
238
- ?>
239
- </select>
240
- </td>
241
- </tr>
242
-
243
- <?php do_action( 'bnfw_after_notification_dropdown', $setting ); ?>
244
-
245
- <tr valign="top" id="user-password-msg">
246
- <td>&nbsp;</td>
247
- <td>
248
- <div>
249
- <p style="margin-top: 0;"><?php esc_html_e( "This notification doesn't support additional email fields.", 'bnfw' ); ?></p>
250
- </div>
251
- </td>
252
- </tr>
253
-
254
- <tr valign="top" id="email-formatting">
255
- <th>
256
- <?php esc_attr_e( 'Email Formatting', 'bnfw' ); ?>
257
- </th>
258
- <td>
259
- <label style="margin-right: 20px;">
260
- <input type="radio" name="email-formatting" value="html" <?php checked( 'html', $setting['email-formatting'] ); ?>>
261
- <?php esc_html_e( 'HTML Formatting', 'bnfw' ); ?>
262
- </label>
 
 
 
 
 
 
 
 
 
 
263
 
264
- <label>
265
- <input type="radio" name="email-formatting" value="text" <?php checked( 'text', $setting['email-formatting'] ); ?>>
266
- <?php esc_html_e( 'Plain Text', 'bnfw' ); ?>
267
- </label>
268
- </td>
269
- </tr>
270
-
271
- <tr valign="top" id="toggle-fields">
272
- <th>
273
- <?php esc_attr_e( 'Additional Email Fields', 'bnfw' ); ?>
274
- </th>
275
- <td>
276
- <input type="checkbox" id="show-fields" name="show-fields" value="true" <?php checked( $setting['show-fields'], 'true', true ); ?>>
277
- <label for="show-fields"><?php esc_html_e( 'Set "From" Name & Email, CC, BCC', 'bnfw' ); ?></label>
278
- </td>
279
- </tr>
280
-
281
- <tr valign="top" id="email">
282
- <th scope="row">
283
- <?php _e( 'From Name and Email', 'bnfw' ); ?>
284
- </th>
285
- <td>
286
- <input type="text" name="from-name" value="<?php echo $setting['from-name']; ?>" placeholder="Site Name" style="width: 37.35%">
287
- <input type="email" name="from-email" value="<?php echo $setting['from-email']; ?>" placeholder="Admin Email" style="width: 37.3%">
288
- </td>
289
- </tr>
290
-
291
- <tr valign="top" id="cc">
292
- <th scope="row">
293
- <?php _e( 'CC', 'bnfw' ); ?>
294
- </th>
295
-
296
- <td>
297
- <select multiple name="cc[]" class="<?php echo bnfw_get_user_select_class(); ?>" data-placeholder="Select User Roles / Users" style="width:75%">
298
- <?php bnfw_render_users_dropdown( $setting['cc'] ); ?>
299
- </select>
300
- </td>
301
- </tr>
302
-
303
- <tr valign="top" id="bcc">
304
- <th scope="row">
305
- <?php _e( 'BCC', 'bnfw' ); ?>
306
- </th>
307
-
308
- <td>
309
- <select multiple name="bcc[]" class="<?php echo bnfw_get_user_select_class(); ?>" data-placeholder="Select User Roles / Users" style="width:75%">
310
- <?php bnfw_render_users_dropdown( $setting['bcc'] ); ?>
311
- </select>
312
- </td>
313
- </tr>
314
-
315
- <tr valign="top" id="post-author">
316
- <th> </th>
317
- <td>
318
- <label>
319
- <input type="checkbox" id="only-post-author" name="only-post-author" value="true" <?php checked( 'true', $setting['only-post-author'] ); ?>>
320
- <?php _e( 'Send this notification to the Author only', 'bnfw' ); ?>
321
- </label>
322
- </td>
323
- </tr>
324
-
325
- <tr valign="top" id="users">
326
- <th scope="row">
327
- <?php _e( 'Send To', 'bnfw' ); ?>
328
- </th>
329
- <td>
330
- <select multiple id="users-select" name="users[]" class="<?php echo bnfw_get_user_select_class(); ?>" data-placeholder="Select User Roles / Users" style="width:75%">
331
- <?php bnfw_render_users_dropdown( $setting['users'] ); ?>
332
- </select>
333
- </td>
334
- </tr>
335
-
336
- <tr valign="top" id="current-user">
337
- <th> </th>
338
- <td>
339
- <label>
340
- <input type="checkbox" name="disable-current-user" value="true" <?php checked( 'true', $setting['disable-current-user'] ); ?>>
341
- <?php _e( 'Disable this Notification for the User that triggered it', 'bnfw' ); ?>
342
- </label>
343
- </td>
344
- </tr>
345
-
346
- <tr valign="top">
347
- <th scope="row">
348
- <?php _e( 'Subject', 'bnfw' ); ?>
349
- </th>
350
- <td>
351
- <input type="text" name="subject" value="<?php echo esc_attr( $setting['subject'] ); ?>" style="width:75%;">
352
- </td>
353
- </tr>
354
-
355
- <tr valign="top">
356
- <th scope="row">
357
- <?php _e( 'Message Body', 'bnfw' ); ?>
358
- <div class="wp-ui-text-highlight">
359
- <p>
360
- <br />
361
- <span class="dashicons dashicons-editor-help"></span> <?php _e( 'Need some help?', 'bnfw' ); ?>
362
- </p>
363
- <p>
364
- <a href="https://betternotificationsforwp.com/documentation/?utm_source=WP%20Admin%20Notification%20Editor%20-%20'Documentation'&amp;utm_medium=referral" target="_blank" class="button-secondary"><?php _e( 'Documentation', 'bnfw' ); ?></a>
365
- </p>
366
- <p>
367
- <a href="" target="_blank" id="shortcode-help" class="button-secondary"><?php _e( 'Shortcode Help', 'bnfw' ); ?></a>
368
- </p>
369
- </div>
370
- </th>
371
- <td>
372
- <?php wp_editor( $setting['message'], 'notification_message', array( 'media_buttons' => true ) ); ?>
373
- <p> &nbsp; </p>
374
- <div id="disable-autop">
375
  <label>
376
- <input type="checkbox" name="disable-autop" value="true" <?php checked( 'true', $setting['disable-autop'] ); ?>>
377
- <?php _e( 'Stop additional paragraph and line break HTML from being inserted into my notifications', 'bnfw' ); ?>
 
378
  </label>
379
- </div>
380
- </td>
381
- </tr>
382
-
383
- </tbody>
384
- </table>
385
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
386
  }
387
 
388
  /**
@@ -424,7 +469,7 @@ class BNFW_Notification {
424
  wp_enqueue_style( 'bnfw', plugins_url( '../assets/css/bnfw.css', dirname( __FILE__ ) ), array( 'dashicons', 'select2' ), '0.1' );
425
 
426
  $strings = array(
427
- 'empty_user' => __( 'You must choose at least one User or User Role to send the notification to before you can save', 'bnfw' ),
428
  );
429
 
430
  wp_localize_script( 'bnfw', 'BNFW', $strings );
@@ -434,7 +479,8 @@ class BNFW_Notification {
434
  * Save the meta box's post metadata.
435
  *
436
  * @since 1.0
437
- * @param int $post_id The ID of the post being saved.
 
438
  */
439
  public function save_meta_data( $post_id ) {
440
  if ( self::POST_TYPE !== get_post_type( $post_id ) ) {
@@ -460,8 +506,8 @@ class BNFW_Notification {
460
  }
461
 
462
  $setting = array(
463
- 'notification' => $_POST['notification'],
464
- 'subject' => $_POST['subject'],
465
  'message' => $_POST['notification_message'],
466
  'disabled' => isset( $_POST['disabled'] ) ? sanitize_text_field( $_POST['disabled'] ) : 'false',
467
  'email-formatting' => isset( $_POST['email-formatting'] ) ? sanitize_text_field( $_POST['email-formatting'] ) : 'html',
@@ -472,15 +518,15 @@ class BNFW_Notification {
472
  );
473
 
474
  if ( isset( $_POST['users'] ) ) {
475
- $setting['users'] = $_POST['users'];
476
  }
477
 
478
  if ( isset( $_POST['show-fields'] ) && 'true' == $_POST['show-fields'] ) {
479
  $setting['show-fields'] = 'true';
480
  $setting['from-name'] = sanitize_text_field( $_POST['from-name'] );
481
  $setting['from-email'] = sanitize_email( $_POST['from-email'] );
482
- $setting['cc'] = isset( $_POST['cc'] ) ? $_POST['cc'] : '';
483
- $setting['bcc'] = isset( $_POST['bcc'] ) ? $_POST['bcc'] : '';
484
  } else {
485
  $setting['show-fields'] = 'false';
486
  }
@@ -490,7 +536,7 @@ class BNFW_Notification {
490
  $this->save_settings( $post_id, $setting );
491
 
492
  if ( isset( $_POST['send-test-email'] ) ) {
493
- if ( 'true' == $_POST['send-test-email'] ) {
494
  BNFW::factory()->engine->send_test_email( $setting );
495
  add_filter( 'redirect_post_location', array( $this, 'test_mail_sent' ) );
496
  }
@@ -512,25 +558,26 @@ class BNFW_Notification {
512
  * @since 1.3
513
  */
514
  public function admin_notices() {
515
- if ( isset( $_GET[self::TEST_MAIL_ARG ] ) ) {
516
- $screen = get_current_screen();
517
- if ( in_array( $screen->post_type, array( self::POST_TYPE ) ) ) {
518
- ?>
519
  <div class="updated below-h2">
520
- <p><?php echo __( 'Test Notification Sent.', 'bnfw' ); ?></p>
521
  </div>
522
- <?php
523
- }
524
- }
525
  }
526
 
527
  /**
528
  * Save settings in post meta.
529
  *
530
- * @since 1.0
531
  * @access private
532
- * @param unknown $post_id
533
- * @param unknown $setting
 
534
  */
535
  private function save_settings( $post_id, $setting ) {
536
  foreach ( $setting as $key => $value ) {
@@ -542,7 +589,9 @@ class BNFW_Notification {
542
  * Read settings from post meta.
543
  *
544
  * @since 1.0
 
545
  * @param int $post_id
 
546
  * @return array
547
  */
548
  public function read_settings( $post_id ) {
@@ -587,6 +636,7 @@ class BNFW_Notification {
587
  }
588
 
589
  $setting['id'] = $post_id;
 
590
  return $setting;
591
  }
592
 
@@ -594,11 +644,13 @@ class BNFW_Notification {
594
  * Change the post updated message for notification post type.
595
  *
596
  * @since 1.0
597
- * @param unknown $messages
598
- * @return unknown
 
 
599
  */
600
  public function post_updated_messages( $messages ) {
601
- $messages[ self::POST_TYPE ] = array_fill( 0, 11, __( 'Notification saved.', 'bnfw' ) );
602
 
603
  return $messages;
604
  }
@@ -607,74 +659,82 @@ class BNFW_Notification {
607
  * Render submit div meta box.
608
  *
609
  * @since 1.0
610
- * @param unknown $post
 
611
  */
612
  public function render_submitdiv( $post ) {
613
  global $post;
614
- ?>
615
- <div class="submitbox" id="submitpost">
616
 
617
- <?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key ?>
618
- <div style="display:none;">
619
- <?php submit_button( __( 'Save' ), 'button', 'save' ); ?>
620
- </div>
621
 
622
- <?php // Always publish. ?>
623
- <div class="disable-notification-checkbox" style="padding: 5px 0 10px 0;">
624
- <input type="hidden" name="post_status" id="hidden_post_status" value="publish">
625
 
626
- <?php
627
- $setting = $this->read_settings( $post->ID );
628
- ?>
629
- <label>
630
- <input type="checkbox" name="disabled" value="true" <?php checked( $setting['disabled'], 'true', true ); ?>><?php _e( 'Disable Notification', 'bnfw' ); ?>
631
- </label>
632
-
633
- <br>
634
- <br>
635
-
636
- <?php if ( 'publish' == $post->post_status ) { ?>
637
- <input type="hidden" name="send-test-email" id="send-test-email" value="false">
638
- <input name="test-email" type="submit" class="button button-secondary button-large" id="test-email" value="<?php esc_attr_e( 'Send Me a Test Email', 'bnfw' ); ?>">
639
- <?php } ?>
640
-
641
- </div>
642
-
643
- <div id="major-publishing-actions">
644
-
645
- <div id="delete-action">
646
- <?php
647
- if ( ! EMPTY_TRASH_DAYS ) {
648
- $delete_text = __( 'Delete Permanently', 'bnfw' );
649
- } else {
650
- $delete_text = __( 'Move to Trash', 'bnfw' );
651
- }
652
- ?>
653
- <a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post->ID ); ?>"><?php echo $delete_text; ?></a>
654
- </div>
655
-
656
- <div id="publishing-action">
657
- <span class="spinner"></span>
658
- <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e( 'Save' ) ?>">
659
- <input name="save" type="submit" class="button button-primary button-large" id="publish" accesskey="p" value="<?php esc_attr_e( 'Save' ) ?>">
660
- </div>
661
- <div class="clear"></div>
662
-
663
- </div>
664
- <!-- #major-publishing-actions -->
665
-
666
- <div class="clear"></div>
667
- </div>
668
- <!-- #submitpost -->
669
- <?php
 
 
 
 
 
670
  }
671
 
672
  /**
673
  * Get notifications based on type.
674
  *
675
  * @since 1.0
 
676
  * @param array|string $types
677
- * @param bool $exclude_disabled (optional) Whether to exclude disabled notifications or not. True by default.
 
678
  * @return array WP_Post objects
679
  */
680
  public function get_notifications( $types, $exclude_disabled = true ) {
@@ -683,7 +743,7 @@ class BNFW_Notification {
683
  }
684
 
685
  $args = array(
686
- 'post_type' => self::POST_TYPE,
687
  'meta_query' => array(
688
  array(
689
  'key' => self::META_KEY_PREFIX . 'notification',
@@ -702,7 +762,8 @@ class BNFW_Notification {
702
  }
703
 
704
  $wp_query = new WP_Query();
705
- $posts = $wp_query->query( $args );
 
706
  return $posts;
707
  }
708
 
@@ -711,8 +772,9 @@ class BNFW_Notification {
711
  *
712
  * @since 1.1
713
  *
714
- * @param string $type Notification Type.
715
- * @param bool $exclude_disabled (optional) Whether to exclude disabled notifications or not. True by default.
 
716
  * @return bool True if present, False otherwise
717
  */
718
  public function notification_exists( $type, $exclude_disabled = true ) {
@@ -728,16 +790,18 @@ class BNFW_Notification {
728
  /**
729
  * Custom columns for this post type.
730
  *
731
- * @since 1.0
732
  * @filter manage_{post_type}_posts_columns
733
- * @param array $columns
 
 
734
  * @return array
735
  */
736
  public function columns_header( $columns ) {
737
- $columns['type'] = __( 'Notification Type', 'bnfw' );
738
- $columns['disabled'] = __( 'Enabled?', 'bnfw' );
739
- $columns['subject'] = __( 'Subject', 'bnfw' );
740
- $columns['users'] = __( 'User Roles / Users', 'bnfw' );
741
 
742
  return $columns;
743
  }
@@ -745,17 +809,18 @@ class BNFW_Notification {
745
  /**
746
  * Custom column appears in each row.
747
  *
748
- * @since 1.0
749
  * @action manage_{post_type}_posts_custom_column
750
- * @param string $column Column name
751
- * @param int $post_id Post ID
 
752
  */
753
  public function custom_column_row( $column, $post_id ) {
754
  $setting = $this->read_settings( $post_id );
755
  switch ( $column ) {
756
  case 'disabled':
757
  if ( 'true' != $setting['disabled'] ) {
758
- printf('<span class="dashicons dashicons-yes"></span>');
759
  }
760
  break;
761
  case 'type':
@@ -766,7 +831,7 @@ class BNFW_Notification {
766
  break;
767
  case 'users':
768
  if ( 'true' === $setting['only-post-author'] ) {
769
- echo __( 'Author only', 'bnfw' );
770
  } else {
771
  $users = $this->get_names_from_users( $setting['users'] );
772
  echo implode( ', ', $users );
@@ -779,8 +844,8 @@ class BNFW_Notification {
779
  *
780
  * @since 1.3.9
781
  *
782
- * @param string $column Column name
783
- * @param int $post_id Post ID
784
  */
785
  do_action( 'bnfw_notification_table_column', $column, $post_id );
786
  }
@@ -791,9 +856,9 @@ class BNFW_Notification {
791
  * @since 1.2
792
  */
793
  private function get_names_from_users( $users ) {
794
- $email_list = array();
795
- $user_ids = array();
796
- $user_roles = array();
797
  $names_from_user_ids = array();
798
 
799
  foreach ( $users as $user ) {
@@ -817,66 +882,67 @@ class BNFW_Notification {
817
  /**
818
  * Get name of the notification based on slug.
819
  *
820
- * @param mixed $slug
 
821
  * @return unknown
822
  */
823
  private function get_notifications_name( $slug ) {
824
  $name = '';
825
  switch ( $slug ) {
826
  case 'new-comment':
827
- $name = __( 'New Comment', 'bnfw' );
828
  break;
829
  case 'new-trackback':
830
- $name = __( 'New Trackback', 'bnfw' );
831
  break;
832
  case 'new-pingback':
833
- $name = __( 'New Pingback', 'bnfw' );
834
  break;
835
  case 'reply-comment':
836
- $name = __( 'Comment Reply', 'bnfw' );
837
  break;
838
  case 'user-password':
839
- $name = __( 'Lost Password - For User', 'bnfw' );
840
  break;
841
  case 'admin-password':
842
- $name = __( 'Lost Password - For Admin', 'bnfw' );
843
  break;
844
  case 'new-user':
845
- $name = __( 'New User Registration - For User', 'bnfw' );
846
  break;
847
  case 'welcome-email':
848
- $name = __( 'New User - Post-registration Email', 'bnfw' );
849
  break;
850
  case 'admin-user':
851
- $name = __( 'New User Registration - For Admin', 'bnfw' );
852
  break;
853
  case 'user-role':
854
- $name = __( 'User Role Changed - For User', 'bnfw' );
855
  break;
856
  case 'admin-role':
857
- $name = __( 'User Role Changed - For Admin', 'bnfw' );
858
  break;
859
  case 'new-post':
860
- $name = __( 'New Post Published', 'bnfw' );
861
  break;
862
  case 'update-post':
863
- $name = __( 'Post Updated', 'bnfw' );
864
  break;
865
  case 'pending-post':
866
- $name = __( 'Post Pending Review', 'bnfw' );
867
  break;
868
  case 'future-post':
869
- $name = __( 'Post Scheduled', 'bnfw' );
870
  break;
871
  case 'newterm-category':
872
- $name = __( 'New Category', 'bnfw' );
873
  break;
874
  case 'newterm-post_tag':
875
- $name = __( 'New Tag', 'bnfw' );
876
  break;
877
  default:
878
- $splited = explode( '-', $slug );
879
- $label = $splited[1];
880
  $post_obj = get_post_type_object( $splited[1] );
881
 
882
  if ( null != $post_obj ) {
@@ -885,29 +951,29 @@ class BNFW_Notification {
885
 
886
  switch ( $splited[0] ) {
887
  case 'new':
888
- $name = __( 'New ', 'bnfw' ) . $label;
889
  break;
890
  case 'update':
891
- $name = __( 'Updated ', 'bnfw' ) . $label;
892
  break;
893
  case 'pending':
894
- $name = $label . __( ' Pending Review', 'bnfw' );
895
  break;
896
  case 'future':
897
- $name = $label . __( ' Scheduled', 'bnfw' );
898
  break;
899
  case 'comment':
900
- $name = $label . __( ' Comment', 'bnfw' );
901
  break;
902
  case 'commentreply':
903
- $name = $label . __( ' Comment Reply', 'bnfw' );
904
  break;
905
  case 'newterm':
906
  $tax = get_taxonomy( $splited[1] );
907
  if ( ! $tax ) {
908
- $name = __( 'New Term', 'bnfw' );
909
  } else {
910
- $name = __( 'New Term in ', 'bnfw' ) . $tax->labels->name;
911
  }
912
  break;
913
  }
@@ -922,9 +988,11 @@ class BNFW_Notification {
922
  /**
923
  * Custom row actions for this post type.
924
  *
925
- * @since 1.0
926
  * @filter post_row_actions
927
- * @param array $actions
 
 
928
  * @return array
929
  */
930
  public function custom_row_actions( $actions ) {
@@ -942,9 +1010,14 @@ class BNFW_Notification {
942
  * Find if a string starts with another string.
943
  *
944
  * @since 1.2
 
 
 
 
 
945
  */
946
  public function starts_with( $haystack, $needle ) {
947
  // search backwards starting from haystack length characters from the end
948
- return '' === $needle || strrpos( $haystack, $needle, -strlen( $haystack ) ) !== false;
949
  }
950
  }
1
  <?php
2
+
3
  /**
4
  * BNFW Notification.
5
  *
6
  * @since 1.0
7
  */
 
8
  class BNFW_Notification {
9
 
10
+ const POST_TYPE = 'bnfw_notification';
11
  const META_KEY_PREFIX = 'bnfw_';
12
+ const TEST_MAIL_ARG = 'test-mail';
13
 
14
  /**
15
  *
16
  */
17
  public function __construct() {
 
18
  add_action( 'init', array( $this, 'register_post_type' ) );
19
  add_action( 'do_meta_boxes', array( $this, 'remove_meta_boxes' ) );
20
  add_action( 'add_meta_boxes_' . self::POST_TYPE, array( $this, 'add_meta_boxes' ) );
40
  */
41
  public function register_post_type() {
42
  register_post_type( self::POST_TYPE, array(
43
+ 'labels' => array(
44
+ 'name' => esc_html__( 'Notifications', 'bnfw' ),
45
+ 'singular_name' => esc_html__( 'Notification', 'bnfw' ),
46
+ 'add_new' => esc_html__( 'Add New', 'bnfw' ),
47
+ 'menu_name' => esc_html__( 'Notifications', 'bnfw' ),
48
+ 'name_admin_bar' => esc_html__( 'Notifications', 'bnfw' ),
49
+ 'add_new_item' => esc_html__( 'Add New Notification', 'bnfw' ),
50
+ 'edit_item' => esc_html__( 'Edit Notification', 'bnfw' ),
51
+ 'new_item' => esc_html__( 'New Notification', 'bnfw' ),
52
+ 'view_item' => esc_html__( 'View Notification', 'bnfw' ),
53
+ 'search_items' => esc_html__( 'Search Notifications', 'bnfw' ),
54
+ 'not_found' => esc_html__( 'No Notifications found', 'bnfw' ),
55
+ 'not_found_in_trash' => esc_html__( 'No Notifications found in trash', 'bnfw' ),
56
+ 'all_items' => esc_html__( 'All Notifications', 'bnfw' )
57
+ ),
58
+ 'public' => false,
59
+ 'show_in_nav_menus' => true,
60
+ 'show_in_admin_bar' => true,
61
+ 'has_archive' => false,
62
+ 'show_ui' => true,
63
+ 'show_in_menu' => true,
64
+ 'menu_icon' => 'dashicons-email-alt',
65
+ 'menu_position' => 100,
66
+ 'rewrite' => false,
67
+ 'map_meta_cap' => false,
68
+ 'capabilities' => array(
69
+
70
+ // meta caps (don't assign these to roles)
71
+ 'edit_post' => 'manage_options',
72
+ 'read_post' => 'manage_options',
73
+ 'delete_post' => 'manage_options',
74
+
75
+ // primitive/meta caps
76
+ 'create_posts' => 'manage_options',
77
+
78
+ // primitive caps used outside of map_meta_cap()
79
+ 'edit_posts' => 'manage_options',
80
+ 'edit_others_posts' => 'manage_options',
81
+ 'publish_posts' => 'manage_options',
82
+ 'read_private_posts' => 'manage_options',
83
+
84
+ // primitive caps used inside of map_meta_cap()
85
+ 'read' => 'manage_options',
86
+ 'delete_posts' => 'manage_options',
87
+ 'delete_private_posts' => 'manage_options',
88
+ 'delete_published_posts' => 'manage_options',
89
+ 'delete_others_posts' => 'manage_options',
90
+ 'edit_private_posts' => 'manage_options',
91
+ 'edit_published_posts' => 'manage_options',
92
+ ),
93
 
94
+ // What features the post type supports.
95
+ 'supports' => array(
96
+ 'title',
97
+ ),
98
+ ) );
99
  }
100
 
101
  /**
136
  * Render the settings meta box.
137
  *
138
  * @since 1.0
139
+ *
140
+ * @param WP_Post $post
141
  */
142
  public function render_settings_meta_box( $post ) {
143
+ wp_nonce_field( self::POST_TYPE, self::POST_TYPE . '_nonce' );
 
 
 
 
 
144
 
145
  $setting = $this->read_settings( $post->ID );
146
+ ?>
147
+ <table class="form-table">
148
+ <tbody>
149
+ <tr valign="top">
150
+ <th scope="row">
151
+ <label for="notification"><?php esc_html_e( 'Notification For', 'bnfw' ); ?></label>
152
+ </th>
153
+ <td>
154
+ <select name="notification" id="notification" class="select2"
155
+ data-placeholder="Select the notification type" style="width:75%">
156
+ <optgroup label="WordPress Defaults">
157
+ <option
158
+ value="new-comment" <?php selected( 'new-comment', $setting['notification'] ); ?>><?php esc_html_e( 'New Comment / Awaiting Moderation', 'bnfw' ); ?></option>
159
+ <option
160
+ value="new-trackback" <?php selected( 'new-trackback', $setting['notification'] ); ?>><?php esc_html_e( 'New Trackback', 'bnfw' ); ?></option>
161
+ <option
162
+ value="new-pingback" <?php selected( 'new-pingback', $setting['notification'] ); ?>><?php esc_html_e( 'New Pingback', 'bnfw' ); ?></option>
163
+ <option
164
+ value="admin-password" <?php selected( 'admin-password', $setting['notification'] ); ?>><?php esc_html_e( 'Lost Password - For Admin', 'bnfw' ); ?></option>
165
+ <option
166
+ value="admin-user" <?php selected( 'admin-user', $setting['notification'] ); ?>><?php esc_html_e( 'New User Registration - For Admin', 'bnfw' ); ?></option>
167
+ </optgroup>
168
+ <optgroup label="Transactional">
169
+ <option
170
+ value="user-password" <?php selected( 'user-password', $setting['notification'] ); ?>><?php esc_html_e( 'Lost Password - For User', 'bnfw' ); ?></option>
171
+ <option
172
+ value="new-user" <?php selected( 'new-user', $setting['notification'] ); ?>><?php esc_html_e( 'New User Registration - For User', 'bnfw' ); ?></option>
173
+ <option
174
+ value="welcome-email" <?php selected( 'welcome-email', $setting['notification'] ); ?>><?php esc_html_e( 'New User - Post-registration Email', 'bnfw' ); ?></option>
175
+ <option
176
+ value="admin-role" <?php selected( 'admin-role', $setting['notification'] ); ?>><?php esc_html_e( 'User Role Changed - For Admin', 'bnfw' ); ?></option>
177
+ <option
178
+ value="user-role" <?php selected( 'user-role', $setting['notification'] ); ?>><?php esc_html_e( 'User Role Changed - For User', 'bnfw' ); ?></option>
179
+ <option
180
+ value="reply-comment" <?php selected( 'reply-comment', $setting['notification'] ); ?>><?php esc_html_e( 'Comment Reply', 'bnfw' ); ?></option>
181
+ </optgroup>
182
+ <optgroup label="Posts">
183
+ <option
184
+ value="new-post" <?php selected( 'new-post', $setting['notification'] ); ?>><?php esc_html_e( 'New Post Published', 'bnfw' ); ?></option>
185
+ <option
186
+ value="update-post" <?php selected( 'update-post', $setting['notification'] ); ?>><?php esc_html_e( 'Post Updated', 'bnfw' ); ?></option>
187
+ <option
188
+ value="pending-post" <?php selected( 'pending-post', $setting['notification'] ); ?>><?php esc_html_e( 'Post Pending Review', 'bnfw' ); ?></option>
189
+ <option
190
+ value="future-post" <?php selected( 'future-post', $setting['notification'] ); ?>><?php esc_html_e( 'Post Scheduled', 'bnfw' ); ?></option>
191
+ <option
192
+ value="newterm-category" <?php selected( 'newterm-category', $setting['notification'] ); ?>><?php esc_html_e( 'New Category', 'bnfw' ); ?></option>
193
+ <option
194
+ value="newterm-post_tag" <?php selected( 'newterm-post_tag', $setting['notification'] ); ?>><?php esc_html_e( 'New Tag', 'bnfw' ); ?></option>
195
+ <?php do_action( 'bnfw_after_notification_options', 'post', 'Post', $setting ); ?>
196
+ </optgroup>
197
+ <optgroup label="Page">
198
+ <option
199
+ value="new-page" <?php selected( 'new-page', $setting['notification'] ); ?>><?php esc_html_e( 'New Page Published', 'bnfw' ); ?></option>
200
+ <option
201
+ value="update-page" <?php selected( 'update-page', $setting['notification'] ); ?>><?php esc_html_e( 'Page Updated', 'bnfw' ); ?></option>
202
+ <option
203
+ value="pending-page" <?php selected( 'pending-page', $setting['notification'] ); ?>><?php esc_html_e( 'Page Pending Review', 'bnfw' ); ?></option>
204
+ <option
205
+ value="future-page" <?php selected( 'future-page', $setting['notification'] ); ?>><?php esc_html_e( 'Page Scheduled', 'bnfw' ); ?></option>
206
+ <option
207
+ value="comment-page" <?php selected( 'comment-page', $setting['notification'] ); ?>><?php esc_html_e( 'Page - New Comment', 'bnfw' ); ?></option>
208
+ <option
209
+ value="commentreply-page" <?php selected( 'commentreply-page', $setting['notification'] ); ?>><?php esc_html_e( 'Page - Comment Reply', 'bnfw' ); ?></option>
210
+ <?php do_action( 'bnfw_after_notification_options', 'page', 'Page', $setting ); ?>
211
+ </optgroup>
212
+ <?php
213
+ $types = get_post_types( array(
214
+ 'public' => true,
215
+ '_builtin' => false,
216
+ ), 'names'
217
+ );
218
+
219
+ foreach ( $types as $type ) {
220
+ if ( $type != self::POST_TYPE ) {
221
+ $post_obj = get_post_type_object( $type );
222
+ $label = $post_obj->labels->singular_name;
223
+ ?>
224
+ <optgroup
225
+ label="<?php esc_attr( printf( "%s - '%s'", esc_html__( 'Custom Post Type', 'bnfw' ), $label ) ); ?>">
226
+ <option
227
+ value="new-<?php echo esc_attr( $type ); ?>" <?php selected( 'new-' . $type, $setting['notification'] ); ?>><?php echo esc_html__( 'New ', 'bnfw' ), "'$label'"; ?></option>
228
+ <option
229
+ value="update-<?php echo esc_attr( $type ); ?>" <?php selected( 'update-' . $type, $setting['notification'] ); ?>><?php echo "'$label' " . esc_html__( 'Update ', 'bnfw' ); ?></option>
230
+ <option
231
+ value="pending-<?php echo esc_attr( $type ); ?>" <?php selected( 'pending-' . $type, $setting['notification'] ); ?>><?php echo "'$label' ", esc_html__( 'Pending Review', 'bnfw' ); ?></option>
232
+ <option
233
+ value="future-<?php echo esc_attr( $type ); ?>" <?php selected( 'future-' . $type, $setting['notification'] ); ?>><?php echo "'$label' ", esc_html__( 'Scheduled', 'bnfw' ); ?></option>
234
+ <option
235
+ value="comment-<?php echo esc_attr( $type ); ?>" <?php selected( 'comment-' . $type, $setting['notification'] ); ?>><?php echo "'$label' ", esc_html__( 'New Comment', 'bnfw' ); ?></option>
236
+ <option
237
+ value="commentreply-<?php echo esc_attr( $type ); ?>" <?php selected( 'commentreply-' . $type, $setting['notification'] ); ?>><?php echo "'$label' ", esc_html__( 'Comment Reply', 'bnfw' ); ?></option>
238
+ <?php do_action( 'bnfw_after_notification_options', $type, $label, $setting ); ?>
239
+ </optgroup>
240
+ <?php
241
+ }
242
+ }
243
 
244
+ $taxs = get_taxonomies(
245
+ array(
246
+ 'public' => true,
247
+ '_builtin' => false,
248
+ ),
249
+ 'objects'
250
+ );
251
+
252
+ if ( count( $taxs ) > 0 ) {
253
+ ?>
254
+ <optgroup label="<?php esc_html_e( 'Custom Taxonomy', 'bnfw' ); ?>">
255
+ <?php
256
+ foreach ( $taxs as $tax ) {
257
+ $tax_name = 'newterm-' . $tax->name;
258
+ ?>
259
+ <option
260
+ value="<?php echo esc_attr( $tax_name ); ?>" <?php selected( $tax_name, $setting['notification'] ); ?>><?php printf( "%s '%s'", esc_html__( 'New', 'bnfw' ), $tax->labels->name ); ?></option>
261
+ <?php
262
+ }
263
+ ?>
264
+ </optgroup>
265
+ <?php
266
+ }
267
+ ?>
268
+ </select>
269
+ </td>
270
+ </tr>
271
+
272
+ <?php do_action( 'bnfw_after_notification_dropdown', $setting ); ?>
273
+
274
+ <tr valign="top" id="user-password-msg">
275
+ <td>&nbsp;</td>
276
+ <td>
277
+ <div>
278
+ <p style="margin-top: 0;"><?php esc_html_e( "This notification doesn't support additional email fields.", 'bnfw' ); ?></p>
279
+ </div>
280
+ </td>
281
+ </tr>
282
+
283
+ <tr valign="top" id="email-formatting">
284
+ <th>
285
+ <?php esc_html_e( 'Email Formatting', 'bnfw' ); ?>
286
+ </th>
287
+ <td>
288
+ <label style="margin-right: 20px;">
289
+ <input type="radio" name="email-formatting"
290
+ value="html" <?php checked( 'html', $setting['email-formatting'] ); ?>>
291
+ <?php esc_html_e( 'HTML Formatting', 'bnfw' ); ?>
292
+ </label>
293
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
294
  <label>
295
+ <input type="radio" name="email-formatting"
296
+ value="text" <?php checked( 'text', $setting['email-formatting'] ); ?>>
297
+ <?php esc_html_e( 'Plain Text', 'bnfw' ); ?>
298
  </label>
299
+ </td>
300
+ </tr>
301
+
302
+ <tr valign="top" id="toggle-fields">
303
+ <th>
304
+ <?php esc_html_e( 'Additional Email Fields', 'bnfw' ); ?>
305
+ </th>
306
+ <td>
307
+ <input type="checkbox" id="show-fields" name="show-fields"
308
+ value="true" <?php checked( $setting['show-fields'], 'true', true ); ?>>
309
+ <label for="show-fields"><?php esc_html_e( 'Set "From" Name & Email, CC, BCC', 'bnfw' ); ?></label>
310
+ </td>
311
+ </tr>
312
+
313
+ <tr valign="top" id="email">
314
+ <th scope="row">
315
+ <?php esc_html_e( 'From Name and Email', 'bnfw' ); ?>
316
+ </th>
317
+ <td>
318
+ <input type="text" name="from-name" value="<?php echo esc_attr( $setting['from-name'] ); ?>"
319
+ placeholder="Site Name" style="width: 37.35%">
320
+ <input type="email" name="from-email" value="<?php echo esc_attr( $setting['from-email'] ); ?>"
321
+ placeholder="Admin Email" style="width: 37.3%">
322
+ </td>
323
+ </tr>
324
+
325
+ <tr valign="top" id="cc">
326
+ <th scope="row">
327
+ <?php esc_html_e( 'CC', 'bnfw' ); ?>
328
+ </th>
329
+
330
+ <td>
331
+ <select multiple name="cc[]" class="<?php echo sanitize_html_class( bnfw_get_user_select_class() ); ?>"
332
+ data-placeholder="Select User Roles / Users" style="width:75%">
333
+ <?php bnfw_render_users_dropdown( $setting['cc'] ); ?>
334
+ </select>
335
+ </td>
336
+ </tr>
337
+
338
+ <tr valign="top" id="bcc">
339
+ <th scope="row">
340
+ <?php esc_html_e( 'BCC', 'bnfw' ); ?>
341
+ </th>
342
+
343
+ <td>
344
+ <select multiple name="bcc[]" class="<?php echo sanitize_html_class( bnfw_get_user_select_class() ); ?>"
345
+ data-placeholder="Select User Roles / Users" style="width:75%">
346
+ <?php bnfw_render_users_dropdown( $setting['bcc'] ); ?>
347
+ </select>
348
+ </td>
349
+ </tr>
350
+
351
+ <tr valign="top" id="post-author">
352
+ <th></th>
353
+ <td>
354
+ <label>
355
+ <input type="checkbox" id="only-post-author" name="only-post-author"
356
+ value="true" <?php checked( 'true', $setting['only-post-author'] ); ?>>
357
+ <?php esc_html_e( 'Send this notification to the Author only', 'bnfw' ); ?>
358
+ </label>
359
+ </td>
360
+ </tr>
361
+
362
+ <tr valign="top" id="users">
363
+ <th scope="row">
364
+ <?php esc_html_e( 'Send To', 'bnfw' ); ?>
365
+ </th>
366
+ <td>
367
+ <select multiple id="users-select" name="users[]"
368
+ class="<?php echo sanitize_html_class( bnfw_get_user_select_class() ); ?>"
369
+ data-placeholder="Select User Roles / Users" style="width:75%">
370
+ <?php bnfw_render_users_dropdown( $setting['users'] ); ?>
371
+ </select>
372
+ </td>
373
+ </tr>
374
+
375
+ <tr valign="top" id="current-user">
376
+ <th></th>
377
+ <td>
378
+ <label>
379
+ <input type="checkbox" name="disable-current-user"
380
+ value="true" <?php checked( 'true', $setting['disable-current-user'] ); ?>>
381
+ <?php esc_html_e( 'Disable this Notification for the User that triggered it', 'bnfw' ); ?>
382
+ </label>
383
+ </td>
384
+ </tr>
385
+
386
+ <tr valign="top">
387
+ <th scope="row">
388
+ <?php esc_html_e( 'Subject', 'bnfw' ); ?>
389
+ </th>
390
+ <td>
391
+ <input type="text" name="subject" value="<?php echo esc_attr( $setting['subject'] ); ?>"
392
+ style="width:75%;">
393
+ </td>
394
+ </tr>
395
+
396
+ <tr valign="top">
397
+ <th scope="row">
398
+ <?php esc_html_e( 'Message Body', 'bnfw' ); ?>
399
+ <div class="wp-ui-text-highlight">
400
+ <p>
401
+ <br/>
402
+ <span
403
+ class="dashicons dashicons-editor-help"></span> <?php esc_html_e( 'Need some help?', 'bnfw' ); ?>
404
+ </p>
405
+ <p>
406
+ <a href="https://betternotificationsforwp.com/documentation/?utm_source=WP%20Admin%20Notification%20Editor%20-%20'Documentation'&amp;utm_medium=referral"
407
+ target="_blank" class="button-secondary"><?php esc_html_e( 'Documentation', 'bnfw' ); ?></a>
408
+ </p>
409
+ <p>
410
+ <a href="" target="_blank" id="shortcode-help"
411
+ class="button-secondary"><?php esc_html_e( 'Shortcode Help', 'bnfw' ); ?></a>
412
+ </p>
413
+ </div>
414
+ </th>
415
+ <td>
416
+ <?php wp_editor( $setting['message'], 'notification_message', array( 'media_buttons' => true ) ); ?>
417
+ <p> &nbsp; </p>
418
+ <div id="disable-autop">
419
+ <label>
420
+ <input type="checkbox" name="disable-autop"
421
+ value="true" <?php checked( 'true', $setting['disable-autop'] ); ?>>
422
+ <?php esc_html_e( 'Stop additional paragraph and line break HTML from being inserted into my notifications', 'bnfw' ); ?>
423
+ </label>
424
+ </div>
425
+ </td>
426
+ </tr>
427
+
428
+ </tbody>
429
+ </table>
430
+ <?php
431
  }
432
 
433
  /**
469
  wp_enqueue_style( 'bnfw', plugins_url( '../assets/css/bnfw.css', dirname( __FILE__ ) ), array( 'dashicons', 'select2' ), '0.1' );
470
 
471
  $strings = array(
472
+ 'empty_user' => esc_html__( 'You must choose at least one User or User Role to send the notification to before you can save', 'bnfw' ),
473
  );
474
 
475
  wp_localize_script( 'bnfw', 'BNFW', $strings );
479
  * Save the meta box's post metadata.
480
  *
481
  * @since 1.0
482
+ *
483
+ * @param int $post_id The ID of the post being saved.
484
  */
485
  public function save_meta_data( $post_id ) {
486
  if ( self::POST_TYPE !== get_post_type( $post_id ) ) {
506
  }
507
 
508
  $setting = array(
509
+ 'notification' => sanitize_text_field( $_POST['notification'] ),
510
+ 'subject' => sanitize_text_field( $_POST['subject'] ),
511
  'message' => $_POST['notification_message'],
512
  'disabled' => isset( $_POST['disabled'] ) ? sanitize_text_field( $_POST['disabled'] ) : 'false',
513
  'email-formatting' => isset( $_POST['email-formatting'] ) ? sanitize_text_field( $_POST['email-formatting'] ) : 'html',
518
  );
519
 
520
  if ( isset( $_POST['users'] ) ) {
521
+ $setting['users'] = array_map( 'sanitize_text_field', $_POST['users'] );
522
  }
523
 
524
  if ( isset( $_POST['show-fields'] ) && 'true' == $_POST['show-fields'] ) {
525
  $setting['show-fields'] = 'true';
526
  $setting['from-name'] = sanitize_text_field( $_POST['from-name'] );
527
  $setting['from-email'] = sanitize_email( $_POST['from-email'] );
528
+ $setting['cc'] = isset( $_POST['cc'] ) ? array_map( 'sanitize_text_field', $_POST['cc'] ) : '';
529
+ $setting['bcc'] = isset( $_POST['bcc'] ) ? array_map( 'sanitize_text_field', $_POST['bcc'] ) : '';
530
  } else {
531
  $setting['show-fields'] = 'false';
532
  }
536
  $this->save_settings( $post_id, $setting );
537
 
538
  if ( isset( $_POST['send-test-email'] ) ) {
539
+ if ( 'true' == sanitize_text_field( $_POST['send-test-email'] ) ) {
540
  BNFW::factory()->engine->send_test_email( $setting );
541
  add_filter( 'redirect_post_location', array( $this, 'test_mail_sent' ) );
542
  }
558
  * @since 1.3
559
  */
560
  public function admin_notices() {
561
+ if ( isset( $_GET[ self::TEST_MAIL_ARG ] ) ) {
562
+ $screen = get_current_screen();
563
+ if ( in_array( $screen->post_type, array( self::POST_TYPE ) ) ) {
564
+ ?>
565
  <div class="updated below-h2">
566
+ <p><?php echo esc_html__( 'Test Notification Sent.', 'bnfw' ); ?></p>
567
  </div>
568
+ <?php
569
+ }
570
+ }
571
  }
572
 
573
  /**
574
  * Save settings in post meta.
575
  *
576
+ * @since 1.0
577
  * @access private
578
+ *
579
+ * @param $post_id
580
+ * @param $setting
581
  */
582
  private function save_settings( $post_id, $setting ) {
583
  foreach ( $setting as $key => $value ) {
589
  * Read settings from post meta.
590
  *
591
  * @since 1.0
592
+ *
593
  * @param int $post_id
594
+ *
595
  * @return array
596
  */
597
  public function read_settings( $post_id ) {
636
  }
637
 
638
  $setting['id'] = $post_id;
639
+
640
  return $setting;
641
  }
642
 
644
  * Change the post updated message for notification post type.
645
  *
646
  * @since 1.0
647
+ *
648
+ * @param $messages
649
+ *
650
+ * @return mixed
651
  */
652
  public function post_updated_messages( $messages ) {
653
+ $messages[ self::POST_TYPE ] = array_fill( 0, 11, esc_html__( 'Notification saved.', 'bnfw' ) );
654
 
655
  return $messages;
656
  }
659
  * Render submit div meta box.
660
  *
661
  * @since 1.0
662
+ *
663
+ * @param $post
664
  */
665
  public function render_submitdiv( $post ) {
666
  global $post;
667
+ ?>
668
+ <div class="submitbox" id="submitpost">
669
 
670
+ <?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key ?>
671
+ <div style="display:none;">
672
+ <?php submit_button( esc_html__( 'Save' ), 'button', 'save' ); ?>
673
+ </div>
674
 
675
+ <?php // Always publish. ?>
676
+ <div class="disable-notification-checkbox" style="padding: 5px 0 10px 0;">
677
+ <input type="hidden" name="post_status" id="hidden_post_status" value="publish">
678
 
679
+ <?php
680
+ $setting = $this->read_settings( $post->ID );
681
+ ?>
682
+ <label>
683
+ <input type="checkbox" name="disabled"
684
+ value="true" <?php checked( $setting['disabled'], 'true', true ); ?>><?php esc_html_e( 'Disable Notification', 'bnfw' ); ?>
685
+ </label>
686
+
687
+ <br>
688
+ <br>
689
+
690
+ <?php if ( 'publish' == $post->post_status ) { ?>
691
+ <input type="hidden" name="send-test-email" id="send-test-email" value="false">
692
+ <input name="test-email" type="submit" class="button button-secondary button-large" id="test-email"
693
+ value="<?php esc_attr_e( 'Send Me a Test Email', 'bnfw' ); ?>">
694
+ <?php } ?>
695
+
696
+ </div>
697
+
698
+ <div id="major-publishing-actions">
699
+
700
+ <div id="delete-action">
701
+ <?php
702
+ if ( ! EMPTY_TRASH_DAYS ) {
703
+ $delete_text = esc_html__( 'Delete Permanently', 'bnfw' );
704
+ } else {
705
+ $delete_text = esc_html__( 'Move to Trash', 'bnfw' );
706
+ }
707
+ ?>
708
+ <a class="submitdelete deletion"
709
+ href="<?php echo esc_url( get_delete_post_link( $post->ID ) ); ?>"><?php echo esc_html( $delete_text ); ?></a>
710
+ </div>
711
+
712
+ <div id="publishing-action">
713
+ <span class="spinner"></span>
714
+ <input name="original_publish" type="hidden" id="original_publish"
715
+ value="<?php esc_attr_e( 'Save', 'bnfw' ); ?>">
716
+ <input name="save" type="submit" class="button button-primary button-large" id="publish"
717
+ accesskey="p" value="<?php esc_attr_e( 'Save', 'bnfw' ); ?>">
718
+ </div>
719
+ <div class="clear"></div>
720
+
721
+ </div>
722
+ <!-- #major-publishing-actions -->
723
+
724
+ <div class="clear"></div>
725
+ </div>
726
+ <!-- #submitpost -->
727
+ <?php
728
  }
729
 
730
  /**
731
  * Get notifications based on type.
732
  *
733
  * @since 1.0
734
+ *
735
  * @param array|string $types
736
+ * @param bool $exclude_disabled (optional) Whether to exclude disabled notifications or not. True by default.
737
+ *
738
  * @return array WP_Post objects
739
  */
740
  public function get_notifications( $types, $exclude_disabled = true ) {
743
  }
744
 
745
  $args = array(
746
+ 'post_type' => self::POST_TYPE,
747
  'meta_query' => array(
748
  array(
749
  'key' => self::META_KEY_PREFIX . 'notification',
762
  }
763
 
764
  $wp_query = new WP_Query();
765
+ $posts = $wp_query->query( $args );
766
+
767
  return $posts;
768
  }
769
 
772
  *
773
  * @since 1.1
774
  *
775
+ * @param string $type Notification Type.
776
+ * @param bool $exclude_disabled (optional) Whether to exclude disabled notifications or not. True by default.
777
+ *
778
  * @return bool True if present, False otherwise
779
  */
780
  public function notification_exists( $type, $exclude_disabled = true ) {
790
  /**
791
  * Custom columns for this post type.
792
  *
793
+ * @since 1.0
794
  * @filter manage_{post_type}_posts_columns
795
+ *
796
+ * @param array $columns
797
+ *
798
  * @return array
799
  */
800
  public function columns_header( $columns ) {
801
+ $columns['type'] = esc_html__( 'Notification Type', 'bnfw' );
802
+ $columns['disabled'] = esc_html__( 'Enabled?', 'bnfw' );
803
+ $columns['subject'] = esc_html__( 'Subject', 'bnfw' );
804
+ $columns['users'] = esc_html__( 'User Roles / Users', 'bnfw' );
805
 
806
  return $columns;
807
  }
809
  /**
810
  * Custom column appears in each row.
811
  *
812
+ * @since 1.0
813
  * @action manage_{post_type}_posts_custom_column
814
+ *
815
+ * @param string $column Column name
816
+ * @param int $post_id Post ID
817
  */
818
  public function custom_column_row( $column, $post_id ) {
819
  $setting = $this->read_settings( $post_id );
820
  switch ( $column ) {
821
  case 'disabled':
822
  if ( 'true' != $setting['disabled'] ) {
823
+ printf( '<span class="dashicons dashicons-yes"></span>' );
824
  }
825
  break;
826
  case 'type':
831
  break;
832
  case 'users':
833
  if ( 'true' === $setting['only-post-author'] ) {
834
+ echo esc_html__( 'Author only', 'bnfw' );
835
  } else {
836
  $users = $this->get_names_from_users( $setting['users'] );
837
  echo implode( ', ', $users );
844
  *
845
  * @since 1.3.9
846
  *
847
+ * @param string $column Column name
848
+ * @param int $post_id Post ID
849
  */
850
  do_action( 'bnfw_notification_table_column', $column, $post_id );
851
  }
856
  * @since 1.2
857
  */
858
  private function get_names_from_users( $users ) {
859
+ $email_list = array();
860
+ $user_ids = array();
861
+ $user_roles = array();
862
  $names_from_user_ids = array();
863
 
864
  foreach ( $users as $user ) {
882
  /**
883
  * Get name of the notification based on slug.
884
  *
885
+ * @param mixed $slug
886
+ *
887
  * @return unknown
888
  */
889
  private function get_notifications_name( $slug ) {
890
  $name = '';
891
  switch ( $slug ) {
892
  case 'new-comment':
893
+ $name = esc_html__( 'New Comment', 'bnfw' );
894
  break;
895
  case 'new-trackback':
896
+ $name = esc_html__( 'New Trackback', 'bnfw' );
897
  break;
898
  case 'new-pingback':
899
+ $name = esc_html__( 'New Pingback', 'bnfw' );
900
  break;
901
  case 'reply-comment':
902
+ $name = esc_html__( 'Comment Reply', 'bnfw' );
903
  break;
904
  case 'user-password':
905
+ $name = esc_html__( 'Lost Password - For User', 'bnfw' );
906
  break;
907
  case 'admin-password':
908
+ $name = esc_html__( 'Lost Password - For Admin', 'bnfw' );
909
  break;
910
  case 'new-user':
911
+ $name = esc_html__( 'New User Registration - For User', 'bnfw' );
912
  break;
913
  case 'welcome-email':
914
+ $name = esc_html__( 'New User - Post-registration Email', 'bnfw' );
915
  break;
916
  case 'admin-user':
917
+ $name = esc_html__( 'New User Registration - For Admin', 'bnfw' );
918
  break;
919
  case 'user-role':
920
+ $name = esc_html__( 'User Role Changed - For User', 'bnfw' );
921
  break;
922
  case 'admin-role':
923
+ $name = esc_html__( 'User Role Changed - For Admin', 'bnfw' );
924
  break;
925
  case 'new-post':
926
+ $name = esc_html__( 'New Post Published', 'bnfw' );
927
  break;
928
  case 'update-post':
929
+ $name = esc_html__( 'Post Updated', 'bnfw' );
930
  break;
931
  case 'pending-post':
932
+ $name = esc_html__( 'Post Pending Review', 'bnfw' );
933
  break;
934
  case 'future-post':
935
+ $name = esc_html__( 'Post Scheduled', 'bnfw' );
936
  break;
937
  case 'newterm-category':
938
+ $name = esc_html__( 'New Category', 'bnfw' );
939
  break;
940
  case 'newterm-post_tag':
941
+ $name = esc_html__( 'New Tag', 'bnfw' );
942
  break;
943
  default:
944
+ $splited = explode( '-', $slug );
945
+ $label = $splited[1];
946
  $post_obj = get_post_type_object( $splited[1] );
947
 
948
  if ( null != $post_obj ) {
951
 
952
  switch ( $splited[0] ) {
953
  case 'new':
954
+ $name = esc_html__( 'New ', 'bnfw' ) . $label;
955
  break;
956
  case 'update':
957
+ $name = esc_html__( 'Updated ', 'bnfw' ) . $label;
958
  break;
959
  case 'pending':
960
+ $name = $label . esc_html__( ' Pending Review', 'bnfw' );
961
  break;
962
  case 'future':
963
+ $name = $label . esc_html__( ' Scheduled', 'bnfw' );
964
  break;
965
  case 'comment':
966
+ $name = $label . esc_html__( ' Comment', 'bnfw' );
967
  break;
968
  case 'commentreply':
969
+ $name = $label . esc_html__( ' Comment Reply', 'bnfw' );
970
  break;
971
  case 'newterm':
972
  $tax = get_taxonomy( $splited[1] );
973
  if ( ! $tax ) {
974
+ $name = esc_html__( 'New Term', 'bnfw' );
975
  } else {
976
+ $name = esc_html__( 'New Term in ', 'bnfw' ) . $tax->labels->name;
977
  }
978
  break;
979
  }
988
  /**
989
  * Custom row actions for this post type.
990
  *
991
+ * @since 1.0
992
  * @filter post_row_actions
993
+ *
994
+ * @param array $actions
995
+ *
996
  * @return array
997
  */
998
  public function custom_row_actions( $actions ) {
1010
  * Find if a string starts with another string.
1011
  *
1012
  * @since 1.2
1013
+ *
1014
+ * @param $haystack
1015
+ * @param $needle
1016
+ *
1017
+ * @return bool
1018
  */
1019
  public function starts_with( $haystack, $needle ) {
1020
  // search backwards starting from haystack length characters from the end
1021
+ return '' === $needle || strrpos( $haystack, $needle, - strlen( $haystack ) ) !== false;
1022
  }
1023
  }
includes/engine/class-bnfw-engine.php CHANGED
@@ -11,6 +11,8 @@ class BNFW_Engine {
11
  * Send test email.
12
  *
13
  * @since 1.2
 
 
14
  */
15
  public function send_test_email( $setting ) {
16
  $subject = $setting['subject'];
@@ -120,21 +122,30 @@ class BNFW_Engine {
120
  public function send_comment_reply_email( $setting, $comment, $parent_comment ) {
121
  $comment_id = $comment->comment_ID;
122
 
123
- $subject = $this->handle_shortcodes( $setting['subject'], $setting['notification'], $comment_id );
124
- $message = $this->handle_shortcodes( $setting['message'], $setting['notification'], $comment_id );
 
 
 
 
125
 
126
- $headers = array();
127
- if ( 'html' == $setting['email-formatting'] ) {
128
- $headers[] = 'Content-type: text/html';
129
- }
130
 
131
- if ( 'true' != $setting['disable-autop'] && 'html' == $setting['email-formatting'] ) {
132
- $message = wpautop( $message );
133
- }
 
 
 
 
 
134
 
135
- $subject = $this->handle_global_user_shortcodes( $subject, $parent_comment->comment_author_email );
136
- $message = $this->handle_global_user_shortcodes( $message, $parent_comment->comment_author_email );
137
- wp_mail( $parent_comment->comment_author_email, stripslashes( $subject ), $message, $headers );
 
138
  }
139
 
140
  /**
@@ -361,9 +372,11 @@ class BNFW_Engine {
361
  * Handle comment shortcodes.
362
  *
363
  * @since 1.0
364
- * @param unknown $message
365
- * @param unknown $comment_id
366
- * @return unknown
 
 
367
  */
368
  private function comment_shortcodes( $message, $comment_id ) {
369
  $comment = get_comment( $comment_id );
@@ -392,9 +405,11 @@ class BNFW_Engine {
392
  * Handle user shortcodes.
393
  *
394
  * @since 1.0
395
- * @param unknown $message
396
- * @param unknown $user_id
397
- * @return unknown
 
 
398
  */
399
  public function user_shortcodes( $message, $user_id ) {
400
  $user_info = get_userdata( $user_id );
@@ -413,9 +428,9 @@ class BNFW_Engine {
413
  $message = str_replace( '[user_lastname]', $user_info->user_lastname, $message );
414
  $message = str_replace( '[nickname]', $user_info->nickname, $message );
415
  $message = str_replace( '[user_description]', $user_info->user_description, $message );
416
- $message = str_replace( '[user_avatar]', get_avatar_url( $user_id), $message );
417
- $message = str_replace( '[user_avatar]', get_avatar_url( $user_id), $message );
418
- $message = str_replace( '[commenter_avatar]', get_avatar_url( $user_id), $message );
419
 
420
  if ( is_array( $user_info->wp_capabilities ) ) {
421
  $message = str_replace( '[wp_capabilities]', implode( ',', $user_info->wp_capabilities ), $message );
@@ -430,6 +445,7 @@ class BNFW_Engine {
430
  *
431
  * @access private
432
  * @since 1.1
 
433
  * @param string $message
434
  * @param string $taxonomy
435
  * @param int $term_id
@@ -513,11 +529,13 @@ class BNFW_Engine {
513
  * Get emails from users.
514
  *
515
  * @since 1.2
516
- * @param array $users Users Array
517
- * @param int $exclude User id to exclude
 
 
 
518
  */
519
  public function get_emails_from_users( $users, $exclude = null ) {
520
- $email_list = array();
521
  $user_ids = array();
522
  $user_roles = array();
523
 
@@ -547,8 +565,10 @@ class BNFW_Engine {
547
  * Get user emails by user ids.
548
  *
549
  * @since 1.0
550
- * @param mixed $user_ids
551
- * @return unknown
 
 
552
  */
553
  private function get_emails_from_id( $user_ids ) {
554
  $email_list = array();
@@ -577,10 +597,12 @@ class BNFW_Engine {
577
  $email_list = array();
578
  foreach ( $roles as $role ) {
579
  $role_name = $this->get_role_name_by_label( $role );
580
- $users = get_users( array(
 
581
  'role' => $role_name,
582
  'fields' => array( 'user_email', 'ID' ),
583
- ) );
 
584
 
585
  foreach ( $users as $user ) {
586
  if ( null != $exclude ) {
@@ -599,6 +621,11 @@ class BNFW_Engine {
599
  * Find if a string starts with another string.
600
  *
601
  * @since 1.2
 
 
 
 
 
602
  */
603
  private function starts_with( $haystack, $needle ) {
604
  // search backwards starting from haystack length characters from the end
@@ -608,13 +635,14 @@ class BNFW_Engine {
608
  /**
609
  * Get User role name by label.
610
  *
611
- * @param mixed $role_label
612
- * @return unknown
 
613
  */
614
  protected function get_role_name_by_label( $role_label ) {
615
  global $wp_roles;
616
  foreach ( $wp_roles->roles as $role_name => $role_info ) {
617
- if ( $role_label == $role_info['name'] ) {
618
  return $role_name;
619
  }
620
  }
11
  * Send test email.
12
  *
13
  * @since 1.2
14
+ *
15
+ * @param array $setting
16
  */
17
  public function send_test_email( $setting ) {
18
  $subject = $setting['subject'];
122
  public function send_comment_reply_email( $setting, $comment, $parent_comment ) {
123
  $comment_id = $comment->comment_ID;
124
 
125
+ /**
126
+ * BNFW - Whether notification is disabled?
127
+ *
128
+ * @since 1.3.6
129
+ */
130
+ $notification_disabled = apply_filters( 'bnfw_notification_disabled', false, $comment_id, $setting );
131
 
132
+ if ( ! $notification_disabled ) {
133
+ $subject = $this->handle_shortcodes( $setting['subject'], $setting['notification'], $comment_id );
134
+ $message = $this->handle_shortcodes( $setting['message'], $setting['notification'], $comment_id );
 
135
 
136
+ $headers = array();
137
+ if ( 'html' == $setting['email-formatting'] ) {
138
+ $headers[] = 'Content-type: text/html';
139
+ }
140
+
141
+ if ( 'true' != $setting['disable-autop'] && 'html' == $setting['email-formatting'] ) {
142
+ $message = wpautop( $message );
143
+ }
144
 
145
+ $subject = $this->handle_global_user_shortcodes( $subject, $parent_comment->comment_author_email );
146
+ $message = $this->handle_global_user_shortcodes( $message, $parent_comment->comment_author_email );
147
+ wp_mail( $parent_comment->comment_author_email, stripslashes( $subject ), $message, $headers );
148
+ }
149
  }
150
 
151
  /**
372
  * Handle comment shortcodes.
373
  *
374
  * @since 1.0
375
+ *
376
+ * @param string $message String to be processed.
377
+ * @param int $comment_id Comment id.
378
+ *
379
+ * @return string Processed string.
380
  */
381
  private function comment_shortcodes( $message, $comment_id ) {
382
  $comment = get_comment( $comment_id );
405
  * Handle user shortcodes.
406
  *
407
  * @since 1.0
408
+ *
409
+ * @param string $message String to be processed.
410
+ * @param int $user_id User id.
411
+ *
412
+ * @return string Processed string.
413
  */
414
  public function user_shortcodes( $message, $user_id ) {
415
  $user_info = get_userdata( $user_id );
428
  $message = str_replace( '[user_lastname]', $user_info->user_lastname, $message );
429
  $message = str_replace( '[nickname]', $user_info->nickname, $message );
430
  $message = str_replace( '[user_description]', $user_info->user_description, $message );
431
+ $message = str_replace( '[user_avatar]', get_avatar_url( $user_id ), $message );
432
+ $message = str_replace( '[user_avatar]', get_avatar_url( $user_id ), $message );
433
+ $message = str_replace( '[commenter_avatar]', get_avatar_url( $user_id ), $message );
434
 
435
  if ( is_array( $user_info->wp_capabilities ) ) {
436
  $message = str_replace( '[wp_capabilities]', implode( ',', $user_info->wp_capabilities ), $message );
445
  *
446
  * @access private
447
  * @since 1.1
448
+ *
449
  * @param string $message
450
  * @param string $taxonomy
451
  * @param int $term_id
529
  * Get emails from users.
530
  *
531
  * @since 1.2
532
+ *
533
+ * @param array $users Users Array
534
+ * @param int $exclude User id to exclude
535
+ *
536
+ * @return array
537
  */
538
  public function get_emails_from_users( $users, $exclude = null ) {
 
539
  $user_ids = array();
540
  $user_roles = array();
541
 
565
  * Get user emails by user ids.
566
  *
567
  * @since 1.0
568
+ *
569
+ * @param array $user_ids.
570
+ *
571
+ * @return array Emails.
572
  */
573
  private function get_emails_from_id( $user_ids ) {
574
  $email_list = array();
597
  $email_list = array();
598
  foreach ( $roles as $role ) {
599
  $role_name = $this->get_role_name_by_label( $role );
600
+ $users = get_users(
601
+ array(
602
  'role' => $role_name,
603
  'fields' => array( 'user_email', 'ID' ),
604
+ )
605
+ );
606
 
607
  foreach ( $users as $user ) {
608
  if ( null != $exclude ) {
621
  * Find if a string starts with another string.
622
  *
623
  * @since 1.2
624
+ *
625
+ * @param $haystack
626
+ * @param $needle
627
+ *
628
+ * @return bool
629
  */
630
  private function starts_with( $haystack, $needle ) {
631
  // search backwards starting from haystack length characters from the end
635
  /**
636
  * Get User role name by label.
637
  *
638
+ * @param mixed $role_label
639
+ *
640
+ * @return int|string
641
  */
642
  protected function get_role_name_by_label( $role_label ) {
643
  global $wp_roles;
644
  foreach ( $wp_roles->roles as $role_name => $role_info ) {
645
+ if ( $role_label == $role_info['name'] || $role_name == $role_label ) {
646
  return $role_name;
647
  }
648
  }
includes/helpers/ajax-helpers.php CHANGED
@@ -16,22 +16,22 @@ function bnfw_search_users() {
16
  $roles_data = array();
17
  $user_count = count_users();
18
  $roles = $wp_roles->get_names();
19
- foreach ( $roles as $role ) {
20
  $count = 0;
21
- if ( isset( $user_count['avail_roles'][ strtolower( $role ) ] ) ) {
22
- $count = $user_count['avail_roles'][ strtolower( $role ) ];
23
  }
24
 
25
  $roles_data[] = array(
26
- 'id' => 'role-' . $role,
27
- 'text' => $role . ' (' . $count . ' Users)',
28
  );
29
  }
30
 
31
  $data = array(
32
  array(
33
  'id' => 1,
34
- 'text' => __( 'User Roles', 'bnfw' ),
35
  'children' => $roles_data,
36
  ),
37
  );
@@ -54,7 +54,7 @@ function bnfw_search_users() {
54
 
55
  $data[] = array(
56
  'id' => 2,
57
- 'text' => __( 'Users', 'bnfw' ),
58
  'children' => $user_data,
59
  );
60
 
16
  $roles_data = array();
17
  $user_count = count_users();
18
  $roles = $wp_roles->get_names();
19
+ foreach ( $roles as $role_slug => $role_name ) {
20
  $count = 0;
21
+ if ( isset( $user_count['avail_roles'][ $role_slug ] ) ) {
22
+ $count = $user_count['avail_roles'][ $role_slug ];
23
  }
24
 
25
  $roles_data[] = array(
26
+ 'id' => 'role-' . $role_slug,
27
+ 'text' => $role_name . ' (' . $count . ' Users)',
28
  );
29
  }
30
 
31
  $data = array(
32
  array(
33
  'id' => 1,
34
+ 'text' => esc_html__( 'User Roles', 'bnfw' ),
35
  'children' => $roles_data,
36
  ),
37
  );
54
 
55
  $data[] = array(
56
  'id' => 2,
57
+ 'text' => esc_html__( 'Users', 'bnfw' ),
58
  'children' => $user_data,
59
  );
60
 
includes/helpers/helpers.php CHANGED
@@ -26,6 +26,8 @@ function bnfw_get_user_select_class() {
26
  * Render users dropdown.
27
  *
28
  * @since 1.3.6
 
 
29
  */
30
  function bnfw_render_users_dropdown( $selected_users ) {
31
  global $wp_roles;
@@ -36,13 +38,20 @@ function bnfw_render_users_dropdown( $selected_users ) {
36
  <?php
37
  $roles = $wp_roles->get_names();
38
 
39
- foreach ( $roles as $role ) {
40
- $selected = selected( true, in_array( 'role-' . $role, $selected_users ), false );
 
 
 
 
 
 
 
41
  $count = 0;
42
- if ( isset( $user_count['avail_roles'][ strtolower( $role ) ] ) ) {
43
- $count = $user_count['avail_roles'][ strtolower( $role ) ];
44
  }
45
- echo '<option value="role-', $role, '" ', $selected, '>', $role, ' (', $count, ' Users)', '</option>';
46
  }
47
  ?>
48
  </optgroup>
@@ -66,7 +75,7 @@ function bnfw_render_users_dropdown( $selected_users ) {
66
 
67
  foreach ( $users as $user ) {
68
  $selected = selected( true, in_array( $user->ID, $selected_users ), false );
69
- echo '<option value="', $user->ID, '" ', $selected, '>', $user->user_login, '</option>';
70
  }
71
  }
72
 
26
  * Render users dropdown.
27
  *
28
  * @since 1.3.6
29
+ *
30
+ * @param $selected_users
31
  */
32
  function bnfw_render_users_dropdown( $selected_users ) {
33
  global $wp_roles;
38
  <?php
39
  $roles = $wp_roles->get_names();
40
 
41
+ foreach ( $roles as $role_slug => $role_name ) {
42
+ $selected = selected( true, in_array( 'role-' . $role_slug, $selected_users ), false );
43
+
44
+ // Compatibility code, which will be eventually removed.
45
+ $selected_old = selected( true, in_array( 'role-' . $role_name, $selected_users ), false );
46
+ if ( ! empty( $selected_old ) ) {
47
+ $selected = $selected_old;
48
+ }
49
+
50
  $count = 0;
51
+ if ( isset( $user_count['avail_roles'][ $role_slug ] ) ) {
52
+ $count = $user_count['avail_roles'][ $role_slug ];
53
  }
54
+ echo '<option value="role-', esc_attr( $role_slug ), '" ', $selected, '>', esc_html( $role_name ), ' (', $count, ' Users)', '</option>';
55
  }
56
  ?>
57
  </optgroup>
75
 
76
  foreach ( $users as $user ) {
77
  $selected = selected( true, in_array( $user->ID, $selected_users ), false );
78
+ echo '<option value="', esc_attr( $user->ID ), '" ', $selected, '>', esc_html( $user->user_login ), '</option>';
79
  }
80
  }
81
 
includes/import.php CHANGED
@@ -1,14 +1,22 @@
1
  <?php
 
2
  /**
3
  * Import notification from old plugin.
4
  *
5
  * @since 1.0
6
  */
7
-
8
  class BNFW_Import {
9
- const EMAIL_OPTION = 'bnfw_custom_email_settings';
10
  const SETTING_OPTION = 'bnfw_settings';
11
- private $events = array( 'create_term', 'publish_post', 'comment_post', 'user_register', 'trackback_post', 'pingback_post', 'lostpassword_post' );
 
 
 
 
 
 
 
 
12
 
13
  /**
14
  * Import notification from old plugin.
@@ -26,7 +34,7 @@ class BNFW_Import {
26
  $event_array = explode( '-', $event );
27
  if ( 2 == count( $event_array ) ) {
28
  if ( in_array( $event_array[0], $this->events ) && in_array( $event_array[1], array_keys( $roles ) ) ) {
29
- $event_array[1] = $roles[$event_array[1]];
30
  $this->insert_notification( $event_array );
31
  }
32
  }
@@ -47,20 +55,21 @@ class BNFW_Import {
47
  if ( get_option( self::EMAIL_OPTION ) && get_option( self::SETTING_OPTION ) ) {
48
  return true;
49
  }
 
50
  return false;
51
  }
52
 
53
  /**
54
  * Insert notification.
55
  *
56
- * @param mixed $event
57
  */
58
  private function insert_notification( $event ) {
59
  $post = array(
60
- 'post_title' => $event[0] . __( ' for ', 'bnfw' ) . $event[1] . __( ' (Auto Imported)', 'bnfw' ),
61
- 'post_type' => BNFW_Notification::POST_TYPE,
62
  'post_content' => '',
63
- 'post_status' => 'publish',
64
  );
65
 
66
  $post_id = wp_insert_post( $post );
@@ -83,7 +92,8 @@ class BNFW_Import {
83
  /**
84
  * Map old notification type to new notification type.
85
  *
86
- * @param mixed $event_name
 
87
  * @return unknown
88
  */
89
  private function map_notification( $event_name ) {
@@ -116,6 +126,7 @@ class BNFW_Import {
116
  * Map content from old plugin.
117
  *
118
  * @param unknown $event_name
 
119
  * @return unknown
120
  */
121
  private function map_notification_content( $event_name ) {
@@ -123,7 +134,8 @@ class BNFW_Import {
123
  if ( ! isset( $this->content_map ) ) {
124
  $this->parse_content();
125
  }
126
- return $this->content_map[$event_name];
 
127
  }
128
 
129
  /**
@@ -137,7 +149,7 @@ class BNFW_Import {
137
  foreach ( $old_content as $key => $value ) {
138
  $key_array = explode( '-', $key );
139
  if ( 3 == count( $key_array ) ) {
140
- $content_map[$key_array[2]][$key_array[1]] = $value;
141
  }
142
  }
143
  $this->content_map = $content_map;
@@ -153,4 +165,5 @@ class BNFW_Import {
153
  delete_option( self::SETTING_OPTION );
154
  }
155
  }
 
156
  ?>
1
  <?php
2
+
3
  /**
4
  * Import notification from old plugin.
5
  *
6
  * @since 1.0
7
  */
 
8
  class BNFW_Import {
9
+ const EMAIL_OPTION = 'bnfw_custom_email_settings';
10
  const SETTING_OPTION = 'bnfw_settings';
11
+ private $events = array(
12
+ 'create_term',
13
+ 'publish_post',
14
+ 'comment_post',
15
+ 'user_register',
16
+ 'trackback_post',
17
+ 'pingback_post',
18
+ 'lostpassword_post',
19
+ );
20
 
21
  /**
22
  * Import notification from old plugin.
34
  $event_array = explode( '-', $event );
35
  if ( 2 == count( $event_array ) ) {
36
  if ( in_array( $event_array[0], $this->events ) && in_array( $event_array[1], array_keys( $roles ) ) ) {
37
+ $event_array[1] = $roles[ $event_array[1] ];
38
  $this->insert_notification( $event_array );
39
  }
40
  }
55
  if ( get_option( self::EMAIL_OPTION ) && get_option( self::SETTING_OPTION ) ) {
56
  return true;
57
  }
58
+
59
  return false;
60
  }
61
 
62
  /**
63
  * Insert notification.
64
  *
65
+ * @param mixed $event
66
  */
67
  private function insert_notification( $event ) {
68
  $post = array(
69
+ 'post_title' => $event[0] . esc_html__( ' for ', 'bnfw' ) . $event[1] . esc_html__( ' (Auto Imported)', 'bnfw' ),
70
+ 'post_type' => BNFW_Notification::POST_TYPE,
71
  'post_content' => '',
72
+ 'post_status' => 'publish',
73
  );
74
 
75
  $post_id = wp_insert_post( $post );
92
  /**
93
  * Map old notification type to new notification type.
94
  *
95
+ * @param mixed $event_name
96
+ *
97
  * @return unknown
98
  */
99
  private function map_notification( $event_name ) {
126
  * Map content from old plugin.
127
  *
128
  * @param unknown $event_name
129