Subscribe2 - Version 2.6

Version Description

Download this release

Release Info

Developer MattyRob
Plugin Icon 128x128 Subscribe2
Version 2.6
Comparing to
See all releases

Code changes from version 3.0 to 2.6

ReadMe.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: MattyRob, Skippy, Ravan
3
  Donate link: http://subscribe2.wordpress.com/donate/
4
  Tags: posts, subscription, email
5
  Requires at least: 2.0.x
6
- Tested up to: 2.2
7
 
8
  Sends a list of subscribers an email notification when new posts are published to your blog
9
 
@@ -77,54 +77,6 @@ Batches will occur for each group of message as described above. A site on Drea
77
 
78
  == Version History ==
79
 
80
- Version 3.0 by Matthew Robinson
81
-
82
- * Updated for WordPress 2.1 Branch
83
-
84
- Version 2.14 by Matthew Robinson
85
-
86
- * Amended DREAMHOST setting to BCCLIMIT as more hosts are limiting emails
87
- * Fixed oversight in upgrade() function
88
-
89
- Version 2.13 by Matthew Robinson
90
-
91
- * Added WordPress nonce functionality to improve admin security
92
-
93
- Version 2.12 by Matthew Robinson
94
-
95
- * Fix for missing Quicktags (probably since version 2.2.10)
96
- * Fix for occasional email issue where excerpts are incomplete
97
-
98
- Version 2.11 by Matthew Robinson
99
- * Fixed bug that would cause all subscribers to get digest emails
100
- * Added Select All check box to category listing
101
-
102
- Version 2.10 by Matthew Robinson
103
- * Improved sign up process by double checking email address
104
- * Fix for submenu issues encountered in WP 2.0.6
105
-
106
- Version 2.9 by Matthew Robinson
107
-
108
- * Fixed get_userdata call issue
109
- * Added CSV export
110
- * Reworked options storage routines
111
-
112
- Version 2.8 by Matthew Robinson
113
-
114
- * Fixed missing line return in email headers that was causing failed emails
115
- * Added user feedback messages to profile area
116
- * Added 'Authorname' to the list of message substitutions in email messages
117
- * Fixed name and email substitution in Digest Mails
118
- * Fixed stripslashes issue in email subjects
119
- * Added new 'Action' token for confirmation emails
120
-
121
- Version 2.7 by Matthew Robinson
122
-
123
- * Link to post in HTML emails is now functional
124
- * Fixed bug in Bulk Management so it works when first loaded
125
- * Ability to auto subscribe newly registering users
126
- * Added additional email header information
127
-
128
  Version 2.6 by Matthew Robinson
129
 
130
  * Fixed email headers to comply with RFC2822 standard (after breaking them in the first place)
3
  Donate link: http://subscribe2.wordpress.com/donate/
4
  Tags: posts, subscription, email
5
  Requires at least: 2.0.x
6
+ Tested up to: 2.1
7
 
8
  Sends a list of subscribers an email notification when new posts are published to your blog
9
 
77
 
78
  == Version History ==
79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  Version 2.6 by Matthew Robinson
81
 
82
  * Fixed email headers to comply with RFC2822 standard (after breaking them in the first place)
buttonsnap.php CHANGED
@@ -3,7 +3,7 @@
3
  BUTTONSNAP CLASS LIBRARY By Owen Winkler
4
  http://asymptomatic.net
5
  WordPress Downloads are at http://redalt.com/downloads
6
- Version: 1.3.1
7
  *******************************************************************************/
8
 
9
  if (!class_exists('buttonsnap')) :
@@ -380,16 +380,15 @@ MORESCRIPT;
380
  $this->markers[$marker] = $cssclass;
381
  }
382
 
383
- function basename($src='')
384
  {
385
- if($src == '') $src = __FILE__;
386
- $name = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', $src);
387
  return str_replace('\\', '/', $name);
388
  }
389
 
390
- function plugin_uri($src = '')
391
  {
392
- return get_settings('siteurl') . '/wp-content/plugins/' . $this->basename($src);
393
  }
394
 
395
  function include_up($filename) {
@@ -431,7 +430,7 @@ function buttonsnap_jsbutton_page($imgsrc, $alttext, $js) { global $buttonsnap;
431
  function buttonsnap_ajaxbutton_page($imgsrc, $alttext, $hook) { global $buttonsnap; return $buttonsnap->ajaxbutton($imgsrc, $alttext, $hook, 'page');}
432
  function buttonsnap_separator_page() { global $buttonsnap; return $buttonsnap->separator('page');}
433
 
434
- function buttonsnap_dirname($src = '') {global $buttonsnap; return dirname($buttonsnap->plugin_uri($src));}
435
  function buttonsnap_register_marker($marker, $cssclass) {global $buttonsnap; return $buttonsnap->register_marker($marker, $cssclass);}
436
  endif;
437
  if (!defined('ABSPATH')) {
3
  BUTTONSNAP CLASS LIBRARY By Owen Winkler
4
  http://asymptomatic.net
5
  WordPress Downloads are at http://redalt.com/downloads
6
+ Version: 1.3
7
  *******************************************************************************/
8
 
9
  if (!class_exists('buttonsnap')) :
380
  $this->markers[$marker] = $cssclass;
381
  }
382
 
383
+ function basename()
384
  {
385
+ $name = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', __FILE__);
 
386
  return str_replace('\\', '/', $name);
387
  }
388
 
389
+ function plugin_uri()
390
  {
391
+ return get_settings('siteurl') . '/wp-content/plugins/' . $this->basename();
392
  }
393
 
394
  function include_up($filename) {
430
  function buttonsnap_ajaxbutton_page($imgsrc, $alttext, $hook) { global $buttonsnap; return $buttonsnap->ajaxbutton($imgsrc, $alttext, $hook, 'page');}
431
  function buttonsnap_separator_page() { global $buttonsnap; return $buttonsnap->separator('page');}
432
 
433
+ function buttonsnap_dirname() {global $buttonsnap; return dirname($buttonsnap->plugin_uri());}
434
  function buttonsnap_register_marker($marker, $cssclass) {global $buttonsnap; return $buttonsnap->register_marker($marker, $cssclass);}
435
  endif;
436
  if (!defined('ABSPATH')) {
subscribe2/include.php DELETED
@@ -1,49 +0,0 @@
1
- <?php
2
- // include.php - Handles options and common functions for subscribe2
3
- // DO NOT EDIT THIS FILE AS IT IS SET BY THE OPTIONS PAGE
4
-
5
- if (!isset($this->subscribe2_options['autosub'])) {
6
- $this->subscribe2_options['autosub'] = "no";
7
- } // option to autosubscribe registered users to new categories
8
-
9
- if (!isset($this->subscribe2_options['autoformat'])) {
10
- $this->subscribe2_options['autoformat'] = "text";
11
- } // option for default auto-subscription email format
12
-
13
- if (!isset($this->subscribe2_options['exclude'])) {
14
- $this->subscribe2_options['exclude'] = "";
15
- } // option for excluded categories
16
-
17
- if (!isset($this->subscribe2_options['sender'])) {
18
- $this->subscribe2_options['sender'] = "author";
19
- } // option for email notification sender
20
-
21
- // reg_override : allow registered users to subscribed to excluded cats
22
- if (!isset($this->subscribe2_options['reg_override'])) {
23
- $this->subscribe2_options['reg_override'] = "1";
24
- } // option for excluded categories to be overriden for registered users
25
-
26
- if (!isset($this->subscribe2_options['show_button'])) {
27
- $this->subscribe2_options['show_button'] = "1";
28
- } // option to show Subscribe2 button on Write page
29
-
30
- if (!isset($this->subscribe2_options['barred'])) {
31
- $this->subscribe2_options['barred'] = '';
32
- } // option containing domains barred from public registration
33
-
34
- if (!isset($this->subscribe2_options['email_freq'])) {
35
- $this->subscribe2_options['email_freq'] = "never";
36
- } // option for sending emails periodically or per-post
37
-
38
- if (!isset($this->subscribe2_options['mailtext'])) {
39
- $this->subscribe2_options['mailtext'] = "BLOGNAME has posted a new item, 'TITLE'\r\nPOST\r\nYou may view the latest post at\r\nPERMALINK\r\nYou received this e-mail because you asked to be notified when new updates are posted.\r\nBest regards,\r\nMYNAME\r\nEMAIL";
40
- } // Default notification email text
41
-
42
- if (!isset($this->subscribe2_options['confirm_email'])) {
43
- $this->subscribe2_options['confirm_email'] = "BLOGNAME has received a request to ACTION for this email address. To complete your request please click on the link below:\n\nLINK\n\nIf you did not request this, please feel free to disregard this notice!\n\nThank you,\nMYNAME.";
44
- } // Default confirmation email text
45
-
46
- if (!isset($this->subscribe2_options['remind_email'])) {
47
- $this->subscribe2_options['remind_email'] = "This email address was subscribed for notifications at BLOGNAME (BLOGLINK) but the subscription remains incomplete.\n\nIf you wish to complete your subscription please click on the link below:\n\nLINK\n\nIf you do not wish to complete your subscription please ignore this email and your address will be removed from our database.\n\nRegards,\nMYNAME";
48
- } // Default reminder email text
49
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
subscribe2/subscribe2.php CHANGED
@@ -1,15 +1,14 @@
1
  <?php
2
  /*
3
  Plugin Name: Subscribe2
4
- Plugin URI: http://subscribe2.wordpress.com
5
  Description: Notifies an email list when new entries are posted.
6
- Version: 2.3.1 for WP2.1
7
  Author: Matthew Robinson
8
- Author URI: http://subscribe2.wordpress.com
9
  */
10
 
11
  /*
12
- Copyright (C) 2006-7 Matthew Robinson
13
  Based on the Original Subscribe2 plugin by
14
  Copyright (C) 2005 Scott Merrill (skippy@skippy.net)
15
 
@@ -29,66 +28,25 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
29
  http://www.gnu.org/licenses/gpl.html
30
  */
31
 
32
- // If you are on a host that limits the numner of recipients
33
- // permitted on each outgoing email message
34
- // change this value to your hosts limit
35
- define('BCCLIMIT', '0');
 
 
 
36
 
37
  // by default, subscribe2 grabs the first page from your database for use
38
  // when displaying the confirmation screen to public subscribers.
39
  // You can override this by specifying a page ID below.
40
  define('S2PAGE', '0');
41
 
42
- // our version number. Don't touch.
43
- define('S2VERSION', '2.3.1');
44
-
45
- // Add the Subscribe code into the WP API
46
- add_action('init', 's2init');
47
-
48
- // maybe add our button
49
- $s2_options = array();
50
- $s2_options = get_option('subscribe2_options');
51
- if ('1' == $s2_options['show_button']) {
52
- // use Owen's excellent ButtonSnap library
53
- include(ABSPATH . '/wp-content/plugins/buttonsnap.php');
54
- add_action('init', 's2_button_init');
55
- add_action('marker_css', 'subscribe2_css');
56
- }
57
- unset($s2_options);
58
-
59
- function s2init() {
60
- global $subscribe2;
61
- $mysubscribe2 = new subscribe2();
62
- $mysubscribe2->subscribe2();
63
- }
64
-
65
- /* ===== ButtonSnap configuration ===== */
66
- /**
67
- Register our button in the QuickTags bar
68
- */
69
- function s2_button_init() {
70
- $url = get_settings('siteurl') . '/wp-content/plugins/subscribe2/s2_button.png';
71
- buttonsnap_textbutton($url, 'Subscribe2', '<!--subscribe2-->');
72
- buttonsnap_register_marker('subscribe2', 's2_marker');
73
- }
74
 
75
- /**
76
- Style a marker in the Rich Text Editor for our tag
77
- By default, the RTE suppresses output of HTML comments, so this places a CSS style on our token in order to make it display
78
- */
79
- function subscribe2_css() {
80
- $marker_url = get_settings('siteurl') . '/wp-content/plugins/subscribe2/s2_marker.png';
81
- echo "
82
- .s2_marker {
83
- display: block;
84
- height: 45px;
85
- margin-top: 5px;
86
- background-image: url({$marker_url});
87
- background-repeat: no-repeat;
88
- background-position: center;
89
- }
90
- ";
91
- }
92
 
93
  // start our class
94
  class subscribe2 {
@@ -102,9 +60,7 @@ class subscribe2 {
102
 
103
  $this->please_log_in = "<p>" . __('To manage your subscription options please ', 'subscribe2') . "<a href=\"" . get_settings('siteurl') . "/wp-login.php\">login</a>.</p>";
104
 
105
- $this->use_profile_admin = "<p>" . __('You may manage your subscription options from your ', 'subscribe2') . "<a href=\"" . get_settings('siteurl') . "/wp-admin/users.php?page=" . plugin_basename(__FILE__) . "\">profile</a>.</p>";
106
-
107
- $this->use_profile_users = "<p>" . __('You may manage your subscription options from your ', 'subscribe2') . "<a href=\"" . get_settings('siteurl') . "/wp-admin/profile.php?page=" . plugin_basename(__FILE__) . "\">profile</a>.</p>";
108
 
109
  $this->confirmation_sent = "<p>" . __('A confirmation message is on its way!', 'subscribe2') . "</p>";
110
 
@@ -129,12 +85,6 @@ class subscribe2 {
129
 
130
  $this->confirm_subject = "[" . get_settings('blogname') . "] " . __('Please confirm your request', 'subscribe2');
131
 
132
- $this->remind_subject = "[" . get_settings('blogname') . "] " . __('Subscription Reminder', 'subscribe2');
133
-
134
- $this->subscribe = __('subscribe', 'subscribe2'); //ACTION replacement in subscribing confirmation email
135
-
136
- $this->unsubscribe = __('unsubscribe', 'subscribe2'); //ACTION replacement in unsubscribing in confirmation email
137
-
138
  // menu strings
139
  $this->options_saved = __('Options saved!', 'subscribe2');
140
  $this->options_reset = __('Options reset!', 'subscribe2');
@@ -145,38 +95,39 @@ class subscribe2 {
145
  Hook the menu
146
  */
147
  function admin_menu() {
148
- add_management_page(__('Subscribers', 'subscribe2'), __('Subscribers', 'subscribe2'), "manage_options", __FILE__, array(&$this, 'manage_menu'));
149
- add_options_page(__('Subscribe2 Options', 'subscribe2'), __('Subscribe2','subscribe2'), "manage_options", __FILE__, array(&$this, 'options_menu'));
150
- if (current_user_can('manage_options')) {
151
- add_submenu_page('users.php', __('Subscriptions', 'subscribe2'), __('Subscriptions', 'subscribe2'), "read", __FILE__, array(&$this, 'user_menu'));
152
- } else {
153
- add_submenu_page('profile.php', __('Subscriptions', 'subscribe2'), __('Subscriptions', 'subscribe2'), "read", __FILE__, array(&$this, 'user_menu'));
154
- }
155
- add_submenu_page('post-new.php', __('Mail Subscribers','subscribe2'), __('Mail Subscribers', 'subscribe2'),"manage_options", __FILE__, array(&$this, 'write_menu'));
156
- $s2nonce = md5('subscribe2');
157
  }
158
 
 
159
  /**
160
- Insert Javascript into admin_header
161
  */
162
- function admin_head() {
163
- echo "<script type=\"text/javascript\">\r\n";
164
- echo "<!--\r\n";
165
- echo "function setAll(theElement) {\r\n";
166
- echo " var theForm = theElement.form, z = 0;\r\n";
167
- echo " for(z=0; z<theForm.length;z++){\r\n";
168
- echo " if(theForm[z].type == 'checkbox' && theForm[z].name == 'category[]'){\r\n";
169
- echo " theForm[z].checked = theElement.checked;\r\n";
170
- echo " }\r\n";
171
- echo " }\r\n";
172
- echo "}\r\n";
173
- echo "-->\r\n";
174
- echo "</script>\r\n";
175
  }
176
 
177
- function add_weekly_sched($sched) {
178
- $sched['weekly'] = array('interval' => 604800, 'display' => __('Once Weekly','subscribe2'));
179
- return $sched;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  }
181
 
182
  /* ===== Install, upgrade, reset ===== */
@@ -185,7 +136,7 @@ class subscribe2 {
185
  */
186
  function install() {
187
  // include upgrade-functions for maybe_create_table;
188
- if (!function_exists('maybe_create_table')) {
189
  require_once(ABSPATH . '/wp-admin/upgrade-functions.php');
190
  }
191
  $date = date('Y-m-d');
@@ -208,46 +159,41 @@ class subscribe2 {
208
  global $wpdb;
209
 
210
  // include upgrade-functions for maybe_create_table;
211
- if (!function_exists('maybe_create_table')) {
212
  require_once(ABSPATH . '/wp-admin/upgrade-functions.php');
213
  }
214
  $date = date('Y-m-d');
215
  maybe_add_column($this->public, 'date', "ALTER TABLE `$this->public` ADD `date` DATE DEFAULT '$date' NOT NULL AFTER `active`;");
 
 
 
 
 
 
216
 
217
  // let's take the time to check process registered users
218
- // existing public subscribers are subscribed to all categories
219
- $users = $wpdb->get_col("SELECT ID FROM $wpdb->users");
220
- if (!empty($users)) {
221
- foreach ($users as $user) {
222
  $this->register($user);
223
  }
224
  }
225
- // update the options table to serialized format
226
- $old_options = $wpdb->get_col("SELECT option_name from $wpdb->options where option_name LIKE 's2%' AND option_name != 's2_future_posts'");
227
-
228
- if (!empty($old_options)) {
229
- foreach ($old_options as $option) {
230
- $value = get_option($option);
231
- $option_array = substr($option, 3);
232
- $this->subscribe2_options[$option_array] = $value;
233
- delete_option($option);
234
- }
235
- }
236
- $this->subscribe2_options['version'] = S2VERSION;
237
- //double check that the options are in the database
238
- require_once(ABSPATH . "/wp-content/plugins/subscribe2/include.php");
239
- update_option('subscribe2_options', $this->subscribe2_options);
240
  } // end upgrade()
241
 
242
  /**
243
  Reset our options
244
  */
245
  function reset() {
246
- delete_option('subscribe2_options');
247
- unset($this->subscribe2_options);
248
- require(ABSPATH . "/wp-content/plugins/subscribe2/include.php");
249
- update_option('subscribe2_options', $this->subscribe2_options);
250
- } // end reset()
 
 
 
 
251
 
252
  /* ===== mail handling ===== */
253
  /**
@@ -263,7 +209,6 @@ class subscribe2 {
263
  $string = str_replace('PERMALINK', $this->permalink, $string);
264
  $string = str_replace('MYNAME', stripslashes($this->myname), $string);
265
  $string = str_replace('EMAIL', $this->myemail, $string);
266
- $string = str_replace('AUTHORNAME', $this->authorname, $string);
267
  return $string;
268
  } // end sustitute()
269
 
@@ -271,111 +216,113 @@ class subscribe2 {
271
  Delivers email to recipients in HTML or plaintext
272
  */
273
  function mail ($recipients = array(), $subject = '', $message = '', $type='text') {
274
- if ( (empty($recipients)) || ('' == $message) ) { return; }
275
-
 
276
  // Set sender details
277
  if ('' == $this->myname) {
278
- $admin = get_userdata(1);
279
  $this->myname = $admin->display_name;
280
  $this->myemail = $admin->user_email;
281
  }
282
  $headers = "From: $this->myname <$this->myemail>\n";
283
  $headers .= "Return-Path: <$this->myemail>\n";
284
- $headers .= "X-Mailer:PHP" . phpversion() . "\n";
285
  $headers .= "Precedence: list\nList-Id: " . get_settings('blogname') . "\n";
286
 
287
  if ('html' == $type) {
288
  // To send HTML mail, the Content-type header must be set
289
  $headers .= "MIME-Version: 1.0\n";
290
  $headers .= "Content-type: " . get_bloginfo('html_type') . "; charset=\"". get_bloginfo('charset') . "\"\n";
291
- $mailtext = "<html><head><title>" . $subject . "</title></head><body>" . $message . "</body></html>";
292
  } else {
293
  $headers .= "MIME-Version: 1.0\n";
294
  $headers .= "Content-type: text/plain; charset=\"". get_bloginfo('charset') . "\"\n";
295
- $message = preg_replace('|&[^a][^m][^p].{0,3};|', '', $message);
296
- $message = preg_replace('|&amp;|', '&', $message);
297
  $mailtext = wordwrap(strip_tags($message), 80, "\n");
298
  }
299
 
300
  // BCC all recipients
301
  $bcc = '';
302
- if ( (defined('BCCLIMIT') && (BCCLIMIT > 0) ) &&
303
- (count($recipients) > BCCLIMIT) ) {
304
  // we're on Dreamhost, and have more than 30 susbcribers
305
  $count = 1;
306
  $batch = array();
307
  foreach ($recipients as $recipient) {
308
  // advance the array pointer by one, for use down below
309
  // the array pointer _is not_ advanced by the foreach() loop itself
310
- next($recipients);
311
- $recipient = trim($recipient);
312
- // sanity check -- make sure we have a valid email
313
- if (!is_email($recipient)) { continue; }
314
- // and NOT the sender's email, since they'll
315
- // get a copy anyway
316
- if ( (! empty($recipient)) && ($this->myemail != $recipient) ) {
317
- ('' == $bcc) ? $bcc = "Bcc: $recipient" : $bcc .= ",\r\n $recipient";
318
- // Headers constructed as per definition at http://www.ietf.org/rfc/rfc2822.txt
319
- }
320
- if (30 == $count) {
321
- $count = 1;
322
- $batch[] = $bcc;
323
- $bcc = '';
324
- } else {
325
- if (false == current($recipients)) {
326
- // we've reached the end of the subscriber list
327
- // add what we have to the batch, and move on
328
- $batch[] = $bcc;
329
- break;
330
  } else {
331
- $count++;
 
 
 
 
 
 
 
332
  }
333
- }
334
  }
335
  // rewind the array, just to be safe
336
  reset($recipients);
337
  } else {
338
  // we're not on dreamhost, or have less than 30
339
  // subscribers, so do it normal
340
- foreach ($recipients as $recipient) {
341
- $recipient = trim($recipient);
342
- // sanity check -- make sure we have a valid email
343
- if (!is_email($recipient)) { continue; }
344
  // and NOT the sender's email, since they'll
345
  // get a copy anyway
346
- if ( (!empty($recipient)) && ($this->myemail != $recipient) ) {
347
  ('' == $bcc) ? $bcc = "Bcc: $recipient" : $bcc .= ",\r\n $recipient";
348
  // Headers constructed as per definition at http://www.ietf.org/rfc/rfc2822.txt
349
  }
350
- }
351
- $headers .= "$bcc\r\n";
352
  }
353
  // actually send mail
354
- if ( (defined('BCCLIMIT')) && (BCCLIMIT > 0) && (isset($batch)) ) {
355
- foreach ($batch as $bcc) {
356
- $newheaders = $headers . "$bcc\r\n";
357
- @wp_mail($this->myemail, $subject, $mailtext, $newheaders);
 
 
 
358
  }
359
- } else {
360
- @wp_mail($this->myemail, $subject, $mailtext, $headers);
361
- }
362
  } // end mail()
363
 
364
  /**
365
  Sends an email notification of a new post
366
  */
367
- function publish($id = 0) {
368
- if ( (!$id) || is_page($id) ) { return $id; }
369
 
370
  // are we doing daily digests? If so, don't send anything now
371
- if ($this->subscribe2_options['email_freq'] != 'never') { return; }
372
 
373
  // we need to determine whether this is a new post, or an edit
374
- if ($this->private) {
375
- // this post was published from draft status
376
- // OR is an edit of an existing post
377
- // so send no notification
378
- return $id;
 
 
 
379
  }
380
 
381
  $post_cats = wp_get_post_cats('1', $id);
@@ -392,23 +339,36 @@ class subscribe2 {
392
  if ($check) {
393
  // hang on -- can registered users subscribe to
394
  // excluded categories?
395
- if ('0' == $this->subscribe2_options['reg_override']) {
396
  // nope? okay, let's leave
397
  return $id;
398
  }
399
  }
400
 
401
  global $wpdb;
402
- $post =& get_post($id);
403
  // is this post set in the future?
404
  if ($post->post_date > current_time('mysql')) {
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  // bail out
406
  return $id;
407
  }
408
 
409
  // lets collect our public subscribers
410
  // and all our registered subscribers for these categories
411
- if (!$check) {
412
  // if this post is assigned to an excluded
413
  // category, then this test will prevent
414
  // the public from receiving notification
@@ -417,32 +377,29 @@ class subscribe2 {
417
  $registered = $this->get_registered("cats=$post_cats_string");
418
 
419
  // do we have subscribers?
420
- if ( (empty($public)) && (empty($registered)) ) {
421
  // if not, no sense doing anything else
422
  return $id;
423
  }
424
  // we set these class variables so that we can avoid
425
  // passing them in function calls a little later
426
  $this->post_title = $post->post_title;
427
- $this->permalink = "<a href=\"" . get_permalink($id) . "\">" . get_permalink($id) . "</a>";
428
-
429
- $author = get_userdata($post->post_author);
430
- $this->authorname = $author->display_name;
431
 
432
  // do we send as admin, or post author?
433
- if ('author' == $this->subscribe2_options['sender']) {
434
  // get author details
435
- $user =& $author;
436
  } else {
437
- // get admin details
438
  $user = get_userdata(1);
439
  }
440
  $this->myemail = $user->user_email;
441
  $this->myname = $user->display_name;
442
  // Get email subject
443
- $subject = $this->substitute(stripslashes($this->s2_subject));
444
  // Get the message template
445
- $mailtext = $this->substitute(stripslashes($this->subscribe2_options['mailtext']));
446
 
447
  $plaintext = $post->post_content;
448
  $content = apply_filters('the_content', $post->post_content);
@@ -459,7 +416,7 @@ class subscribe2 {
459
  // no <!--more-->, so grab the first 55 words
460
  $excerpt = strip_tags($plaintext);
461
  $excerpt_length = 55;
462
- $words = explode(' ', $excerpt, $excerpt_length + 1);
463
  if (count($words) > $excerpt_length) {
464
  array_pop($words);
465
  array_push($words, '[...]');
@@ -494,22 +451,22 @@ class subscribe2 {
494
  /**
495
  Sends a notification when a draft post is published
496
  */
497
- function private2publish($id = 0) {
498
- if (0 == $id) { return $id; }
499
 
500
- $this->publish($id);
501
  $this->private = TRUE;
502
- return $id;
503
  } // end private2publish()
504
 
505
  /**
506
  Prevents notifications from being sent when editing posts
507
  */
508
- function edit($id = 0) {
509
- if (0 == $id) { return; }
510
 
511
  $this->private = TRUE;
512
- return $id;
513
  }
514
 
515
  /**
@@ -517,11 +474,11 @@ class subscribe2 {
517
  */
518
  function send_confirm($what = '', $is_remind = FALSE) {
519
  if ($this->filtered == 1) { return; }
520
- if ( (!$this->email) || (!$what) ) {
521
  return false;
522
  }
523
  $id = $this->get_id($this->email);
524
- if (!$id) {
525
  return false;
526
  }
527
 
@@ -541,28 +498,20 @@ class subscribe2 {
541
 
542
  $admin = get_userdata(1);
543
  $this->myname = $admin->display_name;
544
-
545
  if ($is_remind == TRUE) {
546
- $body = $this->substitute(stripslashes($this->subscribe2_options['remind_email']));
547
- $subject = stripslashes($this->remind_subject);
548
  } else {
549
- $body = $this->substitute(stripslashes($this->subscribe2_options['confirm_email']));
550
- if ('add' == $what) {
551
- $body = str_replace("ACTION", $this->subscribe, $body);
552
- } elseif ('del' == $what) {
553
- $body = str_replace("ACTION", $this->unsubscribe, $body);
554
- }
555
- $subject = stripslashes($this->confirm_subject);
556
  }
557
 
558
  $body = str_replace("LINK", $link, $body);
559
 
560
- $mailheaders .= "From: $admin->display_name <$admin->user_email>\n";
561
- $mailheaders .= "Return-Path: <$admin->user_email>\n";
562
- $mailheaders .= "X-Mailer:PHP" . phpversion() . "\n";
563
- $mailheaders .= "Precedence: list\nList-Id: " . get_settings('blogname') . "\n";
564
  $mailheaders .= "MIME-Version: 1.0\n";
565
  $mailheaders .= "Content-type: text/plain; charset=\"". get_bloginfo('charset') . "\"\n";
 
566
 
567
  @wp_mail ($this->email, $subject, $body, $mailheaders);
568
  } // end send_confirm()
@@ -576,7 +525,7 @@ class subscribe2 {
576
  return $this->excluded_cats;
577
  } else {
578
  global $wpdb;
579
- $this->excluded_cats = $this->subscribe2_options['exclude'];
580
  return $this->excluded_cats;
581
  }
582
  } // end get_excluded_cats()
@@ -598,6 +547,7 @@ class subscribe2 {
598
  }
599
  } // end get_all_categories()
600
 
 
601
  /* ===== Subscriber functions ===== */
602
  /**
603
  Given a public subscriber ID, returns the email address
@@ -605,7 +555,7 @@ class subscribe2 {
605
  function get_email ($id = 0) {
606
  global $wpdb;
607
 
608
- if (!$id) {
609
  return false;
610
  }
611
  return $wpdb->get_var("SELECT email FROM $this->public WHERE id=$id");
@@ -617,7 +567,7 @@ class subscribe2 {
617
  function get_id ($email = '') {
618
  global $wpdb;
619
 
620
- if (!$email) {
621
  return false;
622
  }
623
  return $wpdb->get_var("SELECT id FROM $this->public WHERE email='$email'");
@@ -625,6 +575,7 @@ class subscribe2 {
625
 
626
  /**
627
  Activate an email address
 
628
  If the address is not already present, it will be added
629
  */
630
  function activate ($email = '') {
@@ -662,7 +613,7 @@ class subscribe2 {
662
  }
663
  }
664
 
665
- if (!is_email($email)) { return false; }
666
 
667
  if (false !== $this->is_public($email)) {
668
  $wpdb->get_results("UPDATE $this->public SET date=NOW() WHERE email='$email'");
@@ -685,7 +636,7 @@ class subscribe2 {
685
  }
686
  }
687
 
688
- if (!is_email($email)) { return false; }
689
  $wpdb->get_results("DELETE FROM $this->public WHERE email='$email'");
690
  } // end delete()
691
 
@@ -718,29 +669,18 @@ class subscribe2 {
718
  $this->myname = $admin->display_name;
719
 
720
  $recipients = explode(",", $emails);
721
- if (!is_array($recipients)) { $recipients = array(); }
722
  foreach ($recipients as $recipient) {
723
  $this->email = $recipient;
724
  $this->send_confirm('add', TRUE);
725
  }
726
  } //end remind()
727
 
728
- /**
729
- Export email list to CSV download
730
- */
731
- function exportcsv($emails = '') {
732
- if ('' == $emails) {return false; }
733
-
734
- $f = fopen(ABSPATH . '/wp-content/email.csv', 'w');
735
- fwrite($f, $emails);
736
- fclose($f);
737
- } //end exportcsv
738
-
739
  /**
740
  Check email is not from a barred domain
741
  */
742
  function is_barred($email='') {
743
- $barred_option = $this->subscribe2_options['barred'];
744
  list($user, $domain) = split('@', $email);
745
  $bar_check = stristr($barred_option, $domain);
746
 
@@ -766,7 +706,7 @@ class subscribe2 {
766
  $id = intval(substr($code, 1));
767
  if ($id) {
768
  $this->email = $this->get_email($id);
769
- if ( (!$this->email) || ($hash !== md5($this->email)) ) {
770
  return $this->no_such_email;
771
  }
772
  } else {
@@ -857,11 +797,11 @@ class subscribe2 {
857
  $subscribers = array();
858
 
859
  parse_str($args, $r);
860
- if (!isset($r['cats']))
861
  $r['cats'] = '';
862
- if (!isset($r['format']))
863
  $r['format'] = 'all';
864
- if (!isset($r['amount']))
865
  $r['amount'] = 'all';
866
 
867
  $JOIN = ''; $AND = '';
@@ -911,7 +851,7 @@ class subscribe2 {
911
  if ('' == $email) { return false; }
912
 
913
  global $wpdb;
914
- if (!empty($this->signup_dates)) {
915
  return $this->signup_dates[$email];
916
  } else {
917
  $results = $wpdb->get_results("SELECT email, date FROM $this->public", ARRAY_N);
@@ -931,43 +871,25 @@ class subscribe2 {
931
 
932
  if (0 == $user_id) { return $user_id; }
933
  $user = get_userdata($user_id);
934
- $all_cats = get_categories('type=post&hide_empty=1&hierarchical=0');
935
- foreach ($all_cats as $cat) {
936
- ('' == $cats) ? $cats = "$cat->cat_ID" : $cats .= ",$cat->cat_ID";
937
- }
938
 
939
  // has this user previously signed up for email notification?
940
  if (false !== $this->is_public($user->user_email)) {
941
  // delete this user from the public table, and subscribe them to all the categories
942
  $this->delete($user->user_email);
943
- update_usermeta($user_id, 's2_subscribed', $cats);
944
- foreach(explode(',', $cats) as $cat) {
945
- update_usermeta($user_id, 's2_cat' . $all_cats->cat_ID, "$all_cats->cat_ID");
946
  }
947
  update_usermeta($user_id, 's2_format', 'text');
948
  update_usermeta($user_id, 's2_excerpt', 'excerpt');
949
  } else {
950
  // add the usermeta for new registrations, but don't subscribe them
951
  $check = get_usermeta($user_id, 's2_subscribed');
952
- // ensure existing subscriptions are not overwritten on upgrade
953
  if (empty($check)) {
954
- if ('yes' == $this->subscribe2_options['autosub']) {
955
- // don't add entires by default if autosub is off, messes up daily digests
956
- update_usermeta($user_id, 's2_subscribed', $this->get_all_categories());
957
- foreach(explode(',', $this->get_all_categories()) as $cat) {
958
- update_usermeta($user_id, 's2_cat' . $cat, "$cat");
959
- }
960
- if ('html' == $this->subscribe2_options['autoformat']) {
961
- update_usermeta($user_id, 's2_format', 'html');
962
- update_usermeta($user_id, 's2_excerpt', 'post');
963
- } elseif ('fulltext' == $this->subscribe2_options['autoformat']) {
964
- update_usermeta($user_id, 's2_format', 'text');
965
- update_usermeta($user_id, 's2_excerpt', 'post');
966
- } else {
967
- update_usermeta($user_id, 's2_format', 'text');
968
- update_usermeta($user_id, 's2_excerpt', 'excerpt');
969
- }
970
- }
971
  }
972
  }
973
  return $user_id;
@@ -977,7 +899,7 @@ class subscribe2 {
977
  Subscribe all registered users to category selected on Admin Manage Page
978
  */
979
  function subscribe_registered_users ($emails = '', $cats = '') {
980
- if ( ('' == $emails) || ('' == $cats) ) { return false; }
981
  global $wpdb;
982
 
983
  $useremails = explode(",", $emails);
@@ -986,17 +908,17 @@ class subscribe2 {
986
  $sql = "SELECT ID FROM $wpdb->users WHERE user_email IN ('$useremails')";
987
  $user_IDs = $wpdb->get_col($sql);
988
  $cats = $_POST['category'];
989
- if (!is_array($cats)) {
990
  $cats = array($_POST['category']);
991
  }
992
 
993
  foreach ($user_IDs as $user_ID) {
994
  $old_cats = explode(',', get_usermeta($user_ID, 's2_subscribed'));
995
- if (!is_array($old_cats)) {
996
  $old_cats = array($old_cats);
997
  }
998
  $new = array_diff($cats, $old_cats);
999
- if (!empty($new)) {
1000
  // add subscription to these cat IDs
1001
  foreach ($new as $id) {
1002
  update_usermeta($user_ID, 's2_cat' . $id, "$id");
@@ -1011,7 +933,7 @@ class subscribe2 {
1011
  Unsubscribe all registered users to category selected on Admin Manage Page
1012
  */
1013
  function unsubscribe_registered_users ($emails = '', $cats = '') {
1014
- if ( ('' == $emails) || ('' == $cats) ) { return false; }
1015
  global $wpdb;
1016
 
1017
  $useremails = explode(",", $emails);
@@ -1020,17 +942,17 @@ class subscribe2 {
1020
  $sql = "SELECT ID FROM $wpdb->users WHERE user_email IN ('$useremails')";
1021
  $user_IDs = $wpdb->get_col($sql);
1022
  $cats = $_POST['category'];
1023
- if (!is_array($cats)) {
1024
  $cats = array($_POST['category']);
1025
  }
1026
 
1027
  foreach ($user_IDs as $user_ID) {
1028
  $old_cats = explode(',', get_usermeta($user_ID, 's2_subscribed'));
1029
- if (!is_array($old_cats)) {
1030
  $old_cats = array($old_cats);
1031
  }
1032
  $remain = array_diff($old_cats, $cats);
1033
- if (!empty($remain)) {
1034
  // remove subscription to these cat IDs and update s2_subscribed
1035
  foreach ($cats as $id) {
1036
  delete_usermeta($user_ID, 's2_cat' . $id, "$id");
@@ -1045,49 +967,19 @@ class subscribe2 {
1045
  }
1046
  }
1047
  } // end unsubscribe_registered_users
1048
-
1049
- /**
1050
- Autosubscribe registered users to newly created categories
1051
- if registered user has selected this option
1052
- */
1053
- function autosub_new_category ($new_category='') {
1054
- global $wpdb;
1055
-
1056
- $sql = "SELECT DISTINCT user_id FROM $wpdb->usermeta WHERE $wpdb->usermeta.meta_key='s2_autosub' AND $wpdb->usermeta.meta_value='yes'";
1057
- $user_IDs = $wpdb->get_col($sql);
1058
- if ('' == $user_IDs) { return; }
1059
-
1060
- foreach ($user_IDs as $user_ID) {
1061
- $old_cats = explode(',', get_usermeta($user_ID, 's2_subscribed'));
1062
- if (!is_array($old_cats)) {
1063
- $old_cats = array($old_cats);
1064
- }
1065
- // add subscription to these cat IDs
1066
- update_usermeta($user_ID, 's2_cat' . $new_category, "$new_category");
1067
- $newcats = array_merge($old_cats, (array)$new_category);
1068
- update_usermeta($user_ID, 's2_subscribed', implode(',', $newcats));
1069
- }
1070
- } // end autosub_new_category
1071
 
1072
  /* ===== Menus ===== */
1073
  /**
1074
  Our management page
1075
  */
1076
  function manage_menu() {
1077
- global $wpdb, $s2nonce;
1078
-
1079
- //Get Registered Subscribers for bulk management
1080
- $registered = $this->get_registered();
1081
- if (!empty($registered)) {
1082
- $emails = implode(",", $registered);
1083
- }
1084
 
1085
  $what = '';
1086
- $reminderform = false;
1087
 
1088
  // was anything POSTed ?
1089
  if (isset($_POST['s2_admin'])) {
1090
- check_admin_referer('subscribe2-manage_subscribers' . $s2nonce);
1091
  if ('subscribe' == $_POST['s2_admin']) {
1092
  foreach (preg_split ("/[\s,]+/", $_POST['addresses']) as $email) {
1093
  if (is_email($email)) {
@@ -1103,11 +995,8 @@ class subscribe2 {
1103
  $this->toggle($_POST['email']);
1104
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>" . $_POST['email'] . ' ' . __('status changed!', 'subscribe2') . "</p></strong></div>";
1105
  } elseif ('remind' == $_POST['s2_admin']) {
1106
- $this->remind($_POST['reminderemails']);
1107
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>" . __('Reminder Email(s) Sent!','subscribe2') . "</p></strong></div>";
1108
- } elseif ('exportcsv' == $_POST['s2_admin']) {
1109
- $this->exportcsv($_POST['exportcsv']);
1110
- echo "<div id=\"message\" class=\"updated fade\"><strong><p>" . __('CSV File Created in wp-content','subscribe2') . "</p></strong></div>";
1111
  } elseif ( ('register' == $_POST['s2_admin']) && ('Subscribe' == $_POST['submit']) ) {
1112
  $this->subscribe_registered_users($_POST['emails'], $_POST['category']);
1113
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>" . __('Registered Users Subscribed!','subscribe2') . "</p></strong></div>";
@@ -1122,6 +1011,7 @@ class subscribe2 {
1122
  $what = 'all';
1123
  $confirmed = $this->get_public();
1124
  $unconfirmed = $this->get_public(0);
 
1125
  $subscribers = array_merge((array)$confirmed, (array)$unconfirmed, (array)$registered);
1126
  } elseif ('public' == $_POST['what']) {
1127
  $what = 'public';
@@ -1130,32 +1020,35 @@ class subscribe2 {
1130
  $subscribers = array_merge((array)$confirmed, (array)$unconfirmed);
1131
  } elseif ('confirmed' == $_POST['what']) {
1132
  $what = 'confirmed';
1133
- $confirmed = $this->get_public();
1134
  $subscribers = $confirmed;
1135
  } elseif ('unconfirmed' == $_POST['what']) {
1136
  $what = 'unconfirmed';
1137
- $unconfirmed = $this->get_public(0);
1138
  $subscribers = $unconfirmed;
1139
  if (!empty($unconfirmed)) {
1140
- $reminderemails = implode(",", $unconfirmed);
1141
- $reminderform = true;
1142
  }
1143
  } elseif (is_numeric($_POST['what'])) {
1144
  $what = intval($_POST['what']);
1145
  $subscribers = $this->get_registered("cats=$what");
1146
  } elseif ('registered' == $_POST['what']) {
1147
  $what = 'registered';
1148
- $subscribers = $registered;
 
 
 
1149
  }
1150
  } elseif ('' == $what) {
 
1151
  $what = 'registered';
1152
- $subscribers = $registered;
1153
  $registermessage = '';
1154
  if (empty($subscribers)) {
1155
  $confirmed = $this->get_public();
1156
  $subscribers = $confirmed;
1157
  $what = 'confirmed';
1158
- if (empty($subscribers)) {
1159
  $unconfirmed = $this->get_public(0);
1160
  $subscribers = $unconfirmed;
1161
  $what = 'unconfirmed';
@@ -1165,7 +1058,7 @@ class subscribe2 {
1165
  }
1166
  }
1167
  }
1168
- if (!empty($subscribers)) {
1169
  natcasesort($subscribers);
1170
  }
1171
  // safety check for our arrays
@@ -1177,9 +1070,6 @@ class subscribe2 {
1177
  echo "<div class=\"wrap\">";
1178
  echo "<h2>" . __('Subscribe Addresses', 'subscribe2') . "</h2>\r\n";
1179
  echo "<form method=\"post\" action=\"\">\r\n";
1180
- if (function_exists('wp_nonce_field')) {
1181
- wp_nonce_field('subscribe2-manage_subscribers' . $s2nonce);
1182
- }
1183
  echo "<span style=\"align:left\">" . __('Enter addresses, one per line or comma-seperated', 'subscribe2') . "</span><br />\r\n";
1184
  echo "<textarea rows=\"2\" cols=\"80\" name=\"addresses\"></textarea>";
1185
  echo "<span class=\"submit\"><input type=\"submit\" name=\"submit\" value=\"" . __('Subscribe', 'subscribe2') . "\"/>";
@@ -1192,22 +1082,11 @@ class subscribe2 {
1192
  $this->display_subscriber_dropdown($what, __('Filter', 'subscribe2'));
1193
  // show the selected subscribers
1194
  $alternate = 'alternate';
1195
- if (!empty($subscribers)) {
1196
  echo "<p align=\"center\"><b>" . __('Registered on the left, confirmed in the middle, unconfirmed on the right', 'subscribe2') . "</b></p>";
1197
- if (is_writable(ABSPATH . '/wp-content')) {
1198
- $exportcsv = implode(",", $subscribers);
1199
- echo "<span class=\"submit\"><form method=\"post\" action=\"\">\r\n";
1200
- if (function_exists('wp_nonce_field')) {
1201
- wp_nonce_field('subscribe2-manage_subscribers' . $s2nonce);
1202
- }
1203
- echo "<input type=\"hidden\" name=\"exportcsv\" value=\"$exportcsv\" />\r\n";
1204
- echo "<input type=\"hidden\" name=\"s2_admin\" value=\"exportcsv\" />\r\n";
1205
- echo "<input type=\"submit\" name=\"submit\" value=\"" . __('Save Emails to CSV File','subscribe2') . "\" />\r\n";
1206
- echo "</form></span>\r\n";
1207
- }
1208
  }
1209
  echo "<table cellpadding=\"2\" cellspacing=\"2\">";
1210
- if (!empty($subscribers)) {
1211
  foreach ($subscribers as $subscriber) {
1212
  echo "<tr class=\"$alternate\">";
1213
  echo "<td width=\"75%\"";
@@ -1219,30 +1098,12 @@ class subscribe2 {
1219
  echo "align=\"left\" colspan=\"3\">";
1220
  }
1221
  echo "<a href=\"mailto:$subscriber\">$subscriber</a>\r\n";
1222
- if (in_array($subscriber, $unconfirmed) || in_array($subscriber, $confirmed) ) {
1223
- echo "(" . $this->signup_date($subscriber) . ")</td>\r\n";
1224
- echo "<td width=\"5%\" align=\"center\">\r\n";
1225
- echo "<form method=\"post\" action=\"\">";
1226
- if (function_exists('wp_nonce_field')) {
1227
- wp_nonce_field('subscribe2-manage_subscribers' . $s2nonce);
1228
- }
1229
- echo "<input type=\"hidden\" name=\"email\" value=\"$subscriber\" />\r\n";
1230
- echo "<input type=\"hidden\" name=\"s2_admin\" value=\"toggle\" />\r\n";
1231
- echo "<input type=\"hidden\" name=\"what\" value=\"$what\" />\r\n";
1232
- echo "<input type=\"submit\" name=\"submit\" value=\"";
1233
  (in_array($subscriber, $unconfirmed)) ? $foo = '&lt;-' : $foo= '-&gt;';
1234
- echo "$foo\" /></form></td>\r\n";
1235
- echo "<td width=\"2%\" align=\"center\">\r\n";
1236
- echo "<form method=\"post\" action=\"\">\r\n";
1237
- if (function_exists('wp_nonce_field')) {
1238
- wp_nonce_field('subscribe2-manage_subscribers' . $s2nonce);
1239
- }
1240
- echo "<span class=\"delete\">\r\n";
1241
- echo "<input type=\"hidden\" name=\"email\" value=\"$subscriber\" />\r\n";
1242
- echo "<input type=\"hidden\" name=\"s2_admin\" value=\"delete\" />\r\n";
1243
- echo "<input type=\"hidden\" name=\"what\" value=\"$what\" />\r\n";
1244
- echo "<input type=\"submit\" name=\"submit\" value=\"X\" />\r\n";
1245
- echo "</span></form>";
1246
  }
1247
  echo "</td></tr>\r\n";
1248
  ('alternate' == $alternate) ? $alternate = '' : $alternate = 'alternate';
@@ -1251,33 +1112,21 @@ class subscribe2 {
1251
  echo "<tr><td align=\"center\"><b>" . __('NONE', 'subscribe2') . "</b></td></tr>\r\n";
1252
  }
1253
  echo "</table>";
1254
- if ($reminderform) {
1255
- echo "<span class=\"submit\"><form method=\"post\" action=\"\">\r\n";
1256
- if (function_exists('wp_nonce_field')) {
1257
- wp_nonce_field('subscribe2-manage_subscribers' . $s2nonce);
1258
- }
1259
- echo "<input type=\"hidden\" name=\"reminderemails\" value=\"$reminderemails\" />\r\n";
1260
- echo "<input type=\"hidden\" name=\"s2_admin\" value=\"remind\" />\r\n";
1261
- echo "<input type=\"submit\" name=\"submit\" value=\"" . __('Send Reminder Email','subscribe2') . "\" />\r\n";
1262
- echo "</form></span>";
1263
- }
1264
  echo "</div>\r\n";
1265
 
1266
  //show bulk managment form
1267
  echo "<div class=\"wrap\">";
1268
  echo "<h2 >" . __('Categories', 'subscribe2') . "</h2>\r\n";
1269
- echo __('Existing Registered Users can be automatically (un)subscribed to categories using this section.', 'subscribe2') . "<br />\r\n";
1270
- echo "<strong><em style=\"color: red\">" . __('Consider User Privacy as changes cannot be undone', 'subscribe2') . "</em></strong><br />\r\n";
1271
- echo "<span class=\"submit\"><form method=\"post\" action=\"\">\r\n";
1272
- if (function_exists('wp_nonce_field')) {
1273
- wp_nonce_field('subscribe2-manage_subscribers' . $s2nonce);
1274
- }
1275
- echo "<input type=\"hidden\" name=\"emails\" value=\"$emails\" /><input type=\"hidden\" name=\"s2_admin\" value=\"register\" />";
1276
- $this->display_category_form();
1277
  echo "<input type=\"submit\" id=\"deletepost\" name=\"submit\" value=\"" . __('Subscribe','subscribe2') . "\" />";
1278
  echo "<input type=\"submit\" id=\"deletepost\" name=\"submit\" value=\"" . __('Unsubscribe','subscribe2') . "\" /></form></span>";
1279
 
1280
  echo "</div>\r\n";
 
1281
  echo "<div style=\"clear: both;\"><p>&nbsp;</p></div>";
1282
 
1283
  include(ABSPATH . '/wp-admin/admin-footer.php');
@@ -1289,106 +1138,78 @@ class subscribe2 {
1289
  Our options page
1290
  */
1291
  function options_menu() {
1292
- global $s2nonce;
1293
-
1294
  // was anything POSTed?
1295
  if (isset($_POST['s2_admin'])) {
1296
- check_admin_referer('subscribe2-options_subscribers' . $s2nonce);
1297
  if ('RESET' == $_POST['s2_admin']) {
1298
  $this->reset();
1299
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>$this->options_reset</p></strong></div>";
1300
  } elseif ('options' == $_POST['s2_admin']) {
1301
  // excluded categories
1302
- if (!empty($_POST['category'])) {
1303
  $exclude_cats = implode(',', $_POST['category']);
1304
  } else {
1305
  $exclude_cats = '';
1306
  }
1307
- $this->subscribe2_options['exclude'] = $exclude_cats;
1308
  // allow override?
1309
- (isset($_POST['reg_override'])) ? $override = '1' : $override = '0';
1310
- $this->subscribe2_options['reg_override'] = $override;
1311
 
1312
  // show button?
1313
- ($_POST['show_button'] == '1') ? $showbutton = '1' : $showbutton = '0';
1314
- $this->subscribe2_options['show_button'] = $showbutton;
1315
 
1316
  // send as author or admin?
1317
  $sender = 'author';
1318
- if ('admin' == $_POST['sender']) {
1319
  $sender = 'admin';
1320
  }
1321
- $this->subscribe2_options['sender'] = $sender;
1322
-
1323
- // send per-post or digest emails
1324
- $email_freq = $_POST['email_freq'];
1325
- $this->subscribe2_options['email_freq'] = $email_freq;
1326
- wp_clear_scheduled_hook('s2_digest_cron');
1327
- $scheds = (array) wp_get_schedules();
1328
- $interval = ( isset($scheds[$email_freq]['interval']) ) ? (int) $scheds[$email_freq]['interval'] : 0;
1329
- if ($interval == 0) {
1330
- // if we are on per-post emails remove last_cron entry
1331
- unset($this->subscribe2_options['last_s2cron']);
1332
- } else {
1333
- if (!wp_next_scheduled('s2_digest_cron')) {
1334
- // if we are using digest schedule the event and prime last_cron as now
1335
- wp_schedule_event(time() + $interval, $email_freq, 's2_digest_cron');
1336
- $now = date('Y-m-d H:i:s', time());
1337
- $this->subscribe2_options['last_s2cron'] = $now;
1338
- }
1339
- }
1340
 
1341
  // email templates
1342
- $mailtext = $_POST['mailtext'];
1343
- $this->subscribe2_options['mailtext'] = $mailtext;
1344
- $confirm_email = $_POST['confirm_email'];
1345
- $this->subscribe2_options['confirm_email'] = $confirm_email;
1346
- $remind_email = $_POST['remind_email'];
1347
- $this->subscribe2_options['remind_email'] = $remind_email;
1348
-
1349
- //automatic subscription
1350
- $autosub_option = $_POST['autosub'];
1351
- $this->subscribe2_options['autosub']= $autosub_option;
1352
- $autosub_format_option = $_POST['autoformat'];
1353
- $this->subscribe2_options['autoformat']= $autosub_format_option;
1354
-
1355
  //barred domains
1356
- $barred_option = $_POST['barred'];
1357
- $this->subscribe2_options['barred'] = $barred_option;
1358
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>$this->options_saved</p></strong></div>";
1359
- update_option('subscribe2_options', $this->subscribe2_options);
1360
  }
1361
  }
1362
  // show our form
 
 
 
 
 
 
 
 
1363
  echo "<div class=\"wrap\">";
1364
- echo "<form method=\"post\" action=\"\">\r\n";
1365
- if (function_exists('wp_nonce_field')) {
1366
- wp_nonce_field('subscribe2-options_subscribers' . $s2nonce);
1367
- }
1368
- echo "<input type=\"hidden\" name=\"s2_admin\" value=\"options\" />\r\n";
1369
- echo "<h2>" . __('Delivery Options', 'subscribe2') . ":</h2>\r\n";
1370
  echo __('Send Email From', 'subscribe2') . ': ';
1371
- echo "<input type=\"radio\" name=\"sender\" value=\"author\"";
1372
- if ('author' == $this->subscribe2_options['sender']) {
1373
  echo "checked=\"checked\" ";
1374
  }
1375
  echo " /> " . __('Author of the post', 'subscribe2') . " &nbsp;&nbsp;";
1376
- echo "<input type=\"radio\" name=\"sender\" value=\"admin\"";
1377
- if ('admin' == $this->subscribe2_options['sender']) {
1378
  echo "checked=\"checked\" ";
1379
  }
1380
- echo " /> " . __('Blog Admin', 'subscribe2') . "<br /><br />\r\n";
1381
- if (function_exists('wp_schedule_event')) {
1382
- echo __('Send Email as Digest', 'subscribe2') . ": <br /><br />\r\n";
1383
- $this->display_digest_choices();
1384
- echo "<br />\r\n";
1385
- }
1386
  echo "<h2>" . __('Email Templates', 'subscribe2') . "</h2>\r\n";
1387
- echo "<table width=\"100%\" cellspacing=\"2\" cellpadding=\"1\" class=\"editform\">\r\n";
1388
  echo "<tr><td>";
1389
  echo __('New Post email (must not be empty)', 'subscribe2') . ":";
1390
  echo "<br />\r\n";
1391
- echo "<textarea rows=\"9\" cols=\"60\" name=\"mailtext\">" . stripslashes($this->subscribe2_options['mailtext']) . "</textarea><br /><br />\r\n";
1392
  echo "</td><td valign=\"top\" rowspan=\"3\">";
1393
  echo "<h3>" . __('Message substitions', 'subscribe2') . "</h3>\r\n";
1394
  echo "<dl>";
@@ -1399,79 +1220,45 @@ class subscribe2 {
1399
  echo "<dt><b>PERMALINK</b></dt><dd>" . __("the post's permalink", 'subscribe2') . "</dd>\r\n";
1400
  echo "<dt><b>MYNAME</b></dt><dd>" . __("the admin or post author's name", 'subscribe2') . "</dd>\r\n";
1401
  echo "<dt><b>EMAIL</b></dt><dd>" . __("the admin or post author's email", 'subscribe2') . "</dd>\r\n";
1402
- echo "<dt><b>AUTHORNAME</b></dt><dd>" . __("the post author's name", 'subscribe2') . "</dd>\r\n";
1403
- echo "<dt><b>LINK</b></dt><dd>" . __("the generated link to confirm a request<br />(<i>only used in the confirmation email template</i>)", 'subscribe2') . "</dd>\r\n";
1404
- echo "<dt><b>ACTION</b></dt><dd>" . __("Action performed by LINK in confirmation email<br />(<i>only used in the confirmation email template</i>)", 'subscribe2') . "</dd>\r\n";
1405
  echo "</dl></td></tr><tr><td>";
1406
  echo __('Subscribe / Unsubscribe confirmation email', 'subscribe2') . ":<br />\r\n";
1407
- echo "<textarea rows=\"9\" cols=\"60\" name=\"confirm_email\">" . stripslashes($this->subscribe2_options['confirm_email']) . "</textarea><br /><br />\r\n";
1408
- echo "</td></tr><tr valign=\"top\"><td>";
1409
  echo __('Reminder email to Unconfirmed Subscribers', 'subscribe2') . ":<br />\r\n";
1410
- echo "<textarea rows=\"9\" cols=\"60\" name=\"remind_email\">" . stripslashes($this->subscribe2_options['remind_email']) . "</textarea><br /><br />\r\n";
1411
- echo "</td></tr></table><br />\r\n";
1412
 
1413
  // excluded categories
1414
  echo "<h2>" . __('Excluded Categories', 'subscribe2') . "</h2>\r\n";
1415
  $this->display_category_form(explode(',', $this->get_excluded_cats()));
1416
- echo "<center><input type=\"checkbox\" name=\"reg_override\" value=\"1\"";
1417
- if ('1' == $this->subscribe2_options['reg_override']) {
1418
- echo " checked=\"checked\"";
 
1419
  }
1420
- echo " /> " . __('Allow registered users to subscribe to excluded categories?', 'subscribe2') . "</center><br />\r\n";
1421
  echo "<h2>" . __('Writing Options', 'subscribe2') . "</h2>\r\n";
1422
- echo "<input type=\"checkbox\" name=\"show_button\" value=\"1\"";
1423
- if ('1' == $this->subscribe2_options['show_button']) {
1424
- echo " checked=\"checked\"";
1425
  }
1426
- echo " /> " . __('Show the Subscribe2 button on the Write toolbar?', 'subscribe2') . "<br /><br />\r\n";
1427
-
1428
- //Auto Subscription for new registrations
1429
- echo "<h2>" . __('Auto Subscribe', 'subscribe2') . "</h2>\r\n";
1430
- echo __('Automatically subscribe new users registering with your blog.', 'subscribe2') . "<br />\r\n";
1431
- echo "<input type=\"radio\" name=\"autosub\" value=\"yes\"";
1432
- if ('yes' == $this->subscribe2_options['autosub']) {
1433
- echo " checked=\"checked\"";
1434
- }
1435
- echo " /> " . __('Yes', 'subscribe2') . " &nbsp;&nbsp;";
1436
- echo "<input type=\"radio\" name=\"autosub\" value=\"no\"";
1437
- if ('no' == $this->subscribe2_options['autosub']) {
1438
- echo " checked=\"checked\"";
1439
- }
1440
- echo " /> " . __('No', 'subscribe2') . "<br /><br />\r\n";
1441
- echo __('Auto-subscribe users to receive email as', 'subscribe2') . ": <br />\r\n";
1442
- echo "<input type=\"radio\" name=\"autoformat\" value=\"html\"";
1443
- if ('html' == $this->subscribe2_options['autoformat']) {
1444
- echo "checked=\"checked\" ";
1445
- }
1446
- echo "/> " . __('HTML', 'subscribe2') ." &nbsp;&nbsp;";
1447
- echo "<input type=\"radio\" name=\"autoformat\" value=\"fulltext\" ";
1448
- if ('fulltext' == $this->subscribe2_options['autoformat']) {
1449
- echo "checked=\"checked\" ";
1450
- }
1451
- echo "/> " . __('Plain Text - Full', 'subscribe2') . " &nbsp;&nbsp;";
1452
- echo "<input type=\"radio\" name=\"autoformat\" value=\"text\" ";
1453
- if ('text' == $this->subscribe2_options['autoformat']) {
1454
- echo "checked=\"checked\" ";
1455
- }
1456
- echo "/> " . __('Plain Text - Excerpt', 'subscribe2') . " <br /><br />";
1457
 
1458
  //barred domains
1459
  echo "<h2>" . __('Barred Domains', 'subscribe2') . "</h2>\r\n";
1460
  echo __('Enter domains to bar from public subscriptions: <br /> (Use a new line for each entry and omit the "@" symbol, for example email.com)', 'subscribe2');
1461
- echo "<br />\r\n<textarea style=\"width: 98%;\" rows=\"4\" cols=\"60\" name=\"barred\">" . $this->subscribe2_options['barred'] . "</textarea>";
1462
 
1463
  // submit
1464
  echo "<p align=\"center\"><span class=\"submit\"><input type=\"submit\" id=\"save\" name=\"submit\" value=\"" . __('Submit', 'subscribe2') . "\" /></span></p>";
1465
  echo "</form>\r\n";
1466
- echo "</div><div class=\"wrap\">";
1467
 
 
1468
  // reset
1469
  echo "<h2>" . __('Reset Default', 'subscribe2') . "</h2>\r\n";
1470
  echo "<p>" . __('Use this to reset all options to their defaults. This <strong><em>will not</em></strong> modify your list of subscribers.', 'subscribe2') . "</p>\r\n";
1471
  echo "<form method=\"post\" action=\"\">";
1472
- if (function_exists('wp_nonce_field')) {
1473
- wp_nonce_field('subscribe2-options_subscribers' . $s2nonce);
1474
- }
1475
  echo "<p align=\"center\"><span class=\"submit\">";
1476
  echo "<input type=\"hidden\" name=\"s2_admin\" value=\"RESET\" />";
1477
  echo "<input type=\"submit\" id=\"deletepost\" name=\"submit\" value=\"" . __('RESET', 'subscribe2') .
@@ -1487,14 +1274,12 @@ class subscribe2 {
1487
  Our profile menu
1488
  */
1489
  function user_menu() {
1490
- global $user_ID, $s2nonce;
1491
 
1492
  get_currentuserinfo();
1493
 
1494
  // was anything POSTed?
1495
  if ( (isset($_POST['s2_admin'])) && ('user' == $_POST['s2_admin']) ) {
1496
- check_admin_referer('subscribe2-user_subscribers' . $s2nonce);
1497
- echo "<div id=\"message\" class=\"updated fade\"><p><strong>" . __('Subscription preferences updated.', 'subscribe2') . "</strong></p></div>\n";
1498
  $format = 'text';
1499
  $post = 'post';
1500
  if ('html' == $_POST['s2_format']) {
@@ -1505,7 +1290,6 @@ class subscribe2 {
1505
  }
1506
  update_usermeta($user_ID, 's2_excerpt', $post);
1507
  update_usermeta($user_ID, 's2_format', $format);
1508
- update_usermeta($user_ID, 's2_autosub', $_POST['new_category']);
1509
 
1510
  $cats = $_POST['category'];
1511
  if (empty($cats)) {
@@ -1515,21 +1299,21 @@ class subscribe2 {
1515
  delete_usermeta($user_ID, "s2_cat" . $cat);
1516
  }
1517
  }
1518
- delete_usermeta($user_ID, 's2_subscribed');
1519
  } else {
1520
- if (!is_array($cats)) {
1521
  $cats = array($_POST['category']);
1522
  }
1523
  $old_cats = explode(',', get_usermeta($user_ID, 's2_subscribed'));
1524
  $remove = array_diff($old_cats, $cats);
1525
  $new = array_diff($cats, $old_cats);
1526
- if (!empty($remove)) {
1527
  // remove subscription to these cat IDs
1528
  foreach ($remove as $id) {
1529
  delete_usermeta($user_ID, "s2_cat" .$id);
1530
  }
1531
  }
1532
- if (!empty($new)) {
1533
  // add subscription to these cat IDs
1534
  foreach ($new as $id) {
1535
  update_usermeta($user_ID, 's2_cat' . $id, "$id");
@@ -1543,11 +1327,8 @@ class subscribe2 {
1543
  echo "<div class=\"wrap\">";
1544
  echo "<h2>" . __('Notification Settings', 'subscribe2') . "</h2>\r\n";
1545
  echo "<form method=\"post\" action=\"\">";
1546
- if (function_exists('wp_nonce_field')) {
1547
- wp_nonce_field('subscribe2-user_subscribers' . $s2nonce);
1548
- }
1549
  echo "<input type=\"hidden\" name=\"s2_admin\" value=\"user\" />";
1550
- if ($this->subscribe2_options['email_freq'] == 'never') {
1551
  echo __('Receive email as', 'subscribe2') . ": &nbsp;&nbsp;";
1552
  echo "<input type=\"radio\" name=\"s2_format\" value=\"html\"";
1553
  if ('html' == get_usermeta($user_ID, 's2_format')) {
@@ -1569,28 +1350,18 @@ class subscribe2 {
1569
  }
1570
  echo " /> $value ";
1571
  }
1572
- echo "<p style=\"color: red\">" . __('Note: HTML format will always deliver the full post.', 'subscribe2') . "</p>\r\n";
1573
- echo __('Automatically subscribe me to newly created categories', 'subscribe2') . ': &nbsp;&nbsp;';
1574
- echo "<input type=\"radio\" name=\"new_category\" value=\"yes\" ";
1575
- if ('yes' == get_usermeta($user_ID, 's2_autosub')) {
1576
- echo "checked=\"yes\" ";
1577
- }
1578
- echo "/> Yes <input type=\"radio\" name=\"new_category\" value=\"no\" ";
1579
- if ('no' == get_usermeta($user_ID, 's2_autosub')) {
1580
- echo "checked=\"yes\" ";
1581
- }
1582
- echo "/> No<br /><br />";
1583
 
1584
  // subscribed categories
1585
  echo "<h2>" . __('Subscribed Categories', 'subscribe2') . "</h2>\r\n";
1586
- $this->display_category_form(explode(',', get_usermeta($user_ID, 's2_subscribed')), $this->subscribe2_options['reg_override']);
1587
  } else {
1588
  // we're doing daily digests, so just show
1589
  // subscribe / unnsubscribe
1590
  echo __('Receive daily summary of new posts?', 'subscribe2') . ': &nbsp;&nbsp;';
1591
- echo "<input type=\"radio\" name=\"category\" value=\"1\" ";
1592
- if (get_usermeta($user_ID, 's2_subscribed')) {
1593
- echo "checked=\"yes\" ";
1594
  }
1595
  echo "/> Yes <input type=\"radio\" name=\"category\" value=\"\" ";
1596
  if (! get_usermeta($user_ID, 's2_subscribed')) {
@@ -1603,6 +1374,7 @@ class subscribe2 {
1603
  echo "<p align=\"right\"><span class=\"submit\"><input type=\"submit\" name=\"submit\" value=\"" . __("Update Preferences &raquo;", 'subscribe2') . "\" /></span></p>";
1604
  echo "</form></div>\r\n";
1605
 
 
1606
  include(ABSPATH . '/wp-admin/admin-footer.php');
1607
  // just to be sure
1608
  die;
@@ -1612,11 +1384,8 @@ class subscribe2 {
1612
  Display the Write sub-menu
1613
  */
1614
  function write_menu() {
1615
- global $wpdb, $s2nonce;
1616
-
1617
  // was anything POSTed?
1618
  if (isset($_POST['s2_admin']) && ('mail' == $_POST['s2_admin']) ) {
1619
- check_admin_referer('subscribe2-write_subscribers' . $s2nonce);
1620
  if ('confirmed' == $_POST['what']) {
1621
  $recipients = $this->get_public();
1622
  } elseif ('unconfirmed' == $_POST['what']) {
@@ -1636,7 +1405,7 @@ class subscribe2 {
1636
  $this->myname = $user_identity;
1637
  $this->myemail = $user_email;
1638
  $subject = strip_tags($_POST['subject']);
1639
- $message = stripslashes($_POST['message']);
1640
  $this->mail($recipients, $subject, $message, 'text');
1641
  $message = $this->mail_sent;
1642
  }
@@ -1647,9 +1416,6 @@ class subscribe2 {
1647
  // show our form
1648
  echo "<div class=\"wrap\"><h2>" . __('Send email to all subscribers', 'subscribe2') . "</h2>\r\n";
1649
  echo "<form method=\"post\" action=\"\">\r\n";
1650
- if (function_exists('wp_nonce_field')) {
1651
- wp_nonce_field('subscribe2-write_subscribers' . $s2nonce);
1652
- }
1653
  echo __('Subject', 'subscribe2') . ": <input type=\"text\" size=\"69\" name=\"subject\" value=\"" . __('A message from ', 'subscribe2') . get_settings('blogname') . "\" /> <br />";
1654
  echo "<textarea rows=\"12\" cols=\"75\" name=\"message\"></textarea>";
1655
  echo "<br />\r\n";
@@ -1668,13 +1434,13 @@ class subscribe2 {
1668
  /* ===== helper functions: forms and stuff ===== */
1669
  /**
1670
  Display a table of categories with checkboxes
 
1671
  Optionally pre-select those categories specified
1672
  */
1673
  function display_category_form($selected = array(), $override = 1) {
1674
  global $wpdb;
1675
 
1676
- $all_cats = get_categories('type=post&hide_empty=1&hierarchical=0');
1677
-
1678
  if (0 == $override) {
1679
  // registered users are not allowed to subscribe to
1680
  // excluded categories
@@ -1688,38 +1454,35 @@ class subscribe2 {
1688
  $half = (count($all_cats) / 2);
1689
  $i = 0;
1690
  $j = 0;
1691
- echo "<table width=\"100%\" cellspacing=\"2\" cellpadding=\"5\" class=\"editform\">\r\n";
1692
- echo "<tr valign=\"top\"><td width=\"50%\" align=\"left\">\r\n";
1693
- foreach ($all_cats as $cat) {
1694
  if ( ($i >= $half) && (0 == $j) ){
1695
- echo "</td><td width=\"50%\" align=\"left\">\r\n";
1696
  $j++;
1697
  }
1698
  if (0 == $j) {
1699
- echo "<input type=\"checkbox\" name=\"category[]\" value=\"" . $cat->cat_ID . "\"";
1700
- if (in_array($cat->cat_ID, $selected)) {
1701
  echo " checked=\"checked\" ";
1702
  }
1703
- echo " /> " . $cat->cat_name . "<br />\r\n";
1704
  } else {
1705
 
1706
- echo "<input type=\"checkbox\" name=\"category[]\" value=\"" . $cat->cat_ID . "\"";
1707
- if (in_array($cat->cat_ID, $selected)) {
1708
  echo " checked=\"checked\" ";
1709
  }
1710
- echo " /> " . $cat->cat_name . "<br />\r\n";
1711
  }
1712
  $i++;
1713
  }
1714
- echo "</td></tr>\r\n";
1715
- echo "<tr><td align=\"left\">\r\n";
1716
- echo "<input type=\"checkbox\" name=\"checkall\" onclick=\"setAll(this)\" /> " . __('Select / Unselect All' ,'subscribe2') . "\r\n";
1717
- echo "</td></tr>\r\n";
1718
- echo "</table>\r\n";
1719
  } // end display_category_form()
1720
 
1721
  /**
1722
  Display a drop-down form to select subscribers
 
1723
  $selected is the option to select
1724
  $submit is the text to use on the Submit button
1725
  */
@@ -1732,8 +1495,6 @@ class subscribe2 {
1732
  'unconfirmed' => ' &nbsp;&nbsp;' . __('Unconfirmed', 'subscribe2'),
1733
  'registered' => __('Registered Subscribers', 'subscribe2'));
1734
 
1735
- $all_cats = get_categories('type=post&hide_empty=1&hierarchical=0');
1736
-
1737
  // count the number of subscribers
1738
  $count['confirmed'] = $wpdb->get_var("SELECT COUNT(id) FROM $this->public WHERE active='1'");
1739
  $count['unconfirmed'] = $wpdb->get_var("SELECT COUNT(id) FROM $this->public WHERE active='0'");
@@ -1746,8 +1507,8 @@ class subscribe2 {
1746
  }
1747
  $count['registered'] = $wpdb->get_var("SELECT COUNT(meta_key) FROM $wpdb->usermeta WHERE meta_key='s2_subscribed'");
1748
  $count['all'] = ($count['confirmed'] + $count['unconfirmed'] + $count['registered']);
1749
- foreach ($all_cats as $cat) {
1750
- $count[$cat->cat_name] = $wpdb->get_var("SELECT COUNT(meta_value) FROM $wpdb->usermeta WHERE meta_key='s2_cat$cat->cat_ID'");
1751
  }
1752
 
1753
  // do have actually have some subscribers?
@@ -1764,17 +1525,18 @@ class subscribe2 {
1764
  if (in_array($whom, $exclude)) { continue; }
1765
  if (0 == $count[$whom]) { continue; }
1766
 
1767
- echo "<option value=\"" . $whom . "\"";
1768
  if ($whom == $selected) { echo " selected=\"selected\" "; }
1769
  echo ">$display (" . ($count[$whom]) . ")</option>\r\n";
1770
  }
1771
 
1772
  if ($count['registered'] > 0) {
1773
- foreach ($all_cats as $cat) {
1774
- if (in_array($cat->cat_ID, $exclude)) { continue; }
1775
- echo "<option value=\"" . $cat->cat_ID . "\"";
1776
- if ($cat->cat_ID == $selected) { echo " selected=\"selected\" "; }
1777
- echo "> &nbsp;&nbsp;" . $cat->cat_name . "&nbsp;(" . $count[$cat->cat_name] . ") </option>\r\n";
 
1778
  }
1779
  }
1780
  echo "</select>";
@@ -1783,51 +1545,22 @@ class subscribe2 {
1783
  }
1784
  } // end display_subscriber_dropdown()
1785
 
1786
- function display_digest_choices() {
1787
- global $wpdb;
1788
- $schedule = (array)wp_get_schedules();
1789
- $schedule = array_merge(array('never' => array('interval' => 0, 'display' => __('Per Post Email','subscribe2'))), $schedule);
1790
- $sort = array();
1791
- foreach ( (array)$schedule as $key => $value ) $sort[$key] = $value['interval'];
1792
- asort($sort);
1793
- $schedule_sorted = array();
1794
- foreach ($sort as $key => $value) {
1795
- $schedule_sorted[$key] = $schedule[$key];
1796
- }
1797
- foreach ($schedule_sorted as $key => $value) {
1798
- echo "<input type=\"radio\" name=\"email_freq\" value=\"" . $key . "\"";
1799
- if ($key == $this->subscribe2_options['email_freq']) {
1800
- echo " checked=\"checked\" ";
1801
- }
1802
- echo " /> " . $value['display'] . "<br />\r\n";
1803
- }
1804
- if (wp_next_scheduled('s2_digest_cron')) {
1805
- $datetime = get_option('date_format') . ' @ ' . get_option('time_format');
1806
- echo "<p>" . __('Next email notification will be sent', 'subscribe2') . ": \r\n";
1807
- echo "<strong>" . gmdate($datetime, wp_next_scheduled('s2_digest_cron') + (get_option('gmt_offset') * 3600)) . "</strong></p>\r\n";
1808
- }
1809
- } // end display_digest_choices()
1810
-
1811
  /* ===== template and filter functions ===== */
1812
  /**
1813
  Display our form; also handles (un)subscribe requests
1814
  */
1815
  function filter($content = '') {
1816
- if ( ('' == $content) || (! preg_match('|<!--subscribe2-->|', $content)) ) { return $content; }
1817
  $this->s2form = $this->form;
1818
 
1819
  global $user_ID;
1820
  get_currentuserinfo();
1821
  if ($user_ID) {
1822
- if (current_user_can('manage_options')) {
1823
- $this->s2form = $this->use_profile_admin;
1824
- } else {
1825
- $this->s2form = $this->use_profile_users;
1826
- }
1827
  }
1828
  if (isset($_POST['s2_action'])) {
1829
  global $wpdb, $user_email;
1830
- if (!is_email($_POST['email'])) {
1831
  $this->s2form = $this->form . $this->not_an_email;
1832
  } elseif ($this->is_barred($_POST['email'])) {
1833
  $this->s2form = $this->form . $this->barred_domain;
@@ -1871,12 +1604,13 @@ class subscribe2 {
1871
  }
1872
  }
1873
  }
1874
- return preg_replace('|(<p>)(\n)*<!--subscribe2-->(\n)*(</p>)|', $this->s2form, $content);
1875
  } // end filter()
1876
 
1877
  /**
1878
  Overrides the default query when handling a (un)subscription confirmation
1879
- This is basically a trick: if the s2 variable is in the query string, just grab the first static page
 
1880
  and override it's contents later with title_filter() and template_filter()
1881
  */
1882
  function query_filter() {
@@ -1885,7 +1619,7 @@ class subscribe2 {
1885
 
1886
  global $wpdb;
1887
 
1888
- if ( (defined('S2PAGE')) && (0 !== S2PAGE) ) {
1889
  return "page_id=" . S2PAGE;
1890
  } else {
1891
  $id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status='static' LIMIT 1");
@@ -1916,23 +1650,49 @@ class subscribe2 {
1916
  } // end template_filter()
1917
 
1918
  /* ===== wp-cron functions ===== */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1919
  /**
1920
  Send a daily digest of today's new posts
1921
  */
1922
- function subscribe2_cron() {
1923
  global $wpdb;
1924
 
1925
- // collect posts
1926
- $now = date('Y-m-d H:i:s', time());
1927
- $prev = $this->subscribe2_options['last_s2cron'];
1928
- $posts = $wpdb->get_results("SELECT ID, post_title, post_excerpt, post_content FROM $wpdb->posts WHERE post_date >= '$prev' AND post_date < '$now' AND post_status='publish' AND post_type='post'");
1929
 
1930
- // update last_s2cron execution time before completing or bailing
1931
- $this->subscribe2_options['last_s2cron'] = $now;
1932
- update_option('subscribe2_options', $this->subscribe2_options);
1933
-
1934
  // do we have any posts?
1935
- if (empty($posts)) { return; }
1936
 
1937
  // if we have posts, let's prepare the digest
1938
  foreach ($posts as $post) {
@@ -1951,7 +1711,7 @@ class subscribe2 {
1951
  if ($check) {
1952
  continue;
1953
  }
1954
- $message .= $post->post_title . "\r\n";
1955
  $message .= get_permalink($post->ID) . "\r\n";
1956
  $excerpt = $post->post_excerpt;
1957
  if ('' == $excerpt) {
@@ -1970,33 +1730,51 @@ class subscribe2 {
1970
  }
1971
  }
1972
  }
1973
- $message .= $excerpt . "\r\n\r\n";
1974
  }
1975
 
1976
- $author = get_userdata($post->post_author);
1977
-
1978
  // do we send as admin, or post author?
1979
- if ('author' == $this->subscribe2_options['sender']) {
1980
  // get author details
1981
- $user =& $author;
1982
  } else {
1983
  // get admin detailts
1984
  $user = get_userdata(1);
1985
  }
1986
- $this->myemail = $user->user_email;
1987
- $this->myname = $user->display_name;
1988
-
1989
- $scheds = (array) wp_get_schedules();
1990
- $email_freq = $this->subscribe2_options['email_freq'];
1991
- $display = $scheds[$email_freq]['display'];
1992
- $subject = '[' . stripslashes(get_settings('blogname')) . '] ' . $display . ' ' . __('Digest Email', 'subscribe2');
1993
  $public = $this->get_public();
1994
  $registered = $this->get_registered();
1995
  $recipients = array_merge((array)$public, (array)$registered);
1996
- $mailtext = $this->substitute(stripslashes($this->subscribe2_options['mailtext']));
1997
  $body = str_replace('POST', $message, $mailtext);
1998
  $this->mail($recipients, $subject, $body);
1999
- } // end subscribe2_cron
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2000
 
2001
  /* ===== Our constructor ===== */
2002
  /**
@@ -2007,17 +1785,12 @@ class subscribe2 {
2007
 
2008
  load_plugin_textdomain('subscribe2', 'wp-content/plugins/subscribe2');
2009
 
2010
- // load the options
2011
- $this->subscribe2_options = array();
2012
- $this->subscribe2_options = get_option('subscribe2_options');
2013
-
2014
  // do we need to install anything?
2015
  $this->public = $table_prefix . "subscribe2";
2016
- if(mysql_query("SELECT COUNT(*) FROM ".$this->public)==FALSE) { $this->install(); }
2017
  //do we need to upgrade anything?
2018
- if ($this->subscribe2_options['version'] !== S2VERSION) {
2019
- $this->upgrade();
2020
- }
2021
 
2022
  if (isset($_GET['s2'])) {
2023
  // someone is confirming a request
@@ -2026,21 +1799,22 @@ class subscribe2 {
2026
  add_filter('the_content', array(&$this, 'confirm'));
2027
  }
2028
 
2029
- add_action('admin_head', array(&$this, 'admin_head'));
2030
  add_action('admin_menu', array(&$this, 'admin_menu'));
 
 
 
2031
  add_action('user_register', array(&$this, 'register'));
2032
- add_action('create_category', array(&$this, 'autosub_new_category'));
2033
  add_filter('the_content', array(&$this, 'filter'));
2034
- add_filter('cron_schedules', array(&$this, 'add_weekly_sched'));
2035
-
2036
- if ($this->subscribe2_options['email_freq'] != 'never') {
2037
- add_action('s2_digest_cron', array(&$this, 'subscribe2_cron'));
2038
- } else {
2039
- add_action('publish_post', array(&$this, 'publish'));
2040
- add_action('edit_post', array(&$this, 'edit'));
2041
- add_action('private_to_published', array(&$this, 'private2publish'));
 
2042
  }
2043
-
2044
  // load our strings
2045
  $this->load_strings();
2046
  } // end subscribe2()
@@ -2082,5 +1856,7 @@ class subscribe2 {
2082
  var $confirm_subject = '';
2083
  var $options_saved = '';
2084
  var $options_reset = '';
 
2085
  } // end class subscribe2
 
2086
  ?>
1
  <?php
2
  /*
3
  Plugin Name: Subscribe2
4
+ Plugin URI: http://www.prescriber.org.uk/subscribe2.php
5
  Description: Notifies an email list when new entries are posted.
6
+ Version: 2.2.6
7
  Author: Matthew Robinson
8
+ Author URI: http://www.prescriber.org.uk/subscribe2.php
9
  */
10
 
11
  /*
 
12
  Based on the Original Subscribe2 plugin by
13
  Copyright (C) 2005 Scott Merrill (skippy@skippy.net)
14
 
28
  http://www.gnu.org/licenses/gpl.html
29
  */
30
 
31
+ // use Owen's excellent ButtonSnap library
32
+ include(ABSPATH . '/wp-content/plugins/buttonsnap.php');
33
+
34
+ // change this to TRUE if you're on Dreamhost
35
+ // (or any other host that limits the number of recipients
36
+ // permitted on each outgoing email message)
37
+ define('DREAMHOST', false);
38
 
39
  // by default, subscribe2 grabs the first page from your database for use
40
  // when displaying the confirmation screen to public subscribers.
41
  // You can override this by specifying a page ID below.
42
  define('S2PAGE', '0');
43
 
44
+ // change this to TRUE if you want a daily digest of the day's posts
45
+ // send to your subscribers
46
+ define('S2DIGEST', false);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
+ // our version number. Don't touch.
49
+ define('S2VERSION', '2.2.6');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
  // start our class
52
  class subscribe2 {
60
 
61
  $this->please_log_in = "<p>" . __('To manage your subscription options please ', 'subscribe2') . "<a href=\"" . get_settings('siteurl') . "/wp-login.php\">login</a>.</p>";
62
 
63
+ $this->use_profile = "<p>" . __('You may manage your subscription options from your ', 'subscribe2') . "<a href=\"" . get_settings('siteurl') . "/wp-admin/profile.php?page=subscribe2/subscribe2.php\">profile</a>.</p>";
 
 
64
 
65
  $this->confirmation_sent = "<p>" . __('A confirmation message is on its way!', 'subscribe2') . "</p>";
66
 
85
 
86
  $this->confirm_subject = "[" . get_settings('blogname') . "] " . __('Please confirm your request', 'subscribe2');
87
 
 
 
 
 
 
 
88
  // menu strings
89
  $this->options_saved = __('Options saved!', 'subscribe2');
90
  $this->options_reset = __('Options reset!', 'subscribe2');
95
  Hook the menu
96
  */
97
  function admin_menu() {
98
+ add_management_page(__('Subscribers', 'subscribe2'), __('Subscribers', 'subscribe2'), "manage_options", basename(__FILE__), array(&$this, 'manage_menu'));
99
+ add_options_page(__('Subscribe2 Options', 'subscribe2'), __('Subscribe2','subscribe2'), "manage_options", basename(__FILE__), array(&$this, 'options_menu'));
100
+ add_submenu_page('profile.php', __('Subscriptions', 'subscribe2'), __('Subscriptions', 'subscribe2'), "read", __FILE__, array(&$this, 'user_menu'));
101
+ add_submenu_page('post.php', __('Mail Subscribers','subscribe2'), __('Mail Subscribers', 'subscribe2'),"manage_options", __FILE__, array(&$this, 'write_menu'));
 
 
 
 
 
102
  }
103
 
104
+ /* ===== ButtonSnap configuration ===== */
105
  /**
106
+ Register our button in the QuickTags bar
107
  */
108
+ function s2_button_init() {
109
+ $url = get_settings('siteurl') . '/wp-content/plugins/subscribe2/s2_button.png';
110
+ buttonsnap_textbutton($url, 'Subscribe2', '<!--subscribe2-->');
111
+ buttonsnap_register_marker('subscribe2', 's2_marker');
 
 
 
 
 
 
 
 
 
112
  }
113
 
114
+ /**
115
+ Style a marker in the Rich Text Editor for our tag
116
+
117
+ By default, the RTE suppresses output of HTML comments, so this places a CSS style on our token in order to make it display
118
+ */
119
+ function subscribe2_css() {
120
+ $marker_url = get_settings('siteurl') . '/wp-content/plugins/subscribe2/s2_marker.png';
121
+ echo "
122
+ .s2_marker {
123
+ display: block;
124
+ height: 45px;
125
+ margin-top: 5px;
126
+ background-image: url({$marker_url});
127
+ background-repeat: no-repeat;
128
+ background-position: center;
129
+ }
130
+ ";
131
  }
132
 
133
  /* ===== Install, upgrade, reset ===== */
136
  */
137
  function install() {
138
  // include upgrade-functions for maybe_create_table;
139
+ if (! function_exists('maybe_create_table')) {
140
  require_once(ABSPATH . '/wp-admin/upgrade-functions.php');
141
  }
142
  $date = date('Y-m-d');
159
  global $wpdb;
160
 
161
  // include upgrade-functions for maybe_create_table;
162
+ if (! function_exists('maybe_create_table')) {
163
  require_once(ABSPATH . '/wp-admin/upgrade-functions.php');
164
  }
165
  $date = date('Y-m-d');
166
  maybe_add_column($this->public, 'date', "ALTER TABLE `$this->public` ADD `date` DATE DEFAULT '$date' NOT NULL AFTER `active`;");
167
+ //add reminder email template info for version 2.2.4
168
+ $s2_remind_email = get_option('s2_remind_email');
169
+ if (empty($s2_remind_email)) {
170
+ update_option('s2_remind_email', "This email address was subscribed for notifications at BLOGNAME (BLOGLINK) but the subscription remains incomplete.\n\nIf you wish to complete your subscription please click on the link below:\n\nLINK\n\nIf you do not wish to complete your subscription please ignore this email and your address will be removed from our database.\n\nRegards,\nMYNAME");
171
+ }
172
+ update_option('s2_version', S2VERSION);
173
 
174
  // let's take the time to check process registered users
175
+ // existing public subscribers are subscribed to all categories
176
+ $check = $wpdb->get_col("SELECT ID FROM $wpdb->users");
177
+ if (! empty($check)) {
178
+ foreach ($check as $user) {
179
  $this->register($user);
180
  }
181
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  } // end upgrade()
183
 
184
  /**
185
  Reset our options
186
  */
187
  function reset() {
188
+ update_option('s2_sender', 'author');
189
+ update_option('s2_mailtext', "BLOGNAME has posted a new item, 'TITLE'\r\nPOST\r\nYou may view the latest post at\r\nPERMALINK\r\nYou received this e-mail because you asked to be notified when new updates are posted.\r\nBest regards,\r\nMYNAME\r\nEMAIL");
190
+ update_option('s2_confirm_email', "In order to confirm your request for BLOGNAME, please click on the link below:\n\nLINK\n\nIf you did not request this, please feel free to disregard this notice!\n\nThank you,\nMYNAME.");
191
+ update_option('s2_remind_email', "This email address was subscribed for notifications at BLOGNAME (BLOGLINK) but the subscription remains incomplete.\n\nIf you wish to complete your subscription please click on the link below:\n\nLINK\n\nIf you do not wish to complete your subscription please ignore this email and your address will be removed from our database.\n\nRegards,\nMYNAME");
192
+ update_option('s2_exclude', '');
193
+ update_option('s2_reg_override', '1');
194
+ update_option('s2_show_button', '1');
195
+ update_option('s2_barred', '');
196
+ } // end reset()
197
 
198
  /* ===== mail handling ===== */
199
  /**
209
  $string = str_replace('PERMALINK', $this->permalink, $string);
210
  $string = str_replace('MYNAME', stripslashes($this->myname), $string);
211
  $string = str_replace('EMAIL', $this->myemail, $string);
 
212
  return $string;
213
  } // end sustitute()
214
 
216
  Delivers email to recipients in HTML or plaintext
217
  */
218
  function mail ($recipients = array(), $subject = '', $message = '', $type='text') {
219
+ if (empty($recipients)) { return; }
220
+ if ('' == $message) { return; }
221
+
222
  // Set sender details
223
  if ('' == $this->myname) {
224
+ $admin = get_userdata('1');
225
  $this->myname = $admin->display_name;
226
  $this->myemail = $admin->user_email;
227
  }
228
  $headers = "From: $this->myname <$this->myemail>\n";
229
  $headers .= "Return-Path: <$this->myemail>\n";
 
230
  $headers .= "Precedence: list\nList-Id: " . get_settings('blogname') . "\n";
231
 
232
  if ('html' == $type) {
233
  // To send HTML mail, the Content-type header must be set
234
  $headers .= "MIME-Version: 1.0\n";
235
  $headers .= "Content-type: " . get_bloginfo('html_type') . "; charset=\"". get_bloginfo('charset') . "\"\n";
236
+ $mailtext = "<html><head><title>$subject</title></head><body>" . $message . "</body></html>";
237
  } else {
238
  $headers .= "MIME-Version: 1.0\n";
239
  $headers .= "Content-type: text/plain; charset=\"". get_bloginfo('charset') . "\"\n";
240
+ $message = preg_replace('|&.{3,6};|', '', $message);
 
241
  $mailtext = wordwrap(strip_tags($message), 80, "\n");
242
  }
243
 
244
  // BCC all recipients
245
  $bcc = '';
246
+ if ( (defined('DREAMHOST') && true == DREAMHOST) &&
247
+ (count($recipients) > 30) ) {
248
  // we're on Dreamhost, and have more than 30 susbcribers
249
  $count = 1;
250
  $batch = array();
251
  foreach ($recipients as $recipient) {
252
  // advance the array pointer by one, for use down below
253
  // the array pointer _is not_ advanced by the foreach() loop itself
254
+ next($recipients);
255
+ $recipient = trim($recipient);
256
+ // sanity check -- make sure we have a valid email
257
+ if (! is_email($recipient)) { continue; }
258
+ // and NOT the sender's email, since they'll
259
+ // get a copy anyway
260
+ if ( (! empty($recipient)) && ($this->myemail != $recipient) ) {
261
+ ('' == $bcc) ? $bcc = "Bcc: $recipient" : $bcc .= ",\r\n $recipient";
262
+ // Headers constructed as per definition at http://www.ietf.org/rfc/rfc2822.txt
263
+ }
264
+ if (30 == $count) {
265
+ $count = 1;
266
+ $batch[] = $bcc;
267
+ $bcc = '';
 
 
 
 
 
 
268
  } else {
269
+ if (false == current($recipients)) {
270
+ // we've reached the end of the subscriber list
271
+ // add what we have to the batch, and move on
272
+ $batch[] = $bcc;
273
+ break;
274
+ } else {
275
+ $count++;
276
+ }
277
  }
 
278
  }
279
  // rewind the array, just to be safe
280
  reset($recipients);
281
  } else {
282
  // we're not on dreamhost, or have less than 30
283
  // subscribers, so do it normal
284
+ foreach ($recipients as $recipient) {
285
+ $recipient = trim($recipient);
286
+ // sanity check -- make sure we have a valid email
287
+ if (! is_email($recipient)) { continue; }
288
  // and NOT the sender's email, since they'll
289
  // get a copy anyway
290
+ if ( (! empty($recipient)) && ($this->myemail != $recipient) ) {
291
  ('' == $bcc) ? $bcc = "Bcc: $recipient" : $bcc .= ",\r\n $recipient";
292
  // Headers constructed as per definition at http://www.ietf.org/rfc/rfc2822.txt
293
  }
294
+ }
295
+ $headers .= "$bcc\r\n";
296
  }
297
  // actually send mail
298
+ if ( (defined('DREAMHOST') && true == DREAMHOST) && (isset($batch)) ) {
299
+ foreach ($batch as $bcc) {
300
+ $newheaders = $headers . "$bcc\r\n";
301
+ @wp_mail($this->myemail, $subject, $mailtext, $newheaders);
302
+ }
303
+ } else {
304
+ @wp_mail($this->myemail, $subject, $mailtext, $headers);
305
  }
 
 
 
306
  } // end mail()
307
 
308
  /**
309
  Sends an email notification of a new post
310
  */
311
+ function publish($id = 0, $cron = 0) {
312
+ if (! $id) { return $id; }
313
 
314
  // are we doing daily digests? If so, don't send anything now
315
+ if ( defined('S2DIGEST') && true == S2DIGEST ) { return; }
316
 
317
  // we need to determine whether this is a new post, or an edit
318
+ if (0 == $cron) {
319
+ // we're not being called from WP-Cron
320
+ if ($this->private) {
321
+ // this post was published from draft status
322
+ // OR is an edit of an existing post
323
+ // so send no notification
324
+ return $id;
325
+ }
326
  }
327
 
328
  $post_cats = wp_get_post_cats('1', $id);
339
  if ($check) {
340
  // hang on -- can registered users subscribe to
341
  // excluded categories?
342
+ if ('0' == get_option('s2_reg_override')) {
343
  // nope? okay, let's leave
344
  return $id;
345
  }
346
  }
347
 
348
  global $wpdb;
349
+ $post = & get_post($id);
350
  // is this post set in the future?
351
  if ($post->post_date > current_time('mysql')) {
352
+ // is wp-cron installed?
353
+ if (function_exists('wp_cron_init')) {
354
+ // are we doing daily digests?
355
+ if ( defined('S2DIGEST') && false == S2DIGEST ) {
356
+ // not doing daily digests, so
357
+ // add this post to the list of
358
+ // future posts
359
+ $our_post = array('id' => $id, 'date' => $post->post_date);
360
+ $future_posts = get_option('s2_future_posts');
361
+ $future_posts[] = $our_post;
362
+ update_option('s2_future_posts', $future_posts);
363
+ }
364
+ }
365
  // bail out
366
  return $id;
367
  }
368
 
369
  // lets collect our public subscribers
370
  // and all our registered subscribers for these categories
371
+ if (! $check) {
372
  // if this post is assigned to an excluded
373
  // category, then this test will prevent
374
  // the public from receiving notification
377
  $registered = $this->get_registered("cats=$post_cats_string");
378
 
379
  // do we have subscribers?
380
+ if ( empty($public) && empty($registered) ) {
381
  // if not, no sense doing anything else
382
  return $id;
383
  }
384
  // we set these class variables so that we can avoid
385
  // passing them in function calls a little later
386
  $this->post_title = $post->post_title;
387
+ $this->permalink = get_permalink($id);
 
 
 
388
 
389
  // do we send as admin, or post author?
390
+ if ('author' == get_option('s2_sender')) {
391
  // get author details
392
+ $user = get_userdata($post->post_author);
393
  } else {
394
+ // get admin detailts
395
  $user = get_userdata(1);
396
  }
397
  $this->myemail = $user->user_email;
398
  $this->myname = $user->display_name;
399
  // Get email subject
400
+ $subject = $this->substitute($this->s2_subject);
401
  // Get the message template
402
+ $mailtext = $this->substitute(stripslashes(get_option('s2_mailtext')));
403
 
404
  $plaintext = $post->post_content;
405
  $content = apply_filters('the_content', $post->post_content);
416
  // no <!--more-->, so grab the first 55 words
417
  $excerpt = strip_tags($plaintext);
418
  $excerpt_length = 55;
419
+ $words = explode(' ', $plaintext, $excerpt_length + 1);
420
  if (count($words) > $excerpt_length) {
421
  array_pop($words);
422
  array_push($words, '[...]');
451
  /**
452
  Sends a notification when a draft post is published
453
  */
454
+ function private2publish($ID = 0) {
455
+ if (0 == $ID) { return $ID; }
456
 
457
+ $this->publish($ID);
458
  $this->private = TRUE;
459
+ return $ID;
460
  } // end private2publish()
461
 
462
  /**
463
  Prevents notifications from being sent when editing posts
464
  */
465
+ function edit($ID = 0) {
466
+ if (0 == $ID) { return; }
467
 
468
  $this->private = TRUE;
469
+ return $ID;
470
  }
471
 
472
  /**
474
  */
475
  function send_confirm($what = '', $is_remind = FALSE) {
476
  if ($this->filtered == 1) { return; }
477
+ if ( (! $this->email) || (! $what) ) {
478
  return false;
479
  }
480
  $id = $this->get_id($this->email);
481
+ if (! $id) {
482
  return false;
483
  }
484
 
498
 
499
  $admin = get_userdata(1);
500
  $this->myname = $admin->display_name;
501
+
502
  if ($is_remind == TRUE) {
503
+ $body = $this->substitute(get_option('s2_remind_email'));
504
+ $subject = __('Subscription Reminder', 'subscribe2');
505
  } else {
506
+ $body = $this->substitute(get_option('s2_confirm_email'));
507
+ $subject = $this->substitute($this->confirm_subject);
 
 
 
 
 
508
  }
509
 
510
  $body = str_replace("LINK", $link, $body);
511
 
 
 
 
 
512
  $mailheaders .= "MIME-Version: 1.0\n";
513
  $mailheaders .= "Content-type: text/plain; charset=\"". get_bloginfo('charset') . "\"\n";
514
+ $mailheaders .= "From: $admin->display_name <$admin->user_email>";
515
 
516
  @wp_mail ($this->email, $subject, $body, $mailheaders);
517
  } // end send_confirm()
525
  return $this->excluded_cats;
526
  } else {
527
  global $wpdb;
528
+ $this->excluded_cats = get_option('s2_exclude');
529
  return $this->excluded_cats;
530
  }
531
  } // end get_excluded_cats()
547
  }
548
  } // end get_all_categories()
549
 
550
+
551
  /* ===== Subscriber functions ===== */
552
  /**
553
  Given a public subscriber ID, returns the email address
555
  function get_email ($id = 0) {
556
  global $wpdb;
557
 
558
+ if (! $id) {
559
  return false;
560
  }
561
  return $wpdb->get_var("SELECT email FROM $this->public WHERE id=$id");
567
  function get_id ($email = '') {
568
  global $wpdb;
569
 
570
+ if (! $email) {
571
  return false;
572
  }
573
  return $wpdb->get_var("SELECT id FROM $this->public WHERE email='$email'");
575
 
576
  /**
577
  Activate an email address
578
+
579
  If the address is not already present, it will be added
580
  */
581
  function activate ($email = '') {
613
  }
614
  }
615
 
616
+ if (! is_email($email)) { return false; }
617
 
618
  if (false !== $this->is_public($email)) {
619
  $wpdb->get_results("UPDATE $this->public SET date=NOW() WHERE email='$email'");
636
  }
637
  }
638
 
639
+ if (! is_email($email)) { return false; }
640
  $wpdb->get_results("DELETE FROM $this->public WHERE email='$email'");
641
  } // end delete()
642
 
669
  $this->myname = $admin->display_name;
670
 
671
  $recipients = explode(",", $emails);
672
+ if (! is_array($recipients)) { $recipients = array(); }
673
  foreach ($recipients as $recipient) {
674
  $this->email = $recipient;
675
  $this->send_confirm('add', TRUE);
676
  }
677
  } //end remind()
678
 
 
 
 
 
 
 
 
 
 
 
 
679
  /**
680
  Check email is not from a barred domain
681
  */
682
  function is_barred($email='') {
683
+ $barred_option = get_option('s2_barred');
684
  list($user, $domain) = split('@', $email);
685
  $bar_check = stristr($barred_option, $domain);
686
 
706
  $id = intval(substr($code, 1));
707
  if ($id) {
708
  $this->email = $this->get_email($id);
709
+ if (! $this->email) {
710
  return $this->no_such_email;
711
  }
712
  } else {
797
  $subscribers = array();
798
 
799
  parse_str($args, $r);
800
+ if (! isset($r['cats']))
801
  $r['cats'] = '';
802
+ if (! isset($r['format']))
803
  $r['format'] = 'all';
804
+ if (! isset($r['amount']))
805
  $r['amount'] = 'all';
806
 
807
  $JOIN = ''; $AND = '';
851
  if ('' == $email) { return false; }
852
 
853
  global $wpdb;
854
+ if (! empty($this->signup_dates)) {
855
  return $this->signup_dates[$email];
856
  } else {
857
  $results = $wpdb->get_results("SELECT email, date FROM $this->public", ARRAY_N);
871
 
872
  if (0 == $user_id) { return $user_id; }
873
  $user = get_userdata($user_id);
 
 
 
 
874
 
875
  // has this user previously signed up for email notification?
876
  if (false !== $this->is_public($user->user_email)) {
877
  // delete this user from the public table, and subscribe them to all the categories
878
  $this->delete($user->user_email);
879
+ update_usermeta($user_id, 's2_subscribed', $this->get_all_categories());
880
+ foreach(explode(',', $this->get_all_categories()) as $cat) {
881
+ update_usermeta($user_id, 's2_cat' . $cat, "$cat");
882
  }
883
  update_usermeta($user_id, 's2_format', 'text');
884
  update_usermeta($user_id, 's2_excerpt', 'excerpt');
885
  } else {
886
  // add the usermeta for new registrations, but don't subscribe them
887
  $check = get_usermeta($user_id, 's2_subscribed');
 
888
  if (empty($check)) {
889
+ // ensure existing subscriptions are not overwritten on upgrade
890
+ update_usermeta($user_id, 's2_subscribed', '');
891
+ update_usermeta($user_id, 's2_format', 'text');
892
+ update_usermeta($user_id, 's2_excerpt', 'excerpt');
 
 
 
 
 
 
 
 
 
 
 
 
 
893
  }
894
  }
895
  return $user_id;
899
  Subscribe all registered users to category selected on Admin Manage Page
900
  */
901
  function subscribe_registered_users ($emails = '', $cats = '') {
902
+ if (('' == $emails) || ('' == $cats)) { return false; }
903
  global $wpdb;
904
 
905
  $useremails = explode(",", $emails);
908
  $sql = "SELECT ID FROM $wpdb->users WHERE user_email IN ('$useremails')";
909
  $user_IDs = $wpdb->get_col($sql);
910
  $cats = $_POST['category'];
911
+ if (! is_array($cats)) {
912
  $cats = array($_POST['category']);
913
  }
914
 
915
  foreach ($user_IDs as $user_ID) {
916
  $old_cats = explode(',', get_usermeta($user_ID, 's2_subscribed'));
917
+ if (! is_array($old_cats)) {
918
  $old_cats = array($old_cats);
919
  }
920
  $new = array_diff($cats, $old_cats);
921
+ if (! empty($new)) {
922
  // add subscription to these cat IDs
923
  foreach ($new as $id) {
924
  update_usermeta($user_ID, 's2_cat' . $id, "$id");
933
  Unsubscribe all registered users to category selected on Admin Manage Page
934
  */
935
  function unsubscribe_registered_users ($emails = '', $cats = '') {
936
+ if (('' == $emails) || ('' == $cats)) { return false; }
937
  global $wpdb;
938
 
939
  $useremails = explode(",", $emails);
942
  $sql = "SELECT ID FROM $wpdb->users WHERE user_email IN ('$useremails')";
943
  $user_IDs = $wpdb->get_col($sql);
944
  $cats = $_POST['category'];
945
+ if (! is_array($cats)) {
946
  $cats = array($_POST['category']);
947
  }
948
 
949
  foreach ($user_IDs as $user_ID) {
950
  $old_cats = explode(',', get_usermeta($user_ID, 's2_subscribed'));
951
+ if (! is_array($old_cats)) {
952
  $old_cats = array($old_cats);
953
  }
954
  $remain = array_diff($old_cats, $cats);
955
+ if (! empty($remain)) {
956
  // remove subscription to these cat IDs and update s2_subscribed
957
  foreach ($cats as $id) {
958
  delete_usermeta($user_ID, 's2_cat' . $id, "$id");
967
  }
968
  }
969
  } // end unsubscribe_registered_users
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
970
 
971
  /* ===== Menus ===== */
972
  /**
973
  Our management page
974
  */
975
  function manage_menu() {
976
+ global $wpdb;
 
 
 
 
 
 
977
 
978
  $what = '';
979
+ $reminderform = '';
980
 
981
  // was anything POSTed ?
982
  if (isset($_POST['s2_admin'])) {
 
983
  if ('subscribe' == $_POST['s2_admin']) {
984
  foreach (preg_split ("/[\s,]+/", $_POST['addresses']) as $email) {
985
  if (is_email($email)) {
995
  $this->toggle($_POST['email']);
996
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>" . $_POST['email'] . ' ' . __('status changed!', 'subscribe2') . "</p></strong></div>";
997
  } elseif ('remind' == $_POST['s2_admin']) {
998
+ $this->remind($_POST['emails']);
999
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>" . __('Reminder Email(s) Sent!','subscribe2') . "</p></strong></div>";
 
 
 
1000
  } elseif ( ('register' == $_POST['s2_admin']) && ('Subscribe' == $_POST['submit']) ) {
1001
  $this->subscribe_registered_users($_POST['emails'], $_POST['category']);
1002
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>" . __('Registered Users Subscribed!','subscribe2') . "</p></strong></div>";
1011
  $what = 'all';
1012
  $confirmed = $this->get_public();
1013
  $unconfirmed = $this->get_public(0);
1014
+ $registered = $this->get_registered();
1015
  $subscribers = array_merge((array)$confirmed, (array)$unconfirmed, (array)$registered);
1016
  } elseif ('public' == $_POST['what']) {
1017
  $what = 'public';
1020
  $subscribers = array_merge((array)$confirmed, (array)$unconfirmed);
1021
  } elseif ('confirmed' == $_POST['what']) {
1022
  $what = 'confirmed';
1023
+ $confirmed = $this->get_public();
1024
  $subscribers = $confirmed;
1025
  } elseif ('unconfirmed' == $_POST['what']) {
1026
  $what = 'unconfirmed';
1027
+ $unconfirmed = $this->get_public(0);
1028
  $subscribers = $unconfirmed;
1029
  if (!empty($unconfirmed)) {
1030
+ $emails = implode(",", $unconfirmed);
1031
+ $reminderform = "<span class=\"submit\"><form method=\"post\" action=\"\"><input type=\"hidden\" name=\"emails\" value=\"$emails\" /><input type=\"hidden\" name=\"s2_admin\" value=\"remind\" /><input type=\"submit\" name=\"submit\" value=\"" . __('Send Reminder Email','subscribe2') . "\" /></form></span>";
1032
  }
1033
  } elseif (is_numeric($_POST['what'])) {
1034
  $what = intval($_POST['what']);
1035
  $subscribers = $this->get_registered("cats=$what");
1036
  } elseif ('registered' == $_POST['what']) {
1037
  $what = 'registered';
1038
+ $subscribers = $this->get_registered();
1039
+ if(!empty($subscribers)) {
1040
+ $emails = implode(",", $subscribers);
1041
+ }
1042
  }
1043
  } elseif ('' == $what) {
1044
+ $subscribers = $this->get_registered();
1045
  $what = 'registered';
 
1046
  $registermessage = '';
1047
  if (empty($subscribers)) {
1048
  $confirmed = $this->get_public();
1049
  $subscribers = $confirmed;
1050
  $what = 'confirmed';
1051
+ if (empty ($subscribers)) {
1052
  $unconfirmed = $this->get_public(0);
1053
  $subscribers = $unconfirmed;
1054
  $what = 'unconfirmed';
1058
  }
1059
  }
1060
  }
1061
+ if (! empty($subscribers)) {
1062
  natcasesort($subscribers);
1063
  }
1064
  // safety check for our arrays
1070
  echo "<div class=\"wrap\">";
1071
  echo "<h2>" . __('Subscribe Addresses', 'subscribe2') . "</h2>\r\n";
1072
  echo "<form method=\"post\" action=\"\">\r\n";
 
 
 
1073
  echo "<span style=\"align:left\">" . __('Enter addresses, one per line or comma-seperated', 'subscribe2') . "</span><br />\r\n";
1074
  echo "<textarea rows=\"2\" cols=\"80\" name=\"addresses\"></textarea>";
1075
  echo "<span class=\"submit\"><input type=\"submit\" name=\"submit\" value=\"" . __('Subscribe', 'subscribe2') . "\"/>";
1082
  $this->display_subscriber_dropdown($what, __('Filter', 'subscribe2'));
1083
  // show the selected subscribers
1084
  $alternate = 'alternate';
1085
+ if (! empty($subscribers)) {
1086
  echo "<p align=\"center\"><b>" . __('Registered on the left, confirmed in the middle, unconfirmed on the right', 'subscribe2') . "</b></p>";
 
 
 
 
 
 
 
 
 
 
 
1087
  }
1088
  echo "<table cellpadding=\"2\" cellspacing=\"2\">";
1089
+ if (! empty($subscribers)) {
1090
  foreach ($subscribers as $subscriber) {
1091
  echo "<tr class=\"$alternate\">";
1092
  echo "<td width=\"75%\"";
1098
  echo "align=\"left\" colspan=\"3\">";
1099
  }
1100
  echo "<a href=\"mailto:$subscriber\">$subscriber</a>\r\n";
1101
+ if ( in_array($subscriber, $unconfirmed) || in_array($subscriber, $confirmed) ) {
1102
+ echo "(" . $this->signup_date($subscriber) . ")</td>";
1103
+ echo "<td width=\"5%\" align=\"center\"><form method=\"post\" action=\"\"><input type=\"hidden\" name=\"email\" value=\"$subscriber\" /><input type=\"hidden\" name=\"s2_admin\" value=\"toggle\" /><input type=\"hidden\" name=\"what\" value=\"$what\" /><input type=\"submit\" name=\"submit\" value=\"";
 
 
 
 
 
 
 
 
1104
  (in_array($subscriber, $unconfirmed)) ? $foo = '&lt;-' : $foo= '-&gt;';
1105
+ echo "$foo\" /></form></td>";
1106
+ echo "<td width=\"2%\" align=\"center\"><form method=\"post\" action=\"\"><span class=\"delete\"><input type=\"hidden\" name=\"email\" value=\"$subscriber\" /><input type=\"hidden\" name=\"s2_admin\" value=\"delete\" /><input type=\"hidden\" name=\"what\" value=\"$what\" /><input type=\"submit\" name=\"submit\" value=\"X\" /></span></form>";
 
 
 
 
 
 
 
 
 
 
1107
  }
1108
  echo "</td></tr>\r\n";
1109
  ('alternate' == $alternate) ? $alternate = '' : $alternate = 'alternate';
1112
  echo "<tr><td align=\"center\"><b>" . __('NONE', 'subscribe2') . "</b></td></tr>\r\n";
1113
  }
1114
  echo "</table>";
1115
+ if (!empty($reminderform)) {echo $reminderform;}
 
 
 
 
 
 
 
 
 
1116
  echo "</div>\r\n";
1117
 
1118
  //show bulk managment form
1119
  echo "<div class=\"wrap\">";
1120
  echo "<h2 >" . __('Categories', 'subscribe2') . "</h2>\r\n";
1121
+ echo "Existing Registered Users can be automatically (un)subscribed to categories using this section.<br />\r\n";
1122
+ echo "<strong>Changes cannot be undone</strong> so carefully consider <strong><em style=\"color: red\">User Privacy</em></strong> before making changes.";
1123
+ echo "<span class=\"submit\"><form method=\"post\" action=\"\"><input type=\"hidden\" name=\"emails\" value=\"$emails\" /><input type=\"hidden\" name=\"s2_admin\" value=\"register\" />";
1124
+ $this->display_category_form(explode(',', $this->get_excluded_cats()));
 
 
 
 
1125
  echo "<input type=\"submit\" id=\"deletepost\" name=\"submit\" value=\"" . __('Subscribe','subscribe2') . "\" />";
1126
  echo "<input type=\"submit\" id=\"deletepost\" name=\"submit\" value=\"" . __('Unsubscribe','subscribe2') . "\" /></form></span>";
1127
 
1128
  echo "</div>\r\n";
1129
+
1130
  echo "<div style=\"clear: both;\"><p>&nbsp;</p></div>";
1131
 
1132
  include(ABSPATH . '/wp-admin/admin-footer.php');
1138
  Our options page
1139
  */
1140
  function options_menu() {
 
 
1141
  // was anything POSTed?
1142
  if (isset($_POST['s2_admin'])) {
 
1143
  if ('RESET' == $_POST['s2_admin']) {
1144
  $this->reset();
1145
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>$this->options_reset</p></strong></div>";
1146
  } elseif ('options' == $_POST['s2_admin']) {
1147
  // excluded categories
1148
+ if (! empty($_POST['category'])) {
1149
  $exclude_cats = implode(',', $_POST['category']);
1150
  } else {
1151
  $exclude_cats = '';
1152
  }
1153
+ update_option('s2_exclude', $exclude_cats);
1154
  // allow override?
1155
+ (isset($_POST['override'])) ? $override = '1' : $override = '0';
1156
+ update_option('s2_reg_override', $override);
1157
 
1158
  // show button?
1159
+ (isset($_POST['showbutton'])) ? $showbutton = '1' : $showbutton = '0';
1160
+ update_option('s2_show_button', $showbutton);
1161
 
1162
  // send as author or admin?
1163
  $sender = 'author';
1164
+ if ('admin' == $_POST['s2_sender']) {
1165
  $sender = 'admin';
1166
  }
1167
+ update_option('s2_sender', $sender);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1168
 
1169
  // email templates
1170
+ $mailtext = $_POST['s2_mailtext'];
1171
+ update_option('s2_mailtext', $mailtext);
1172
+ $confirm_email = $_POST['s2_confirm_email'];
1173
+ update_option('s2_confirm_email', $confirm_email);
1174
+ $remind_email = $_POST['s2_remind_email'];
1175
+ update_option('s2_remind_email', $remind_email);
1176
+
 
 
 
 
 
 
1177
  //barred domains
1178
+ $barred_option = $_POST['s2_barred'];
1179
+ update_option('s2_barred', $barred_option);
1180
  echo "<div id=\"message\" class=\"updated fade\"><strong><p>$this->options_saved</p></strong></div>";
 
1181
  }
1182
  }
1183
  // show our form
1184
+ $this->sender = get_option('s2_sender');
1185
+ $this->mailtext = get_option('s2_mailtext');
1186
+ $this->confirm_email = get_option('s2_confirm_email');
1187
+ $this->remind_email = get_option('s2_remind_email');
1188
+ $this->override = get_option('s2_reg_override');
1189
+ $this->show_button = get_option('s2_show_button');
1190
+ $this->barred_option = get_option('s2_barred');
1191
+
1192
  echo "<div class=\"wrap\">";
1193
+ echo "<form method=\"post\" action=\"\">";
1194
+ echo "<input type=\"hidden\" name=\"s2_admin\" value=\"options\" />";
1195
+ echo "<h2>" . __('Delivery Options', 'subscribe2') . ":</h2>";
 
 
 
1196
  echo __('Send Email From', 'subscribe2') . ': ';
1197
+ echo "<input type=\"radio\" name=\"s2_sender\" value=\"author\" ";
1198
+ if ('author' == $this->sender) {
1199
  echo "checked=\"checked\" ";
1200
  }
1201
  echo " /> " . __('Author of the post', 'subscribe2') . " &nbsp;&nbsp;";
1202
+ echo "<input type=\"radio\" name=\"s2_sender\" value=\"admin\" ";
1203
+ if ('admin' == $this->sender) {
1204
  echo "checked=\"checked\" ";
1205
  }
1206
+ echo " /> " . __('Blog Admin', 'subscribe2') . "<br />\r\n";
 
 
 
 
 
1207
  echo "<h2>" . __('Email Templates', 'subscribe2') . "</h2>\r\n";
1208
+ echo "<table width=\"100%\" cellspacing=\"2\" cellpadding=\"1\" class=\"editform\">";
1209
  echo "<tr><td>";
1210
  echo __('New Post email (must not be empty)', 'subscribe2') . ":";
1211
  echo "<br />\r\n";
1212
+ echo "<textarea rows=\"9\" cols=\"60\" name=\"s2_mailtext\">" . stripslashes($this->mailtext) . "</textarea><p>\r\n";
1213
  echo "</td><td valign=\"top\" rowspan=\"3\">";
1214
  echo "<h3>" . __('Message substitions', 'subscribe2') . "</h3>\r\n";
1215
  echo "<dl>";
1220
  echo "<dt><b>PERMALINK</b></dt><dd>" . __("the post's permalink", 'subscribe2') . "</dd>\r\n";
1221
  echo "<dt><b>MYNAME</b></dt><dd>" . __("the admin or post author's name", 'subscribe2') . "</dd>\r\n";
1222
  echo "<dt><b>EMAIL</b></dt><dd>" . __("the admin or post author's email", 'subscribe2') . "</dd>\r\n";
1223
+ echo "<dt><b>LINK</b></dt><dd>" . __('the generated link to confirm a request<br />(<i>only used in the confirmation email template</i>)', 'subscribe2') . "</dd>\r\n";
 
 
1224
  echo "</dl></td></tr><tr><td>";
1225
  echo __('Subscribe / Unsubscribe confirmation email', 'subscribe2') . ":<br />\r\n";
1226
+ echo "<textarea rows=\"9\" cols=\"60\" name=\"s2_confirm_email\">" . stripslashes($this->confirm_email) . "</textarea><p>";
1227
+ echo "</td></tr><tr><td>";
1228
  echo __('Reminder email to Unconfirmed Subscribers', 'subscribe2') . ":<br />\r\n";
1229
+ echo "<textarea rows=\"9\" cols=\"60\" name=\"s2_remind_email\">" . stripslashes($this->remind_email) . "</textarea><p>";
1230
+ echo "</td></tr></table>\r\n";
1231
 
1232
  // excluded categories
1233
  echo "<h2>" . __('Excluded Categories', 'subscribe2') . "</h2>\r\n";
1234
  $this->display_category_form(explode(',', $this->get_excluded_cats()));
1235
+
1236
+ echo "<p align=\"center\"><input type=\"checkbox\" name=\"override\" ";
1237
+ if ('1' == $this->override) {
1238
+ echo "checked=\"checked\"";
1239
  }
1240
+ echo "/> " . __('Allow registered users to subscribe to excluded categories?', 'subscribe2') . "</p>";
1241
  echo "<h2>" . __('Writing Options', 'subscribe2') . "</h2>\r\n";
1242
+ echo "<p align=\"center\"><input type=\"checkbox\" name=\"showbutton\" ";
1243
+ if ('1' == $this->show_button) {
1244
+ echo "checked=\"checked\"";
1245
  }
1246
+ echo "/> " . __('Show the Subscribe2 button on the Write toolbar?', 'subscribe2') . "</p>";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1247
 
1248
  //barred domains
1249
  echo "<h2>" . __('Barred Domains', 'subscribe2') . "</h2>\r\n";
1250
  echo __('Enter domains to bar from public subscriptions: <br /> (Use a new line for each entry and omit the "@" symbol, for example email.com)', 'subscribe2');
1251
+ echo "<textarea style=\"width: 98%;\" rows=\"4\" cols=\"60\" name=\"s2_barred\">" . $this->barred_option . "</textarea>";
1252
 
1253
  // submit
1254
  echo "<p align=\"center\"><span class=\"submit\"><input type=\"submit\" id=\"save\" name=\"submit\" value=\"" . __('Submit', 'subscribe2') . "\" /></span></p>";
1255
  echo "</form>\r\n";
 
1256
 
1257
+ echo "</div><div class=\"wrap\">";
1258
  // reset
1259
  echo "<h2>" . __('Reset Default', 'subscribe2') . "</h2>\r\n";
1260
  echo "<p>" . __('Use this to reset all options to their defaults. This <strong><em>will not</em></strong> modify your list of subscribers.', 'subscribe2') . "</p>\r\n";
1261
  echo "<form method=\"post\" action=\"\">";
 
 
 
1262
  echo "<p align=\"center\"><span class=\"submit\">";
1263
  echo "<input type=\"hidden\" name=\"s2_admin\" value=\"RESET\" />";
1264
  echo "<input type=\"submit\" id=\"deletepost\" name=\"submit\" value=\"" . __('RESET', 'subscribe2') .
1274
  Our profile menu
1275
  */
1276
  function user_menu() {
1277
+ global $user_ID;
1278
 
1279
  get_currentuserinfo();
1280
 
1281
  // was anything POSTed?
1282
  if ( (isset($_POST['s2_admin'])) && ('user' == $_POST['s2_admin']) ) {
 
 
1283
  $format = 'text';
1284
  $post = 'post';
1285
  if ('html' == $_POST['s2_format']) {
1290
  }
1291
  update_usermeta($user_ID, 's2_excerpt', $post);
1292
  update_usermeta($user_ID, 's2_format', $format);
 
1293
 
1294
  $cats = $_POST['category'];
1295
  if (empty($cats)) {
1299
  delete_usermeta($user_ID, "s2_cat" . $cat);
1300
  }
1301
  }
1302
+ update_usermeta($user_ID, 's2_subscribed', '');
1303
  } else {
1304
+ if (! is_array($cats)) {
1305
  $cats = array($_POST['category']);
1306
  }
1307
  $old_cats = explode(',', get_usermeta($user_ID, 's2_subscribed'));
1308
  $remove = array_diff($old_cats, $cats);
1309
  $new = array_diff($cats, $old_cats);
1310
+ if (! empty($remove)) {
1311
  // remove subscription to these cat IDs
1312
  foreach ($remove as $id) {
1313
  delete_usermeta($user_ID, "s2_cat" .$id);
1314
  }
1315
  }
1316
+ if (! empty($new)) {
1317
  // add subscription to these cat IDs
1318
  foreach ($new as $id) {
1319
  update_usermeta($user_ID, 's2_cat' . $id, "$id");
1327
  echo "<div class=\"wrap\">";
1328
  echo "<h2>" . __('Notification Settings', 'subscribe2') . "</h2>\r\n";
1329
  echo "<form method=\"post\" action=\"\">";
 
 
 
1330
  echo "<input type=\"hidden\" name=\"s2_admin\" value=\"user\" />";
1331
+ if ( defined('S2DIGEST') && FALSE == S2DIGEST ) {
1332
  echo __('Receive email as', 'subscribe2') . ": &nbsp;&nbsp;";
1333
  echo "<input type=\"radio\" name=\"s2_format\" value=\"html\"";
1334
  if ('html' == get_usermeta($user_ID, 's2_format')) {
1350
  }
1351
  echo " /> $value ";
1352
  }
1353
+ _e('<p>Note: HTML format will always deliver the full post.</p>', 'subscribe2');
 
 
 
 
 
 
 
 
 
 
1354
 
1355
  // subscribed categories
1356
  echo "<h2>" . __('Subscribed Categories', 'subscribe2') . "</h2>\r\n";
1357
+ $this->display_category_form(explode(',', get_usermeta($user_ID, 's2_subscribed')), get_option('s2_reg_override'));
1358
  } else {
1359
  // we're doing daily digests, so just show
1360
  // subscribe / unnsubscribe
1361
  echo __('Receive daily summary of new posts?', 'subscribe2') . ': &nbsp;&nbsp;';
1362
+ echo "<input type=\"radio\" name=\"category\" value=\"1\" ";
1363
+ if (get_usermeta($user_ID, 's2_subscribed')) {
1364
+ echo "checked=\"yes\" ";
1365
  }
1366
  echo "/> Yes <input type=\"radio\" name=\"category\" value=\"\" ";
1367
  if (! get_usermeta($user_ID, 's2_subscribed')) {
1374
  echo "<p align=\"right\"><span class=\"submit\"><input type=\"submit\" name=\"submit\" value=\"" . __("Update Preferences &raquo;", 'subscribe2') . "\" /></span></p>";
1375
  echo "</form></div>\r\n";
1376
 
1377
+
1378
  include(ABSPATH . '/wp-admin/admin-footer.php');
1379
  // just to be sure
1380
  die;
1384
  Display the Write sub-menu
1385
  */
1386
  function write_menu() {
 
 
1387
  // was anything POSTed?
1388
  if (isset($_POST['s2_admin']) && ('mail' == $_POST['s2_admin']) ) {
 
1389
  if ('confirmed' == $_POST['what']) {
1390
  $recipients = $this->get_public();
1391
  } elseif ('unconfirmed' == $_POST['what']) {
1405
  $this->myname = $user_identity;
1406
  $this->myemail = $user_email;
1407
  $subject = strip_tags($_POST['subject']);
1408
+ $message = $_POST['message'];
1409
  $this->mail($recipients, $subject, $message, 'text');
1410
  $message = $this->mail_sent;
1411
  }
1416
  // show our form
1417
  echo "<div class=\"wrap\"><h2>" . __('Send email to all subscribers', 'subscribe2') . "</h2>\r\n";
1418
  echo "<form method=\"post\" action=\"\">\r\n";
 
 
 
1419
  echo __('Subject', 'subscribe2') . ": <input type=\"text\" size=\"69\" name=\"subject\" value=\"" . __('A message from ', 'subscribe2') . get_settings('blogname') . "\" /> <br />";
1420
  echo "<textarea rows=\"12\" cols=\"75\" name=\"message\"></textarea>";
1421
  echo "<br />\r\n";
1434
  /* ===== helper functions: forms and stuff ===== */
1435
  /**
1436
  Display a table of categories with checkboxes
1437
+
1438
  Optionally pre-select those categories specified
1439
  */
1440
  function display_category_form($selected = array(), $override = 1) {
1441
  global $wpdb;
1442
 
1443
+ $all_cats = $this->get_all_categories('array');
 
1444
  if (0 == $override) {
1445
  // registered users are not allowed to subscribe to
1446
  // excluded categories
1454
  $half = (count($all_cats) / 2);
1455
  $i = 0;
1456
  $j = 0;
1457
+ echo "<table width=\"100%\" cellspacing=\"2\" cellpadding=\"5\" class=\"editform\">";
1458
+ echo "<tr valign=\"top\"><td width=\"50%\" align=\"left\">";
1459
+ foreach ($all_cats as $cat_ID => $cat_name) {
1460
  if ( ($i >= $half) && (0 == $j) ){
1461
+ echo "</td><td width=\"50%\" align=\"left\">";
1462
  $j++;
1463
  }
1464
  if (0 == $j) {
1465
+ echo "<input type=\"checkbox\" name=\"category[]\" value=\"" . $cat_ID . "\"";
1466
+ if (in_array($cat_ID, $selected)) {
1467
  echo " checked=\"checked\" ";
1468
  }
1469
+ echo " /> " . $cat_name . "<br />\r\n";
1470
  } else {
1471
 
1472
+ echo "<input type=\"checkbox\" name=\"category[]\" value=\"" . $cat_ID . "\"";
1473
+ if (in_array($cat_ID, $selected)) {
1474
  echo " checked=\"checked\" ";
1475
  }
1476
+ echo " /> " . $cat_name . "<br />\r\n";
1477
  }
1478
  $i++;
1479
  }
1480
+ echo "</td></tr></table>\r\n";
 
 
 
 
1481
  } // end display_category_form()
1482
 
1483
  /**
1484
  Display a drop-down form to select subscribers
1485
+
1486
  $selected is the option to select
1487
  $submit is the text to use on the Submit button
1488
  */
1495
  'unconfirmed' => ' &nbsp;&nbsp;' . __('Unconfirmed', 'subscribe2'),
1496
  'registered' => __('Registered Subscribers', 'subscribe2'));
1497
 
 
 
1498
  // count the number of subscribers
1499
  $count['confirmed'] = $wpdb->get_var("SELECT COUNT(id) FROM $this->public WHERE active='1'");
1500
  $count['unconfirmed'] = $wpdb->get_var("SELECT COUNT(id) FROM $this->public WHERE active='0'");
1507
  }
1508
  $count['registered'] = $wpdb->get_var("SELECT COUNT(meta_key) FROM $wpdb->usermeta WHERE meta_key='s2_subscribed'");
1509
  $count['all'] = ($count['confirmed'] + $count['unconfirmed'] + $count['registered']);
1510
+ foreach ($this->get_all_categories('array') as $cat_ID => $cat_name) {
1511
+ $count[$cat_name] = $wpdb->get_var("SELECT COUNT(meta_value) FROM $wpdb->usermeta WHERE meta_key='s2_cat$cat_ID'");
1512
  }
1513
 
1514
  // do have actually have some subscribers?
1525
  if (in_array($whom, $exclude)) { continue; }
1526
  if (0 == $count[$whom]) { continue; }
1527
 
1528
+ echo "<option value=\"$whom\"";
1529
  if ($whom == $selected) { echo " selected=\"selected\" "; }
1530
  echo ">$display (" . ($count[$whom]) . ")</option>\r\n";
1531
  }
1532
 
1533
  if ($count['registered'] > 0) {
1534
+ foreach ($this->get_all_categories('array') as $cat_ID => $cat_name) {
1535
+ if (in_array($cat_ID, $exclude)) { continue; }
1536
+ if (0 == $count[$cat_name]) { continue; }
1537
+ echo "<option value=\"$cat_ID\"";
1538
+ if ($cat_ID == $selected) { echo " selected=\"selected\" "; }
1539
+ echo "> &nbsp;&nbsp;$cat_name (" . $count[$cat_name] . ") </option>\r\n";
1540
  }
1541
  }
1542
  echo "</select>";
1545
  }
1546
  } // end display_subscriber_dropdown()
1547
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1548
  /* ===== template and filter functions ===== */
1549
  /**
1550
  Display our form; also handles (un)subscribe requests
1551
  */
1552
  function filter($content = '') {
1553
+ if ('' == $content) { return $content; }
1554
  $this->s2form = $this->form;
1555
 
1556
  global $user_ID;
1557
  get_currentuserinfo();
1558
  if ($user_ID) {
1559
+ $this->s2form = $this->use_profile;
 
 
 
 
1560
  }
1561
  if (isset($_POST['s2_action'])) {
1562
  global $wpdb, $user_email;
1563
+ if (! is_email($_POST['email'])) {
1564
  $this->s2form = $this->form . $this->not_an_email;
1565
  } elseif ($this->is_barred($_POST['email'])) {
1566
  $this->s2form = $this->form . $this->barred_domain;
1604
  }
1605
  }
1606
  }
1607
+ return preg_replace('|<p>(\n)*<!--subscribe2-->(\n)*</p>|', $this->s2form, $content);
1608
  } // end filter()
1609
 
1610
  /**
1611
  Overrides the default query when handling a (un)subscription confirmation
1612
+
1613
+ this is basically a trick: if the s2 variable is in the query string, just grab the first static page
1614
  and override it's contents later with title_filter() and template_filter()
1615
  */
1616
  function query_filter() {
1619
 
1620
  global $wpdb;
1621
 
1622
+ if ( defined('S2PAGE') && 0 !== S2PAGE ) {
1623
  return "page_id=" . S2PAGE;
1624
  } else {
1625
  $id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status='static' LIMIT 1");
1650
  } // end template_filter()
1651
 
1652
  /* ===== wp-cron functions ===== */
1653
+ /**
1654
+ Send notifications for any posts that are now visible
1655
+ */
1656
+ function subscribe2_hourly() {
1657
+ $future_posts = get_option('s2_future_posts');
1658
+
1659
+ // if we have no future posts, bail out
1660
+ if (! $future_posts) { return; }
1661
+
1662
+ // this will hold the posts that aren't yet visible
1663
+ $not_yet = array();
1664
+
1665
+ foreach ($future_posts as $post) {
1666
+ if ( current_time('mysql') > $post['date'] ) {
1667
+ // this post is now visible, so let's
1668
+ // send a notification
1669
+ $this->publish($post['id'], 1);
1670
+ } else {
1671
+ array_push($not_yet, $post);
1672
+ }
1673
+ }
1674
+ // are the number of elements in $not_yet
1675
+ // the same as in $future posts?
1676
+ if ( count($not_yet) != count($future_posts) ) {
1677
+ // if not, then some posts have been removed
1678
+ // from $future_posts, and the remainder need
1679
+ // to be recorded back to the database
1680
+ update_option('s2_future_posts', $not_yet);
1681
+ }
1682
+ } // end subscribe2_hourly
1683
+
1684
  /**
1685
  Send a daily digest of today's new posts
1686
  */
1687
+ function subscribe2_daily() {
1688
  global $wpdb;
1689
 
1690
+ // collect yesterday's posts
1691
+ $yesterday = date('Y-m-d', (get_option('wp_cron_daily_lastrun')-60));
1692
+ $posts = $wpdb->get_results("SELECT ID, post_title, post_excerpt, post_content FROM $wpdb->posts WHERE post_date > '$yesterday 00:00:00' AND post_date < '$yesterday 23:59:59' AND post_status='publish'");
 
1693
 
 
 
 
 
1694
  // do we have any posts?
1695
+ if (! $posts) { return; }
1696
 
1697
  // if we have posts, let's prepare the digest
1698
  foreach ($posts as $post) {
1711
  if ($check) {
1712
  continue;
1713
  }
1714
+ $message .= "$post->post_title\r\n";
1715
  $message .= get_permalink($post->ID) . "\r\n";
1716
  $excerpt = $post->post_excerpt;
1717
  if ('' == $excerpt) {
1730
  }
1731
  }
1732
  }
1733
+ $message .= "$excerpt\r\n\r\n";
1734
  }
1735
 
 
 
1736
  // do we send as admin, or post author?
1737
+ if ('author' == get_option('s2_sender')) {
1738
  // get author details
1739
+ $user = get_userdata($post->post_author);
1740
  } else {
1741
  // get admin detailts
1742
  $user = get_userdata(1);
1743
  }
1744
+ $subject = '[' . get_settings('blogname') . '] ' . __('Daily Digest', 'subscribe2') . ' ' . $yesterday;
 
 
 
 
 
 
1745
  $public = $this->get_public();
1746
  $registered = $this->get_registered();
1747
  $recipients = array_merge((array)$public, (array)$registered);
1748
+ $mailtext = $this->substitute(stripslashes(get_option('s2_mailtext')));
1749
  $body = str_replace('POST', $message, $mailtext);
1750
  $this->mail($recipients, $subject, $body);
1751
+ } // end subscribe2_daily
1752
+
1753
+ /**
1754
+ If the to-be-deleted post was future-dated, remove it from the list of future-dated posts
1755
+ */
1756
+ function delete_future($ID = 0) {
1757
+ if (0 == $ID) { return $ID; }
1758
+
1759
+ $future = get_settings('s2_future_posts');
1760
+ // if we have no future-dated posts scheduled, bail out
1761
+ if ( ! $future) {
1762
+ return $ID;
1763
+ }
1764
+ foreach ($future as $post) {
1765
+ // is the deleted post in the list of future posts?
1766
+ if ($ID == $post['id']) {
1767
+ // skip it
1768
+ continue;
1769
+ } else {
1770
+ // add this to the new list of future posts
1771
+ $new_future[] = $post;
1772
+ }
1773
+ }
1774
+ if ($new_future != $future) {
1775
+ update_option('s2_future_posts', $new_future);
1776
+ }
1777
+ } // end delete_future()
1778
 
1779
  /* ===== Our constructor ===== */
1780
  /**
1785
 
1786
  load_plugin_textdomain('subscribe2', 'wp-content/plugins/subscribe2');
1787
 
 
 
 
 
1788
  // do we need to install anything?
1789
  $this->public = $table_prefix . "subscribe2";
1790
+ if(mysql_query("SELECT COUNT(*) FROM ".$this->public)==FALSE) { $this->install(); }
1791
  //do we need to upgrade anything?
1792
+ $this->version = get_option('s2_version');
1793
+ if ($this->version !== S2VERSION) { $this->upgrade(); }
 
1794
 
1795
  if (isset($_GET['s2'])) {
1796
  // someone is confirming a request
1799
  add_filter('the_content', array(&$this, 'confirm'));
1800
  }
1801
 
 
1802
  add_action('admin_menu', array(&$this, 'admin_menu'));
1803
+ add_action('publish_post', array(&$this, 'publish'));
1804
+ add_action('edit_post', array(&$this, 'edit'));
1805
+ add_action('private_to_published', array(&$this, 'private2publish'));
1806
  add_action('user_register', array(&$this, 'register'));
 
1807
  add_filter('the_content', array(&$this, 'filter'));
1808
+ add_action('wp_cron_hourly', array(&$this, 'subscribe2_hourly'));
1809
+ if ( defined('S2DIGEST') && TRUE == S2DIGEST ) {
1810
+ add_action('wp_cron_daily', array(&$this, 'subscribe2_daily'));
1811
+ }
1812
+ add_action('delete_post', array(&$this, 'delete_future'));
1813
+ // add our button
1814
+ if ('1' == get_option('s2_show_button')) {
1815
+ add_action('init', array(&$this, 's2_button_init'));
1816
+ add_action('marker_css', array(&$this, 'subscribe2_css'));
1817
  }
 
1818
  // load our strings
1819
  $this->load_strings();
1820
  } // end subscribe2()
1856
  var $confirm_subject = '';
1857
  var $options_saved = '';
1858
  var $options_reset = '';
1859
+
1860
  } // end class subscribe2
1861
+ $mysubscribe2 = new subscribe2();
1862
  ?>
subscribe2/subscribe2.pot CHANGED
@@ -1,464 +1,368 @@
1
- # SOME DESCRIPTIVE TITLE.
2
- # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
- # This file is distributed under the same license as the PACKAGE package.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
  #
6
  #, fuzzy
7
  msgid ""
8
  msgstr ""
9
- "Project-Id-Version: PACKAGE VERSION\n"
10
- "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2007-03-19 19:24+0000\n"
12
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
  "MIME-Version: 1.0\n"
16
  "Content-Type: text/plain; charset=CHARSET\n"
17
  "Content-Transfer-Encoding: 8bit\n"
18
 
19
- #: subscribe2.php:103
20
  msgid "To manage your subscription options please "
21
  msgstr ""
22
 
23
- #: subscribe2.php:105 subscribe2.php:107
24
  msgid "You may manage your subscription options from your "
25
  msgstr ""
26
 
27
- #: subscribe2.php:109
28
  msgid "A confirmation message is on its way!"
29
  msgstr ""
30
 
31
- #: subscribe2.php:111
32
  msgid "That email address is already subscribed."
33
  msgstr ""
34
 
35
- #: subscribe2.php:113
36
  msgid "That email address is not subscribed."
37
  msgstr ""
38
 
39
- #: subscribe2.php:115
40
  msgid "Sorry, but that does not look like an email address to me."
41
  msgstr ""
42
 
43
- #: subscribe2.php:117
44
  msgid ""
45
  "Sorry, email addresses at that domain are currently barred due to spam, "
46
  "please use an alternative email address."
47
  msgstr ""
48
 
49
- #: subscribe2.php:119
50
  msgid "Message sent!"
51
  msgstr ""
52
 
53
- #: subscribe2.php:121
54
  msgid "Your email:"
55
  msgstr ""
56
 
57
- #: subscribe2.php:121 subscribe2.php:1185 subscribe2.php:1277
58
  msgid "Subscribe"
59
  msgstr ""
60
 
61
- #: subscribe2.php:121 subscribe2.php:1278
62
  msgid "Unsubscribe"
63
  msgstr ""
64
 
65
- #: subscribe2.php:121 subscribe2.php:1659
66
  msgid "Send"
67
  msgstr ""
68
 
69
- #: subscribe2.php:124
70
  msgid "No such email address is registered."
71
  msgstr ""
72
 
73
- #: subscribe2.php:126
74
  msgid "You have successfully subscribed!"
75
  msgstr ""
76
 
77
- #: subscribe2.php:128
78
  msgid "You have successfully unsubscribed."
79
  msgstr ""
80
 
81
- #: subscribe2.php:130
82
  msgid "Please confirm your request"
83
  msgstr ""
84
 
85
- #: subscribe2.php:132
86
- msgid "Subscription Reminder"
87
- msgstr ""
88
-
89
- #: subscribe2.php:134
90
- msgid "subscribe"
91
- msgstr ""
92
-
93
- #: subscribe2.php:136
94
- msgid "unsubscribe"
95
- msgstr ""
96
-
97
- #: subscribe2.php:139
98
  msgid "Options saved!"
99
  msgstr ""
100
 
101
- #: subscribe2.php:140
102
  msgid "Options reset!"
103
  msgstr ""
104
 
105
- #: subscribe2.php:148 subscribe2.php:1190
106
  msgid "Subscribers"
107
  msgstr ""
108
 
109
- #: subscribe2.php:149
110
  msgid "Subscribe2 Options"
111
  msgstr ""
112
 
113
- #: subscribe2.php:149
114
  msgid "Subscribe2"
115
  msgstr ""
116
 
117
- #: subscribe2.php:151 subscribe2.php:153
118
  msgid "Subscriptions"
119
  msgstr ""
120
 
121
- #: subscribe2.php:155
122
  msgid "Mail Subscribers"
123
  msgstr ""
124
 
125
- #: subscribe2.php:178
126
- msgid "Once Weekly"
127
  msgstr ""
128
 
129
- #: subscribe2.php:780
130
  msgid "New subscriber"
131
  msgstr ""
132
 
133
- #: subscribe2.php:781
134
  msgid "subscribed to email notifications!"
135
  msgstr ""
136
 
137
- #: subscribe2.php:1098
138
  msgid "Address(es) subscribed!"
139
  msgstr ""
140
 
141
- #: subscribe2.php:1101
142
  msgid "deleted!"
143
  msgstr ""
144
 
145
- #: subscribe2.php:1104
146
  msgid "status changed!"
147
  msgstr ""
148
 
149
- #: subscribe2.php:1107
150
  msgid "Reminder Email(s) Sent!"
151
  msgstr ""
152
 
153
- #: subscribe2.php:1110
154
- msgid "CSV File Created in wp-content"
155
- msgstr ""
156
-
157
- #: subscribe2.php:1113
158
  msgid "Registered Users Subscribed!"
159
  msgstr ""
160
 
161
- #: subscribe2.php:1116
162
  msgid "Registered Users Unsubscribed!"
163
  msgstr ""
164
 
165
- #: subscribe2.php:1178
 
 
 
 
166
  msgid "Subscribe Addresses"
167
  msgstr ""
168
 
169
- #: subscribe2.php:1183
170
  msgid "Enter addresses, one per line or comma-seperated"
171
  msgstr ""
172
 
173
- #: subscribe2.php:1192
174
  msgid "Filter"
175
  msgstr ""
176
 
177
- #: subscribe2.php:1196
178
  msgid ""
179
  "Registered on the left, confirmed in the middle, unconfirmed on the right"
180
  msgstr ""
181
 
182
- #: subscribe2.php:1205
183
- msgid "Save Emails to CSV File"
184
- msgstr ""
185
-
186
- #: subscribe2.php:1251
187
  msgid "NONE"
188
  msgstr ""
189
 
190
- #: subscribe2.php:1261
191
- msgid "Send Reminder Email"
192
- msgstr ""
193
-
194
- #: subscribe2.php:1268
195
  msgid "Categories"
196
  msgstr ""
197
 
198
- #: subscribe2.php:1269
199
- msgid ""
200
- "Existing Registered Users can be automatically (un)subscribed to categories "
201
- "using this section."
202
- msgstr ""
203
-
204
- #: subscribe2.php:1270
205
- msgid "Consider User Privacy as changes cannot be undone"
206
- msgstr ""
207
-
208
- #: subscribe2.php:1369
209
  msgid "Delivery Options"
210
  msgstr ""
211
 
212
- #: subscribe2.php:1370
213
  msgid "Send Email From"
214
  msgstr ""
215
 
216
- #: subscribe2.php:1375
217
  msgid "Author of the post"
218
  msgstr ""
219
 
220
- #: subscribe2.php:1380
221
  msgid "Blog Admin"
222
  msgstr ""
223
 
224
- #: subscribe2.php:1382
225
- msgid "Send Email as Digest"
226
- msgstr ""
227
-
228
- #: subscribe2.php:1386
229
  msgid "Email Templates"
230
  msgstr ""
231
 
232
- #: subscribe2.php:1389
233
  msgid "New Post email (must not be empty)"
234
  msgstr ""
235
 
236
- #: subscribe2.php:1393
237
  msgid "Message substitions"
238
  msgstr ""
239
 
240
- #: subscribe2.php:1397
241
  msgid "the post's title"
242
  msgstr ""
243
 
244
- #: subscribe2.php:1398
245
  msgid ""
246
  "the excerpt or the entire post<br />(<i>based on the subscriber's "
247
  "preferences</i>)"
248
  msgstr ""
249
 
250
- #: subscribe2.php:1399
251
  msgid "the post's permalink"
252
  msgstr ""
253
 
254
- #: subscribe2.php:1400
255
  msgid "the admin or post author's name"
256
  msgstr ""
257
 
258
- #: subscribe2.php:1401
259
  msgid "the admin or post author's email"
260
  msgstr ""
261
 
262
- #: subscribe2.php:1402
263
- msgid "the post author's name"
264
- msgstr ""
265
-
266
- #: subscribe2.php:1403
267
  msgid ""
268
  "the generated link to confirm a request<br />(<i>only used in the "
269
  "confirmation email template</i>)"
270
  msgstr ""
271
 
272
- #: subscribe2.php:1404
273
- msgid ""
274
- "Action performed by LINK in confirmation email<br />(<i>only used in the "
275
- "confirmation email template</i>)"
276
- msgstr ""
277
-
278
- #: subscribe2.php:1406
279
  msgid "Subscribe / Unsubscribe confirmation email"
280
  msgstr ""
281
 
282
- #: subscribe2.php:1409
283
  msgid "Reminder email to Unconfirmed Subscribers"
284
  msgstr ""
285
 
286
- #: subscribe2.php:1414
287
  msgid "Excluded Categories"
288
  msgstr ""
289
 
290
- #: subscribe2.php:1420
291
  msgid "Allow registered users to subscribe to excluded categories?"
292
  msgstr ""
293
 
294
- #: subscribe2.php:1421
295
  msgid "Writing Options"
296
  msgstr ""
297
 
298
- #: subscribe2.php:1426
299
  msgid "Show the Subscribe2 button on the Write toolbar?"
300
  msgstr ""
301
 
302
- #: subscribe2.php:1429
303
- msgid "Auto Subscribe"
304
- msgstr ""
305
-
306
- #: subscribe2.php:1430
307
- msgid "Automatically subscribe new users registering with your blog."
308
- msgstr ""
309
-
310
- #: subscribe2.php:1435
311
- msgid "Yes"
312
- msgstr ""
313
-
314
- #: subscribe2.php:1440
315
- msgid "No"
316
- msgstr ""
317
-
318
- #: subscribe2.php:1441
319
- msgid "Auto-subscribe users to receive email as"
320
- msgstr ""
321
-
322
- #: subscribe2.php:1446 subscribe2.php:1556
323
- msgid "HTML"
324
- msgstr ""
325
-
326
- #: subscribe2.php:1451
327
- msgid "Plain Text - Full"
328
- msgstr ""
329
-
330
- #: subscribe2.php:1456
331
- msgid "Plain Text - Excerpt"
332
- msgstr ""
333
-
334
- #: subscribe2.php:1459
335
  msgid "Barred Domains"
336
  msgstr ""
337
 
338
- #: subscribe2.php:1460
339
  msgid ""
340
  "Enter domains to bar from public subscriptions: <br /> (Use a new line for "
341
  "each entry and omit the \"@\" symbol, for example email.com)"
342
  msgstr ""
343
 
344
- #: subscribe2.php:1464
345
  msgid "Submit"
346
  msgstr ""
347
 
348
- #: subscribe2.php:1469
349
  msgid "Reset Default"
350
  msgstr ""
351
 
352
- #: subscribe2.php:1470
353
  msgid ""
354
  "Use this to reset all options to their defaults. This <strong><em>will not</"
355
  "em></strong> modify your list of subscribers."
356
  msgstr ""
357
 
358
- #: subscribe2.php:1477
359
  msgid "RESET"
360
  msgstr ""
361
 
362
- #: subscribe2.php:1497
363
- msgid "Subscription preferences updated."
364
- msgstr ""
365
-
366
- #: subscribe2.php:1544
367
  msgid "Notification Settings"
368
  msgstr ""
369
 
370
- #: subscribe2.php:1551
371
  msgid "Receive email as"
372
  msgstr ""
373
 
374
- #: subscribe2.php:1561
 
 
 
 
375
  msgid "Plain Text"
376
  msgstr ""
377
 
378
- #: subscribe2.php:1563
379
  msgid "Email contains"
380
  msgstr ""
381
 
382
- #: subscribe2.php:1564
383
  msgid "Excerpt Only"
384
  msgstr ""
385
 
386
- #: subscribe2.php:1564
387
  msgid "Full Post"
388
  msgstr ""
389
 
390
- #: subscribe2.php:1572
391
- msgid "Note: HTML format will always deliver the full post."
392
- msgstr ""
393
-
394
- #: subscribe2.php:1573
395
- msgid "Automatically subscribe me to newly created categories"
396
- msgstr ""
397
-
398
- #: subscribe2.php:1585
399
  msgid "Subscribed Categories"
400
  msgstr ""
401
 
402
- #: subscribe2.php:1590
403
  msgid "Receive daily summary of new posts?"
404
  msgstr ""
405
 
406
- #: subscribe2.php:1603
407
  msgid "Update Preferences &raquo;"
408
  msgstr ""
409
 
410
- #: subscribe2.php:1648
411
  msgid "Send email to all subscribers"
412
  msgstr ""
413
 
414
- #: subscribe2.php:1653
415
  msgid "Subject"
416
  msgstr ""
417
 
418
- #: subscribe2.php:1653
419
  msgid "A message from "
420
  msgstr ""
421
 
422
- #: subscribe2.php:1656
423
  msgid "Recipients: "
424
  msgstr ""
425
 
426
- #: subscribe2.php:1716
427
- msgid "Select / Unselect All"
428
- msgstr ""
429
-
430
- #: subscribe2.php:1729
431
  msgid "All Subscribers"
432
  msgstr ""
433
 
434
- #: subscribe2.php:1730
435
  msgid "Public Subscribers"
436
  msgstr ""
437
 
438
- #: subscribe2.php:1731
439
  msgid "Confirmed"
440
  msgstr ""
441
 
442
- #: subscribe2.php:1732
443
  msgid "Unconfirmed"
444
  msgstr ""
445
 
446
- #: subscribe2.php:1733
447
  msgid "Registered Subscribers"
448
  msgstr ""
449
 
450
- #: subscribe2.php:1789
451
- msgid "Per Post Email"
452
- msgstr ""
453
-
454
- #: subscribe2.php:1806
455
- msgid "Next email notification will be sent"
456
- msgstr ""
457
-
458
- #: subscribe2.php:1906
459
  msgid "Subscription Confirmation"
460
  msgstr ""
461
 
462
- #: subscribe2.php:1992
463
- msgid "Digest Email"
464
  msgstr ""
1
+ # Subscribe2 WordPress Plugin.
2
+ # Copyright (C) 2006 Matthew Robinson
3
+ # This file is distributed under the same license as the Subscribe2 package.
4
+ # Matthew Robinson <admin@prescriber.org.uk>, 2006.
5
  #
6
  #, fuzzy
7
  msgid ""
8
  msgstr ""
9
+ "Project-Id-Version: 2.2.6\n"
10
+ "Report-Msgid-Bugs-To: admin@prescriber.org.uk\n"
11
+ "POT-Creation-Date: 2006-10-19 19:12+0100\n"
12
+ "PO-Revision-Date: 2006-10-19 19:14+0\n"
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
  "MIME-Version: 1.0\n"
16
  "Content-Type: text/plain; charset=CHARSET\n"
17
  "Content-Transfer-Encoding: 8bit\n"
18
 
19
+ #: subscribe2.php:61
20
  msgid "To manage your subscription options please "
21
  msgstr ""
22
 
23
+ #: subscribe2.php:63
24
  msgid "You may manage your subscription options from your "
25
  msgstr ""
26
 
27
+ #: subscribe2.php:65
28
  msgid "A confirmation message is on its way!"
29
  msgstr ""
30
 
31
+ #: subscribe2.php:67
32
  msgid "That email address is already subscribed."
33
  msgstr ""
34
 
35
+ #: subscribe2.php:69
36
  msgid "That email address is not subscribed."
37
  msgstr ""
38
 
39
+ #: subscribe2.php:71
40
  msgid "Sorry, but that does not look like an email address to me."
41
  msgstr ""
42
 
43
+ #: subscribe2.php:73
44
  msgid ""
45
  "Sorry, email addresses at that domain are currently barred due to spam, "
46
  "please use an alternative email address."
47
  msgstr ""
48
 
49
+ #: subscribe2.php:75
50
  msgid "Message sent!"
51
  msgstr ""
52
 
53
+ #: subscribe2.php:77
54
  msgid "Your email:"
55
  msgstr ""
56
 
57
+ #: subscribe2.php:77 subscribe2.php:1075 subscribe2.php:1125
58
  msgid "Subscribe"
59
  msgstr ""
60
 
61
+ #: subscribe2.php:77 subscribe2.php:1126
62
  msgid "Unsubscribe"
63
  msgstr ""
64
 
65
+ #: subscribe2.php:77 subscribe2.php:1425
66
  msgid "Send"
67
  msgstr ""
68
 
69
+ #: subscribe2.php:80
70
  msgid "No such email address is registered."
71
  msgstr ""
72
 
73
+ #: subscribe2.php:82
74
  msgid "You have successfully subscribed!"
75
  msgstr ""
76
 
77
+ #: subscribe2.php:84
78
  msgid "You have successfully unsubscribed."
79
  msgstr ""
80
 
81
+ #: subscribe2.php:86
82
  msgid "Please confirm your request"
83
  msgstr ""
84
 
85
+ #: subscribe2.php:89
 
 
 
 
 
 
 
 
 
 
 
 
86
  msgid "Options saved!"
87
  msgstr ""
88
 
89
+ #: subscribe2.php:90
90
  msgid "Options reset!"
91
  msgstr ""
92
 
93
+ #: subscribe2.php:98 subscribe2.php:1080
94
  msgid "Subscribers"
95
  msgstr ""
96
 
97
+ #: subscribe2.php:99
98
  msgid "Subscribe2 Options"
99
  msgstr ""
100
 
101
+ #: subscribe2.php:99
102
  msgid "Subscribe2"
103
  msgstr ""
104
 
105
+ #: subscribe2.php:100
106
  msgid "Subscriptions"
107
  msgstr ""
108
 
109
+ #: subscribe2.php:101
110
  msgid "Mail Subscribers"
111
  msgstr ""
112
 
113
+ #: subscribe2.php:504
114
+ msgid "Subscription Reminder"
115
  msgstr ""
116
 
117
+ #: subscribe2.php:720
118
  msgid "New subscriber"
119
  msgstr ""
120
 
121
+ #: subscribe2.php:721
122
  msgid "subscribed to email notifications!"
123
  msgstr ""
124
 
125
+ #: subscribe2.php:990
126
  msgid "Address(es) subscribed!"
127
  msgstr ""
128
 
129
+ #: subscribe2.php:993
130
  msgid "deleted!"
131
  msgstr ""
132
 
133
+ #: subscribe2.php:996
134
  msgid "status changed!"
135
  msgstr ""
136
 
137
+ #: subscribe2.php:999
138
  msgid "Reminder Email(s) Sent!"
139
  msgstr ""
140
 
141
+ #: subscribe2.php:1002
 
 
 
 
142
  msgid "Registered Users Subscribed!"
143
  msgstr ""
144
 
145
+ #: subscribe2.php:1005
146
  msgid "Registered Users Unsubscribed!"
147
  msgstr ""
148
 
149
+ #: subscribe2.php:1031
150
+ msgid "Send Reminder Email"
151
+ msgstr ""
152
+
153
+ #: subscribe2.php:1071
154
  msgid "Subscribe Addresses"
155
  msgstr ""
156
 
157
+ #: subscribe2.php:1073
158
  msgid "Enter addresses, one per line or comma-seperated"
159
  msgstr ""
160
 
161
+ #: subscribe2.php:1082
162
  msgid "Filter"
163
  msgstr ""
164
 
165
+ #: subscribe2.php:1086
166
  msgid ""
167
  "Registered on the left, confirmed in the middle, unconfirmed on the right"
168
  msgstr ""
169
 
170
+ #: subscribe2.php:1112
 
 
 
 
171
  msgid "NONE"
172
  msgstr ""
173
 
174
+ #: subscribe2.php:1120
 
 
 
 
175
  msgid "Categories"
176
  msgstr ""
177
 
178
+ #: subscribe2.php:1195
 
 
 
 
 
 
 
 
 
 
179
  msgid "Delivery Options"
180
  msgstr ""
181
 
182
+ #: subscribe2.php:1196
183
  msgid "Send Email From"
184
  msgstr ""
185
 
186
+ #: subscribe2.php:1201
187
  msgid "Author of the post"
188
  msgstr ""
189
 
190
+ #: subscribe2.php:1206
191
  msgid "Blog Admin"
192
  msgstr ""
193
 
194
+ #: subscribe2.php:1207
 
 
 
 
195
  msgid "Email Templates"
196
  msgstr ""
197
 
198
+ #: subscribe2.php:1210
199
  msgid "New Post email (must not be empty)"
200
  msgstr ""
201
 
202
+ #: subscribe2.php:1214
203
  msgid "Message substitions"
204
  msgstr ""
205
 
206
+ #: subscribe2.php:1218
207
  msgid "the post's title"
208
  msgstr ""
209
 
210
+ #: subscribe2.php:1219
211
  msgid ""
212
  "the excerpt or the entire post<br />(<i>based on the subscriber's "
213
  "preferences</i>)"
214
  msgstr ""
215
 
216
+ #: subscribe2.php:1220
217
  msgid "the post's permalink"
218
  msgstr ""
219
 
220
+ #: subscribe2.php:1221
221
  msgid "the admin or post author's name"
222
  msgstr ""
223
 
224
+ #: subscribe2.php:1222
225
  msgid "the admin or post author's email"
226
  msgstr ""
227
 
228
+ #: subscribe2.php:1223
 
 
 
 
229
  msgid ""
230
  "the generated link to confirm a request<br />(<i>only used in the "
231
  "confirmation email template</i>)"
232
  msgstr ""
233
 
234
+ #: subscribe2.php:1225
 
 
 
 
 
 
235
  msgid "Subscribe / Unsubscribe confirmation email"
236
  msgstr ""
237
 
238
+ #: subscribe2.php:1228
239
  msgid "Reminder email to Unconfirmed Subscribers"
240
  msgstr ""
241
 
242
+ #: subscribe2.php:1233
243
  msgid "Excluded Categories"
244
  msgstr ""
245
 
246
+ #: subscribe2.php:1240
247
  msgid "Allow registered users to subscribe to excluded categories?"
248
  msgstr ""
249
 
250
+ #: subscribe2.php:1241
251
  msgid "Writing Options"
252
  msgstr ""
253
 
254
+ #: subscribe2.php:1246
255
  msgid "Show the Subscribe2 button on the Write toolbar?"
256
  msgstr ""
257
 
258
+ #: subscribe2.php:1249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  msgid "Barred Domains"
260
  msgstr ""
261
 
262
+ #: subscribe2.php:1250
263
  msgid ""
264
  "Enter domains to bar from public subscriptions: <br /> (Use a new line for "
265
  "each entry and omit the \"@\" symbol, for example email.com)"
266
  msgstr ""
267
 
268
+ #: subscribe2.php:1254
269
  msgid "Submit"
270
  msgstr ""
271
 
272
+ #: subscribe2.php:1259
273
  msgid "Reset Default"
274
  msgstr ""
275
 
276
+ #: subscribe2.php:1260
277
  msgid ""
278
  "Use this to reset all options to their defaults. This <strong><em>will not</"
279
  "em></strong> modify your list of subscribers."
280
  msgstr ""
281
 
282
+ #: subscribe2.php:1264
283
  msgid "RESET"
284
  msgstr ""
285
 
286
+ #: subscribe2.php:1328
 
 
 
 
287
  msgid "Notification Settings"
288
  msgstr ""
289
 
290
+ #: subscribe2.php:1332
291
  msgid "Receive email as"
292
  msgstr ""
293
 
294
+ #: subscribe2.php:1337
295
+ msgid "HTML"
296
+ msgstr ""
297
+
298
+ #: subscribe2.php:1342
299
  msgid "Plain Text"
300
  msgstr ""
301
 
302
+ #: subscribe2.php:1344
303
  msgid "Email contains"
304
  msgstr ""
305
 
306
+ #: subscribe2.php:1345
307
  msgid "Excerpt Only"
308
  msgstr ""
309
 
310
+ #: subscribe2.php:1345
311
  msgid "Full Post"
312
  msgstr ""
313
 
314
+ #: subscribe2.php:1356
 
 
 
 
 
 
 
 
315
  msgid "Subscribed Categories"
316
  msgstr ""
317
 
318
+ #: subscribe2.php:1361
319
  msgid "Receive daily summary of new posts?"
320
  msgstr ""
321
 
322
+ #: subscribe2.php:1374
323
  msgid "Update Preferences &raquo;"
324
  msgstr ""
325
 
326
+ #: subscribe2.php:1417
327
  msgid "Send email to all subscribers"
328
  msgstr ""
329
 
330
+ #: subscribe2.php:1419
331
  msgid "Subject"
332
  msgstr ""
333
 
334
+ #: subscribe2.php:1419
335
  msgid "A message from "
336
  msgstr ""
337
 
338
+ #: subscribe2.php:1422
339
  msgid "Recipients: "
340
  msgstr ""
341
 
342
+ #: subscribe2.php:1492
 
 
 
 
343
  msgid "All Subscribers"
344
  msgstr ""
345
 
346
+ #: subscribe2.php:1493
347
  msgid "Public Subscribers"
348
  msgstr ""
349
 
350
+ #: subscribe2.php:1494
351
  msgid "Confirmed"
352
  msgstr ""
353
 
354
+ #: subscribe2.php:1495
355
  msgid "Unconfirmed"
356
  msgstr ""
357
 
358
+ #: subscribe2.php:1496
359
  msgid "Registered Subscribers"
360
  msgstr ""
361
 
362
+ #: subscribe2.php:1640
 
 
 
 
 
 
 
 
363
  msgid "Subscription Confirmation"
364
  msgstr ""
365
 
366
+ #: subscribe2.php:1744
367
+ msgid "Daily Digest"
368
  msgstr ""